{"version":3,"sources":["loader.js","@ember/-internals/browser-environment/index.js","@ember/-internals/browser-environment/lib/has-dom.js","@ember/-internals/console/index.js","@ember/-internals/container/index.js","@ember/-internals/container/lib/container.js","@ember/-internals/container/lib/registry.js","@ember/-internals/container/tests/container_test.js","@ember/-internals/container/tests/owner_test.js","@ember/-internals/container/tests/registry_test.js","@ember/-internals/environment/index.js","@ember/-internals/environment/lib/context.js","@ember/-internals/environment/lib/env.js","@ember/-internals/environment/lib/global.js","@ember/-internals/error-handling/index.js","@ember/-internals/extension-support/index.js","@ember/-internals/extension-support/lib/container_debug_adapter.js","@ember/-internals/extension-support/lib/data_adapter.js","@ember/-internals/extension-support/tests/container_debug_adapter_test.js","@ember/-internals/extension-support/tests/data_adapter_test.js","@ember/-internals/glimmer/index.js","@ember/-internals/glimmer/lib/compile-time-lookup.js","@ember/-internals/glimmer/lib/component-managers/abstract.js","@ember/-internals/glimmer/lib/component-managers/curly.js","@ember/-internals/glimmer/lib/component-managers/custom.js","@ember/-internals/glimmer/lib/component-managers/definition-state.js","@ember/-internals/glimmer/lib/component-managers/mount.js","@ember/-internals/glimmer/lib/component-managers/outlet.js","@ember/-internals/glimmer/lib/component-managers/root.js","@ember/-internals/glimmer/lib/component-managers/template-only.js","@ember/-internals/glimmer/lib/component.js","@ember/-internals/glimmer/lib/components/checkbox.js","@ember/-internals/glimmer/lib/components/link-to.js","@ember/-internals/glimmer/lib/components/text_area.js","@ember/-internals/glimmer/lib/components/text_field.js","@ember/-internals/glimmer/lib/dom.js","@ember/-internals/glimmer/lib/environment.js","@ember/-internals/glimmer/lib/helper.js","@ember/-internals/glimmer/lib/helpers/-assert-implicit-component-helper-argument.js","@ember/-internals/glimmer/lib/helpers/-class.js","@ember/-internals/glimmer/lib/helpers/-html-safe.js","@ember/-internals/glimmer/lib/helpers/-input-type.js","@ember/-internals/glimmer/lib/helpers/-normalize-class.js","@ember/-internals/glimmer/lib/helpers/action.js","@ember/-internals/glimmer/lib/helpers/component.js","@ember/-internals/glimmer/lib/helpers/concat.js","@ember/-internals/glimmer/lib/helpers/each-in.js","@ember/-internals/glimmer/lib/helpers/get.js","@ember/-internals/glimmer/lib/helpers/hash.js","@ember/-internals/glimmer/lib/helpers/if-unless.js","@ember/-internals/glimmer/lib/helpers/loc.js","@ember/-internals/glimmer/lib/helpers/log.js","@ember/-internals/glimmer/lib/helpers/mut.js","@ember/-internals/glimmer/lib/helpers/query-param.js","@ember/-internals/glimmer/lib/helpers/readonly.js","@ember/-internals/glimmer/lib/helpers/unbound.js","@ember/-internals/glimmer/lib/modifiers/action.js","@ember/-internals/glimmer/lib/protocol-for-url.js","@ember/-internals/glimmer/lib/renderer.js","@ember/-internals/glimmer/lib/resolver.js","@ember/-internals/glimmer/lib/setup-registry.js","@ember/-internals/glimmer/lib/syntax.js","@ember/-internals/glimmer/lib/syntax/-text-area.js","@ember/-internals/glimmer/lib/syntax/input.js","@ember/-internals/glimmer/lib/syntax/let.js","@ember/-internals/glimmer/lib/syntax/mount.js","@ember/-internals/glimmer/lib/syntax/outlet.js","@ember/-internals/glimmer/lib/syntax/utils.js","@ember/-internals/glimmer/lib/template-compiler.js","@ember/-internals/glimmer/lib/template.js","@ember/-internals/glimmer/lib/template_registry.js","@ember/-internals/glimmer/lib/templates/component.js","@ember/-internals/glimmer/lib/templates/empty.js","@ember/-internals/glimmer/lib/templates/link-to.js","@ember/-internals/glimmer/lib/templates/outlet.js","@ember/-internals/glimmer/lib/templates/root.js","@ember/-internals/glimmer/lib/utils/bindings.js","@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.js","@ember/-internals/glimmer/lib/utils/custom-component-manager.js","@ember/-internals/glimmer/lib/utils/debug-stack.js","@ember/-internals/glimmer/lib/utils/iterable.js","@ember/-internals/glimmer/lib/utils/outlet.js","@ember/-internals/glimmer/lib/utils/process-args.js","@ember/-internals/glimmer/lib/utils/references.js","@ember/-internals/glimmer/lib/utils/serialization-first-node-helpers.js","@ember/-internals/glimmer/lib/utils/string.js","@ember/-internals/glimmer/lib/utils/to-bool.js","@ember/-internals/glimmer/lib/views/outlet.js","@ember/-internals/glimmer/tests/integration/application/actions-test.js","@ember/-internals/glimmer/tests/integration/application/engine-test.js","@ember/-internals/glimmer/tests/integration/application/hot-reload-test.js","@ember/-internals/glimmer/tests/integration/application/rendering-test.js","@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js","@ember/-internals/glimmer/tests/integration/components/append-test.js","@ember/-internals/glimmer/tests/integration/components/attribute-bindings-test.js","@ember/-internals/glimmer/tests/integration/components/attrs-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/class-bindings-test.js","@ember/-internals/glimmer/tests/integration/components/contextual-components-test.js","@ember/-internals/glimmer/tests/integration/components/curly-components-test.js","@ember/-internals/glimmer/tests/integration/components/destroy-test.js","@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js","@ember/-internals/glimmer/tests/integration/components/error-handling-test.js","@ember/-internals/glimmer/tests/integration/components/fragment-components-test.js","@ember/-internals/glimmer/tests/integration/components/instrumentation-compile-test.js","@ember/-internals/glimmer/tests/integration/components/instrumentation-test.js","@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js","@ember/-internals/glimmer/tests/integration/components/link-to-test.js","@ember/-internals/glimmer/tests/integration/components/local-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/namespaced-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/render-to-element-test.js","@ember/-internals/glimmer/tests/integration/components/target-action-test.js","@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js","@ember/-internals/glimmer/tests/integration/components/to-string-test.js","@ember/-internals/glimmer/tests/integration/components/utils-test.js","@ember/-internals/glimmer/tests/integration/components/web-component-fallback-test.js","@ember/-internals/glimmer/tests/integration/components/will-destroy-element-hook-test.js","@ember/-internals/glimmer/tests/integration/content-test.js","@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js","@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js","@ember/-internals/glimmer/tests/integration/helpers/-class-test.js","@ember/-internals/glimmer/tests/integration/helpers/closure-action-test.js","@ember/-internals/glimmer/tests/integration/helpers/concat-test.js","@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js","@ember/-internals/glimmer/tests/integration/helpers/element-action-test.js","@ember/-internals/glimmer/tests/integration/helpers/get-test.js","@ember/-internals/glimmer/tests/integration/helpers/hash-test.js","@ember/-internals/glimmer/tests/integration/helpers/if-unless-test.js","@ember/-internals/glimmer/tests/integration/helpers/input-test.js","@ember/-internals/glimmer/tests/integration/helpers/loc-test.js","@ember/-internals/glimmer/tests/integration/helpers/log-test.js","@ember/-internals/glimmer/tests/integration/helpers/mut-test.js","@ember/-internals/glimmer/tests/integration/helpers/partial-test.js","@ember/-internals/glimmer/tests/integration/helpers/readonly-test.js","@ember/-internals/glimmer/tests/integration/helpers/text-area-test.js","@ember/-internals/glimmer/tests/integration/helpers/unbound-test.js","@ember/-internals/glimmer/tests/integration/helpers/yield-test.js","@ember/-internals/glimmer/tests/integration/input-test.js","@ember/-internals/glimmer/tests/integration/mount-test.js","@ember/-internals/glimmer/tests/integration/outlet-test.js","@ember/-internals/glimmer/tests/integration/refinements-test.js","@ember/-internals/glimmer/tests/integration/render-settled-test.js","@ember/-internals/glimmer/tests/integration/svg-test.js","@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js","@ember/-internals/glimmer/tests/integration/syntax/each-test.js","@ember/-internals/glimmer/tests/integration/syntax/experimental-syntax-test.js","@ember/-internals/glimmer/tests/integration/syntax/if-unless-test.js","@ember/-internals/glimmer/tests/integration/syntax/in-element-test.js","@ember/-internals/glimmer/tests/integration/syntax/let-test.js","@ember/-internals/glimmer/tests/integration/syntax/with-dynamic-var-test.js","@ember/-internals/glimmer/tests/integration/syntax/with-test.js","@ember/-internals/glimmer/tests/unit/outlet-test.js","@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js","@ember/-internals/glimmer/tests/unit/template-factory-test.js","@ember/-internals/glimmer/tests/unit/utils/debug-stack-test.js","@ember/-internals/glimmer/tests/utils/abstract-test-case.js","@ember/-internals/glimmer/tests/utils/helpers.js","@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js","@ember/-internals/glimmer/tests/utils/string-test.js","@ember/-internals/glimmer/tests/utils/test-case.js","@ember/-internals/glimmer/tests/utils/test-helpers.js","@ember/-internals/meta/index.js","@ember/-internals/meta/lib/meta.js","@ember/-internals/meta/tests/listeners_test.js","@ember/-internals/meta/tests/meta_test.js","@ember/-internals/metal/index.js","@ember/-internals/metal/lib/alias.js","@ember/-internals/metal/lib/array.js","@ember/-internals/metal/lib/array_events.js","@ember/-internals/metal/lib/chains.js","@ember/-internals/metal/lib/change_event.js","@ember/-internals/metal/lib/computed.js","@ember/-internals/metal/lib/computed_cache.js","@ember/-internals/metal/lib/dependent_keys.js","@ember/-internals/metal/lib/deprecate_property.js","@ember/-internals/metal/lib/descriptor.js","@ember/-internals/metal/lib/each_proxy.js","@ember/-internals/metal/lib/each_proxy_events.js","@ember/-internals/metal/lib/events.js","@ember/-internals/metal/lib/expand_properties.js","@ember/-internals/metal/lib/get_properties.js","@ember/-internals/metal/lib/injected_property.js","@ember/-internals/metal/lib/is_blank.js","@ember/-internals/metal/lib/is_empty.js","@ember/-internals/metal/lib/is_none.js","@ember/-internals/metal/lib/is_present.js","@ember/-internals/metal/lib/libraries.js","@ember/-internals/metal/lib/mixin.js","@ember/-internals/metal/lib/namespace_search.js","@ember/-internals/metal/lib/observer.js","@ember/-internals/metal/lib/observer_set.js","@ember/-internals/metal/lib/path_cache.js","@ember/-internals/metal/lib/properties.js","@ember/-internals/metal/lib/property_events.js","@ember/-internals/metal/lib/property_get.js","@ember/-internals/metal/lib/property_set.js","@ember/-internals/metal/lib/set_properties.js","@ember/-internals/metal/lib/tags.js","@ember/-internals/metal/lib/tracked.js","@ember/-internals/metal/lib/transaction.js","@ember/-internals/metal/lib/watch_key.js","@ember/-internals/metal/lib/watch_path.js","@ember/-internals/metal/lib/watching.js","@ember/-internals/metal/tests/accessors/get_path_test.js","@ember/-internals/metal/tests/accessors/get_properties_test.js","@ember/-internals/metal/tests/accessors/get_test.js","@ember/-internals/metal/tests/accessors/mandatory_setters_test.js","@ember/-internals/metal/tests/accessors/set_path_test.js","@ember/-internals/metal/tests/accessors/set_test.js","@ember/-internals/metal/tests/alias_test.js","@ember/-internals/metal/tests/chains_test.js","@ember/-internals/metal/tests/computed_test.js","@ember/-internals/metal/tests/descriptor_test.js","@ember/-internals/metal/tests/events_test.js","@ember/-internals/metal/tests/expand_properties_test.js","@ember/-internals/metal/tests/injected_property_test.js","@ember/-internals/metal/tests/is_blank_test.js","@ember/-internals/metal/tests/is_empty_test.js","@ember/-internals/metal/tests/is_none_test.js","@ember/-internals/metal/tests/is_present_test.js","@ember/-internals/metal/tests/libraries_test.js","@ember/-internals/metal/tests/main_test.js","@ember/-internals/metal/tests/mixin/alias_method_test.js","@ember/-internals/metal/tests/mixin/apply_test.js","@ember/-internals/metal/tests/mixin/computed_test.js","@ember/-internals/metal/tests/mixin/concatenated_properties_test.js","@ember/-internals/metal/tests/mixin/detect_test.js","@ember/-internals/metal/tests/mixin/introspection_test.js","@ember/-internals/metal/tests/mixin/merged_properties_test.js","@ember/-internals/metal/tests/mixin/method_test.js","@ember/-internals/metal/tests/mixin/observer_test.js","@ember/-internals/metal/tests/mixin/reopen_test.js","@ember/-internals/metal/tests/mixin/without_test.js","@ember/-internals/metal/tests/namespace_search_test.js","@ember/-internals/metal/tests/observer_test.js","@ember/-internals/metal/tests/performance_test.js","@ember/-internals/metal/tests/properties_test.js","@ember/-internals/metal/tests/property_did_change_hook.js","@ember/-internals/metal/tests/property_events_test.js","@ember/-internals/metal/tests/set_properties_test.js","@ember/-internals/metal/tests/tracked/computed_test.js","@ember/-internals/metal/tests/tracked/get_test.js","@ember/-internals/metal/tests/tracked/set_test.js","@ember/-internals/metal/tests/tracked/support.js","@ember/-internals/metal/tests/tracked/validation_test.js","@ember/-internals/metal/tests/watching/is_watching_test.js","@ember/-internals/metal/tests/watching/unwatch_test.js","@ember/-internals/metal/tests/watching/watch_test.js","@ember/-internals/owner/index.js","@ember/-internals/routing/index.js","@ember/-internals/routing/lib/ext/controller.js","@ember/-internals/routing/lib/location/api.js","@ember/-internals/routing/lib/location/auto_location.js","@ember/-internals/routing/lib/location/hash_location.js","@ember/-internals/routing/lib/location/history_location.js","@ember/-internals/routing/lib/location/none_location.js","@ember/-internals/routing/lib/location/util.js","@ember/-internals/routing/lib/services/router.js","@ember/-internals/routing/lib/services/routing.js","@ember/-internals/routing/lib/system/cache.js","@ember/-internals/routing/lib/system/controller_for.js","@ember/-internals/routing/lib/system/dsl.js","@ember/-internals/routing/lib/system/engines.js","@ember/-internals/routing/lib/system/generate_controller.js","@ember/-internals/routing/lib/system/query_params.js","@ember/-internals/routing/lib/system/route-info.js","@ember/-internals/routing/lib/system/route.js","@ember/-internals/routing/lib/system/router.js","@ember/-internals/routing/lib/system/router_state.js","@ember/-internals/routing/lib/system/transition.js","@ember/-internals/routing/lib/utils.js","@ember/-internals/routing/tests/ext/controller_test.js","@ember/-internals/routing/tests/location/auto_location_test.js","@ember/-internals/routing/tests/location/hash_location_test.js","@ember/-internals/routing/tests/location/history_location_test.js","@ember/-internals/routing/tests/location/none_location_test.js","@ember/-internals/routing/tests/location/util_test.js","@ember/-internals/routing/tests/system/cache_test.js","@ember/-internals/routing/tests/system/controller_for_test.js","@ember/-internals/routing/tests/system/dsl_test.js","@ember/-internals/routing/tests/system/route_test.js","@ember/-internals/routing/tests/system/router_test.js","@ember/-internals/routing/tests/utils_test.js","@ember/-internals/runtime/index.js","@ember/-internals/runtime/lib/compare.js","@ember/-internals/runtime/lib/copy.js","@ember/-internals/runtime/lib/ext/function.js","@ember/-internals/runtime/lib/ext/rsvp.js","@ember/-internals/runtime/lib/is-equal.js","@ember/-internals/runtime/lib/mixins/-proxy.js","@ember/-internals/runtime/lib/mixins/action_handler.js","@ember/-internals/runtime/lib/mixins/array.js","@ember/-internals/runtime/lib/mixins/comparable.js","@ember/-internals/runtime/lib/mixins/container_proxy.js","@ember/-internals/runtime/lib/mixins/copyable.js","@ember/-internals/runtime/lib/mixins/enumerable.js","@ember/-internals/runtime/lib/mixins/evented.js","@ember/-internals/runtime/lib/mixins/mutable_enumerable.js","@ember/-internals/runtime/lib/mixins/observable.js","@ember/-internals/runtime/lib/mixins/promise_proxy.js","@ember/-internals/runtime/lib/mixins/registry_proxy.js","@ember/-internals/runtime/lib/mixins/target_action_support.js","@ember/-internals/runtime/lib/system/array_proxy.js","@ember/-internals/runtime/lib/system/core_object.js","@ember/-internals/runtime/lib/system/namespace.js","@ember/-internals/runtime/lib/system/object.js","@ember/-internals/runtime/lib/system/object_proxy.js","@ember/-internals/runtime/lib/type-of.js","@ember/-internals/runtime/tests/array/any-test.js","@ember/-internals/runtime/tests/array/compact-test.js","@ember/-internals/runtime/tests/array/every-test.js","@ember/-internals/runtime/tests/array/filter-test.js","@ember/-internals/runtime/tests/array/find-test.js","@ember/-internals/runtime/tests/array/firstObject-test.js","@ember/-internals/runtime/tests/array/forEach-test.js","@ember/-internals/runtime/tests/array/includes-test.js","@ember/-internals/runtime/tests/array/indexOf-test.js","@ember/-internals/runtime/tests/array/invoke-test.js","@ember/-internals/runtime/tests/array/isAny-test.js","@ember/-internals/runtime/tests/array/lastIndexOf-test.js","@ember/-internals/runtime/tests/array/lastObject-test.js","@ember/-internals/runtime/tests/array/map-test.js","@ember/-internals/runtime/tests/array/mapBy-test.js","@ember/-internals/runtime/tests/array/objectAt-test.js","@ember/-internals/runtime/tests/array/reduce-test.js","@ember/-internals/runtime/tests/array/reject-test.js","@ember/-internals/runtime/tests/array/sortBy-test.js","@ember/-internals/runtime/tests/array/toArray-test.js","@ember/-internals/runtime/tests/array/uniq-test.js","@ember/-internals/runtime/tests/array/uniqBy-test.js","@ember/-internals/runtime/tests/array/without-test.js","@ember/-internals/runtime/tests/copyable-array/copy-test.js","@ember/-internals/runtime/tests/core/compare_test.js","@ember/-internals/runtime/tests/core/copy_test.js","@ember/-internals/runtime/tests/core/isEqual_test.js","@ember/-internals/runtime/tests/core/is_array_test.js","@ember/-internals/runtime/tests/core/is_empty_test.js","@ember/-internals/runtime/tests/core/type_of_test.js","@ember/-internals/runtime/tests/ext/function_test.js","@ember/-internals/runtime/tests/ext/rsvp_test.js","@ember/-internals/runtime/tests/helpers/array.js","@ember/-internals/runtime/tests/inject_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/chained_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/observable_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/propertyChanges_test.js","@ember/-internals/runtime/tests/legacy_1x/system/object/base_test.js","@ember/-internals/runtime/tests/legacy_1x/system/object/concatenated_test.js","@ember/-internals/runtime/tests/mixins/array_test.js","@ember/-internals/runtime/tests/mixins/comparable_test.js","@ember/-internals/runtime/tests/mixins/container_proxy_test.js","@ember/-internals/runtime/tests/mixins/enumerable_test.js","@ember/-internals/runtime/tests/mixins/evented_test.js","@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js","@ember/-internals/runtime/tests/mixins/observable_test.js","@ember/-internals/runtime/tests/mixins/promise_proxy_test.js","@ember/-internals/runtime/tests/mixins/target_action_support_test.js","@ember/-internals/runtime/tests/mutable-array/addObject-test.js","@ember/-internals/runtime/tests/mutable-array/clear-test.js","@ember/-internals/runtime/tests/mutable-array/insertAt-test.js","@ember/-internals/runtime/tests/mutable-array/popObject-test.js","@ember/-internals/runtime/tests/mutable-array/pushObject-test.js","@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js","@ember/-internals/runtime/tests/mutable-array/removeAt-test.js","@ember/-internals/runtime/tests/mutable-array/removeObject-test.js","@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js","@ember/-internals/runtime/tests/mutable-array/replace-test.js","@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js","@ember/-internals/runtime/tests/mutable-array/setObjects-test.js","@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js","@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js","@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js","@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test.js","@ember/-internals/runtime/tests/system/array_proxy/array_observer_test.js","@ember/-internals/runtime/tests/system/array_proxy/content_change_test.js","@ember/-internals/runtime/tests/system/array_proxy/length_test.js","@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test.js","@ember/-internals/runtime/tests/system/core_object_test.js","@ember/-internals/runtime/tests/system/namespace/base_test.js","@ember/-internals/runtime/tests/system/native_array/a_test.js","@ember/-internals/runtime/tests/system/native_array/copyable_suite_test.js","@ember/-internals/runtime/tests/system/native_array/replace_test.js","@ember/-internals/runtime/tests/system/object/computed_test.js","@ember/-internals/runtime/tests/system/object/create_test.js","@ember/-internals/runtime/tests/system/object/destroy_test.js","@ember/-internals/runtime/tests/system/object/detectInstance_test.js","@ember/-internals/runtime/tests/system/object/detect_test.js","@ember/-internals/runtime/tests/system/object/es-compatibility-test.js","@ember/-internals/runtime/tests/system/object/events_test.js","@ember/-internals/runtime/tests/system/object/extend_test.js","@ember/-internals/runtime/tests/system/object/observer_test.js","@ember/-internals/runtime/tests/system/object/reopenClass_test.js","@ember/-internals/runtime/tests/system/object/reopen_test.js","@ember/-internals/runtime/tests/system/object/strict-mode-test.js","@ember/-internals/runtime/tests/system/object/toString_test.js","@ember/-internals/runtime/tests/system/object_proxy_test.js","@ember/-internals/utils/index.js","@ember/-internals/utils/lib/cache.js","@ember/-internals/utils/lib/dictionary.js","@ember/-internals/utils/lib/guid.js","@ember/-internals/utils/lib/inspect.js","@ember/-internals/utils/lib/intern.js","@ember/-internals/utils/lib/invoke.js","@ember/-internals/utils/lib/is_proxy.js","@ember/-internals/utils/lib/lookup-descriptor.js","@ember/-internals/utils/lib/make-array.js","@ember/-internals/utils/lib/name.js","@ember/-internals/utils/lib/proxy-utils.js","@ember/-internals/utils/lib/spec.js","@ember/-internals/utils/lib/super.js","@ember/-internals/utils/lib/symbol-utils.js","@ember/-internals/utils/lib/symbol.js","@ember/-internals/utils/lib/to-string.js","@ember/-internals/utils/tests/cache_test.js","@ember/-internals/utils/tests/can_invoke_test.js","@ember/-internals/utils/tests/checkHasSuper_test.js","@ember/-internals/utils/tests/generate_guid_test.js","@ember/-internals/utils/tests/guid_for_test.js","@ember/-internals/utils/tests/inspect_test.js","@ember/-internals/utils/tests/is_proxy_test.js","@ember/-internals/utils/tests/make_array_test.js","@ember/-internals/utils/tests/to-string-test.js","@ember/-internals/utils/tests/try_invoke_test.js","@ember/-internals/views/index.js","@ember/-internals/views/lib/compat/attrs.js","@ember/-internals/views/lib/compat/fallback-view-registry.js","@ember/-internals/views/lib/component_lookup.js","@ember/-internals/views/lib/mixins/action_support.js","@ember/-internals/views/lib/mixins/child_views_support.js","@ember/-internals/views/lib/mixins/class_names_support.js","@ember/-internals/views/lib/mixins/text_support.js","@ember/-internals/views/lib/mixins/view_state_support.js","@ember/-internals/views/lib/mixins/view_support.js","@ember/-internals/views/lib/system/action_manager.js","@ember/-internals/views/lib/system/event_dispatcher.js","@ember/-internals/views/lib/system/jquery.js","@ember/-internals/views/lib/system/jquery_event_deprecation.js","@ember/-internals/views/lib/system/lookup_partial.js","@ember/-internals/views/lib/system/utils.js","@ember/-internals/views/lib/utils/lookup-component.js","@ember/-internals/views/lib/views/core_view.js","@ember/-internals/views/lib/views/states.js","@ember/-internals/views/lib/views/states/default.js","@ember/-internals/views/lib/views/states/destroying.js","@ember/-internals/views/lib/views/states/has_element.js","@ember/-internals/views/lib/views/states/in_dom.js","@ember/-internals/views/lib/views/states/pre_render.js","@ember/application/globals-resolver.js","@ember/application/index.js","@ember/application/instance.js","@ember/application/lib/application.js","@ember/application/lib/lazy_load.js","@ember/application/lib/validate-type.js","@ember/application/tests/application_instance_test.js","@ember/application/tests/application_test.js","@ember/application/tests/bootstrap-test.js","@ember/application/tests/dependency_injection/custom_resolver_test.js","@ember/application/tests/dependency_injection/default_resolver_test.js","@ember/application/tests/dependency_injection/normalization_test.js","@ember/application/tests/dependency_injection/to_string_test.js","@ember/application/tests/dependency_injection_test.js","@ember/application/tests/initializers_test.js","@ember/application/tests/instance_initializers_test.js","@ember/application/tests/lazy_load_test.js","@ember/application/tests/logging_test.js","@ember/application/tests/readiness_test.js","@ember/application/tests/reset_test.js","@ember/application/tests/visit_test.js","@ember/canary-features/index.js","@ember/controller/index.js","@ember/controller/lib/controller_mixin.js","@ember/controller/tests/controller_test.js","@ember/debug/index.js","@ember/debug/lib/deprecate.js","@ember/debug/lib/handlers.js","@ember/debug/lib/testing.js","@ember/debug/lib/warn.js","@ember/debug/tests/handlers-test.js","@ember/debug/tests/main_test.js","@ember/deprecated-features/index.js","@ember/engine/index.js","@ember/engine/instance.js","@ember/engine/lib/engine-parent.js","@ember/engine/tests/engine_initializers_test.js","@ember/engine/tests/engine_instance_initializers_test.js","@ember/engine/tests/engine_instance_test.js","@ember/engine/tests/engine_parent_test.js","@ember/engine/tests/engine_test.js","@ember/error/index.js","@ember/error/tests/index_test.js","@ember/instrumentation/index.js","@ember/instrumentation/tests/index-test.js","@ember/map/index.js","@ember/map/lib/ordered-set.js","@ember/map/lib/utils.js","@ember/map/tests/map_test.js","@ember/map/with-default.js","@ember/object/computed.js","@ember/object/lib/computed/computed_macros.js","@ember/object/lib/computed/reduce_computed_macros.js","@ember/object/tests/computed/computed_macros_test.js","@ember/object/tests/computed/reduce_computed_macros_test.js","@ember/polyfills/index.js","@ember/polyfills/lib/assign.js","@ember/polyfills/lib/merge.js","@ember/polyfills/lib/weak_set.js","@ember/polyfills/tests/assign_test.js","@ember/polyfills/tests/merge_test.js","@ember/runloop/index.js","@ember/runloop/tests/debounce_test.js","@ember/runloop/tests/later_test.js","@ember/runloop/tests/next_test.js","@ember/runloop/tests/once_test.js","@ember/runloop/tests/onerror_test.js","@ember/runloop/tests/run_bind_test.js","@ember/runloop/tests/run_test.js","@ember/runloop/tests/schedule_test.js","@ember/runloop/tests/sync_test.js","@ember/runloop/tests/unwind_test.js","@ember/service/index.js","@ember/string/index.js","@ember/string/lib/string_registry.js","@ember/string/tests/camelize_test.js","@ember/string/tests/capitalize_test.js","@ember/string/tests/classify_test.js","@ember/string/tests/dasherize_test.js","@ember/string/tests/decamelize_test.js","@ember/string/tests/loc_test.js","@ember/string/tests/underscore_test.js","@ember/string/tests/w_test.js","@glimmer/compiler.js","@glimmer/encoder.js","@glimmer/env.js","@glimmer/low-level.js","@glimmer/node.js","@glimmer/opcode-compiler.js","@glimmer/program.js","@glimmer/reference.js","@glimmer/runtime.js","@glimmer/syntax.js","@glimmer/util.js","@glimmer/vm.js","@glimmer/wire-format.js","backburner.js","dag-map.js","ember-babel.js","ember-template-compiler/index.js","ember-template-compiler/lib/compat.js","ember-template-compiler/lib/plugins/assert-if-helper-without-arguments.js","ember-template-compiler/lib/plugins/assert-input-helper-without-block.js","ember-template-compiler/lib/plugins/assert-local-variable-shadowing-helper-invocation.js","ember-template-compiler/lib/plugins/assert-reserved-named-arguments.js","ember-template-compiler/lib/plugins/assert-splattribute-expression.js","ember-template-compiler/lib/plugins/deprecate-send-action.js","ember-template-compiler/lib/plugins/index.js","ember-template-compiler/lib/plugins/transform-action-syntax.js","ember-template-compiler/lib/plugins/transform-angle-bracket-components.js","ember-template-compiler/lib/plugins/transform-attrs-into-args.js","ember-template-compiler/lib/plugins/transform-component-invocation.js","ember-template-compiler/lib/plugins/transform-each-in-into-each.js","ember-template-compiler/lib/plugins/transform-has-block-syntax.js","ember-template-compiler/lib/plugins/transform-in-element.js","ember-template-compiler/lib/plugins/transform-inline-link-to.js","ember-template-compiler/lib/plugins/transform-input-type-syntax.js","ember-template-compiler/lib/plugins/transform-old-class-binding-syntax.js","ember-template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings.js","ember-template-compiler/lib/plugins/transform-top-level-components.js","ember-template-compiler/lib/system/bootstrap.js","ember-template-compiler/lib/system/calculate-location-display.js","ember-template-compiler/lib/system/compile-options.js","ember-template-compiler/lib/system/compile.js","ember-template-compiler/lib/system/dasherize-component-name.js","ember-template-compiler/lib/system/initializer.js","ember-template-compiler/lib/system/precompile.js","ember-template-compiler/tests/plugins/assert-if-helper-without-arguments-test.js","ember-template-compiler/tests/plugins/assert-input-helper-without-block-test.js","ember-template-compiler/tests/plugins/assert-local-variable-shadowing-helper-invocation-test.js","ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js","ember-template-compiler/tests/plugins/assert-splattribute-expression-test.js","ember-template-compiler/tests/plugins/deprecate-send-action-test.js","ember-template-compiler/tests/plugins/transform-component-invocation-test.js","ember-template-compiler/tests/plugins/transform-inline-link-to-test.js","ember-template-compiler/tests/plugins/transform-input-type-syntax-test.js","ember-template-compiler/tests/system/bootstrap-test.js","ember-template-compiler/tests/system/compile_options_test.js","ember-template-compiler/tests/system/dasherize-component-name-test.js","ember-testing/index.js","ember-testing/lib/adapters/adapter.js","ember-testing/lib/adapters/qunit.js","ember-testing/lib/events.js","ember-testing/lib/ext/application.js","ember-testing/lib/ext/rsvp.js","ember-testing/lib/helpers.js","ember-testing/lib/helpers/-is-form-control.js","ember-testing/lib/helpers/and_then.js","ember-testing/lib/helpers/click.js","ember-testing/lib/helpers/current_path.js","ember-testing/lib/helpers/current_route_name.js","ember-testing/lib/helpers/current_url.js","ember-testing/lib/helpers/fill_in.js","ember-testing/lib/helpers/find.js","ember-testing/lib/helpers/find_with_assert.js","ember-testing/lib/helpers/key_event.js","ember-testing/lib/helpers/pause_test.js","ember-testing/lib/helpers/trigger_event.js","ember-testing/lib/helpers/visit.js","ember-testing/lib/helpers/wait.js","ember-testing/lib/initializers.js","ember-testing/lib/setup_for_testing.js","ember-testing/lib/support.js","ember-testing/lib/test.js","ember-testing/lib/test/adapter.js","ember-testing/lib/test/helpers.js","ember-testing/lib/test/on_inject_helpers.js","ember-testing/lib/test/pending_requests.js","ember-testing/lib/test/promise.js","ember-testing/lib/test/run.js","ember-testing/lib/test/waiters.js","ember-testing/tests/acceptance_test.js","ember-testing/tests/adapters/adapter_test.js","ember-testing/tests/adapters/qunit_test.js","ember-testing/tests/adapters_test.js","ember-testing/tests/ext/rsvp_test.js","ember-testing/tests/helper_registration_test.js","ember-testing/tests/helpers_test.js","ember-testing/tests/integration_test.js","ember-testing/tests/reexports_test.js","ember-testing/tests/test/waiters-test.js","ember/index.js","ember/tests/application_lifecycle_test.js","ember/tests/component_context_test.js","ember/tests/component_registration_test.js","ember/tests/controller_test.js","ember/tests/error_handler_test.js","ember/tests/helpers/helper_registration_test.js","ember/tests/helpers/link_to_test.js","ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js","ember/tests/helpers/link_to_test/link_to_with_query_params_test.js","ember/tests/homepage_example_test.js","ember/tests/integration/multiple-app-test.js","ember/tests/production_build_test.js","ember/tests/reexports_test.js","ember/tests/routing/decoupled_basic_test.js","ember/tests/routing/deprecated_handler_infos_test.js","ember/tests/routing/deprecated_transition_state_test.js","ember/tests/routing/query_params_test.js","ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js","ember/tests/routing/query_params_test/overlapping_query_params_test.js","ember/tests/routing/query_params_test/query_param_async_get_handler_test.js","ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js","ember/tests/routing/query_params_test/shared_state_test.js","ember/tests/routing/router_map_test.js","ember/tests/routing/router_service_test/basic_test.js","ember/tests/routing/router_service_test/currenturl_lifecycle_test.js","ember/tests/routing/router_service_test/events_test.js","ember/tests/routing/router_service_test/isActive_test.js","ember/tests/routing/router_service_test/recognize_test.js","ember/tests/routing/router_service_test/replaceWith_test.js","ember/tests/routing/router_service_test/transitionTo_test.js","ember/tests/routing/router_service_test/urlFor_test.js","ember/tests/routing/substates_test.js","ember/tests/routing/toplevel_dom_test.js","ember/tests/service_injection_test.js","ember/tests/view_instrumentation_test.js","ember/version.js","handlebars.js","internal-test-helpers/index.js","internal-test-helpers/lib/apply-mixins.js","internal-test-helpers/lib/browser-detect.js","internal-test-helpers/lib/build-owner.js","internal-test-helpers/lib/confirm-export.js","internal-test-helpers/lib/ember-dev/assertion.js","internal-test-helpers/lib/ember-dev/containers.js","internal-test-helpers/lib/ember-dev/debug.js","internal-test-helpers/lib/ember-dev/deprecation.js","internal-test-helpers/lib/ember-dev/index.js","internal-test-helpers/lib/ember-dev/method-call-tracker.js","internal-test-helpers/lib/ember-dev/namespaces.js","internal-test-helpers/lib/ember-dev/run-loop.js","internal-test-helpers/lib/ember-dev/setup-qunit.js","internal-test-helpers/lib/ember-dev/utils.js","internal-test-helpers/lib/ember-dev/warning.js","internal-test-helpers/lib/equal-inner-html.js","internal-test-helpers/lib/equal-tokens.js","internal-test-helpers/lib/factory.js","internal-test-helpers/lib/get-all-property-names.js","internal-test-helpers/lib/get-text-of.js","internal-test-helpers/lib/matchers.js","internal-test-helpers/lib/module-for.js","internal-test-helpers/lib/registry-check.js","internal-test-helpers/lib/run.js","internal-test-helpers/lib/strip.js","internal-test-helpers/lib/system/synthetic-events.js","internal-test-helpers/lib/test-cases/abstract-application.js","internal-test-helpers/lib/test-cases/abstract-rendering.js","internal-test-helpers/lib/test-cases/abstract.js","internal-test-helpers/lib/test-cases/application.js","internal-test-helpers/lib/test-cases/autoboot-application.js","internal-test-helpers/lib/test-cases/default-resolver-application.js","internal-test-helpers/lib/test-cases/node-query.js","internal-test-helpers/lib/test-cases/query-param.js","internal-test-helpers/lib/test-cases/rendering.js","internal-test-helpers/lib/test-cases/router.js","internal-test-helpers/lib/test-cases/test-resolver-application.js","internal-test-helpers/lib/test-resolver.js","internal-test-helpers/tests/index-test.js","node-module.js","route-recognizer.js","router_js.js","rsvp.js","simple-html-tokenizer.js"],"sourcesContent":["/*globals process */\nvar enifed, requireModule, Ember;\n\n// Used in @ember/-internals/environment/lib/global.js\nmainContext = this; // eslint-disable-line no-undef\n\n(function() {\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var reified = new Array(deps.length);\n\n for (var i = 0; i < deps.length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = requireModule;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n }\n\n var isNode =\n typeof window === 'undefined' &&\n typeof process !== 'undefined' &&\n {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') {\n Ember = {};\n }\n\n if (typeof Ember.__loader === 'undefined') {\n var registry = Object.create(null);\n var seen = Object.create(null);\n\n enifed = function(name, deps, callback) {\n var value = {};\n\n if (!callback) {\n value.deps = [];\n value.callback = deps;\n } else {\n value.deps = deps;\n value.callback = callback;\n }\n\n registry[name] = value;\n };\n\n requireModule = function(name) {\n return internalRequire(name, null);\n };\n\n // setup `require` module\n requireModule['default'] = requireModule;\n\n requireModule.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n requireModule._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: requireModule,\n registry: registry,\n };\n } else {\n enifed = Ember.__loader.define;\n requireModule = Ember.__loader.require;\n }\n})();\n","enifed('@ember/-internals/browser-environment/index', ['exports', '@ember/-internals/browser-environment/lib/has-dom'], function (exports, _hasDom) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isFirefox = exports.isChrome = exports.userAgent = exports.history = exports.location = exports.window = exports.hasDOM = undefined;\n Object.defineProperty(exports, 'hasDOM', {\n enumerable: true,\n get: function () {\n return _hasDom.default;\n }\n });\n const window = exports.window = _hasDom.default ? self : null;\n const location = exports.location = _hasDom.default ? self.location : null;\n const history = exports.history = _hasDom.default ? self.history : null;\n const userAgent = exports.userAgent = _hasDom.default ? self.navigator.userAgent : 'Lynx (textmode)';\n const isChrome = exports.isChrome = _hasDom.default ? !!window.chrome && !window.opera : false;\n const isFirefox = exports.isFirefox = _hasDom.default ? typeof InstallTrigger !== 'undefined' : false;\n});","enifed('@ember/-internals/browser-environment/lib/has-dom', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = 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';\n});","enifed('@ember/-internals/console/index', ['exports', '@ember/debug', '@ember/deprecated-features'], function (exports, _debug, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n // Deliver message that the function is deprecated\n\n const DEPRECATION_MESSAGE = 'Use of Ember.Logger is deprecated. Please use `console` for logging.';\n const DEPRECATION_ID = 'ember-console.deprecate-logger';\n const DEPRECATION_URL = 'https://emberjs.com/deprecations/v3.x#toc_use-console-rather-than-ember-logger';\n /**\n @module ember\n */\n\n /**\n Inside Ember-Metal, simply uses the methods from `imports.console`.\n Override this to provide more robust logging functionality.\n \n @class Logger\n @deprecated Use 'console' instead\n \n @namespace Ember\n @public\n */\n let DEPRECATED_LOGGER;\n\n if (_deprecatedFeatures.LOGGER) {\n DEPRECATED_LOGGER = {\n /**\n Logs the arguments to the console.\n You can pass as many arguments as you want and they will be joined together with a space.\n ```javascript\n var foo = 1;\n Ember.Logger.log('log value of foo:', foo);\n // \"log value of foo: 1\" will be printed to the console\n ```\n @method log\n @for Ember.Logger\n @param {*} arguments\n @public\n */\n log() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n return console.log(...arguments); // eslint-disable-line no-console\n },\n\n /**\n Prints the arguments to the console with a warning icon.\n You can pass as many arguments as you want and they will be joined together with a space.\n ```javascript\n Ember.Logger.warn('Something happened!');\n // \"Something happened!\" will be printed to the console with a warning icon.\n ```\n @method warn\n @for Ember.Logger\n @param {*} arguments\n @public\n */\n warn() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n return console.warn(...arguments); // eslint-disable-line no-console\n },\n\n /**\n Prints the arguments to the console with an error icon, red text and a stack trace.\n You can pass as many arguments as you want and they will be joined together with a space.\n ```javascript\n Ember.Logger.error('Danger! Danger!');\n // \"Danger! Danger!\" will be printed to the console in red text.\n ```\n @method error\n @for Ember.Logger\n @param {*} arguments\n @public\n */\n error() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n return console.error(...arguments); // eslint-disable-line no-console\n },\n\n /**\n Logs the arguments to the console.\n You can pass as many arguments as you want and they will be joined together with a space.\n ```javascript\n var foo = 1;\n Ember.Logger.info('log value of foo:', foo);\n // \"log value of foo: 1\" will be printed to the console\n ```\n @method info\n @for Ember.Logger\n @param {*} arguments\n @public\n */\n info() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n return console.info(...arguments); // eslint-disable-line no-console\n },\n\n /**\n Logs the arguments to the console in blue text.\n You can pass as many arguments as you want and they will be joined together with a space.\n ```javascript\n var foo = 1;\n Ember.Logger.debug('log value of foo:', foo);\n // \"log value of foo: 1\" will be printed to the console\n ```\n @method debug\n @for Ember.Logger\n @param {*} arguments\n @public\n */\n debug() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n /* eslint-disable no-console */\n if (console.debug) {\n return console.debug(...arguments);\n }\n return console.info(...arguments);\n /* eslint-enable no-console */\n },\n\n /**\n If the value passed into `Ember.Logger.assert` is not truthy it will throw an error with a stack trace.\n ```javascript\n Ember.Logger.assert(true); // undefined\n Ember.Logger.assert(true === false); // Throws an Assertion failed error.\n Ember.Logger.assert(true === false, 'Something invalid'); // Throws an Assertion failed error with message.\n ```\n @method assert\n @for Ember.Logger\n @param {Boolean} bool Value to test\n @param {String} message Assertion message on failed\n @public\n */\n assert() {\n (0, _debug.deprecate)(DEPRECATION_MESSAGE, false, {\n id: DEPRECATION_ID,\n until: '4.0.0',\n url: DEPRECATION_URL\n });\n return console.assert(...arguments); // eslint-disable-line no-console\n }\n };\n }\n\n exports.default = DEPRECATED_LOGGER;\n});","enifed('@ember/-internals/container/index', ['exports', '@ember/-internals/container/lib/registry', '@ember/-internals/container/lib/container'], function (exports, _registry, _container) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'Registry', {\n enumerable: true,\n get: function () {\n return _registry.default;\n }\n });\n Object.defineProperty(exports, 'privatize', {\n enumerable: true,\n get: function () {\n return _registry.privatize;\n }\n });\n Object.defineProperty(exports, 'Container', {\n enumerable: true,\n get: function () {\n return _container.default;\n }\n });\n Object.defineProperty(exports, 'FACTORY_FOR', {\n enumerable: true,\n get: function () {\n return _container.FACTORY_FOR;\n }\n });\n});","enifed('@ember/-internals/container/lib/container', ['exports', '@ember/-internals/owner', '@ember/-internals/utils', '@ember/canary-features', '@ember/debug', '@ember/polyfills', '@glimmer/env'], function (exports, _owner, _utils, _canaryFeatures, _debug, _polyfills, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.FACTORY_FOR = undefined;\n\n let leakTracking;\n let containers;\n if (_env.DEBUG) {\n // requires v8\n // chrome --js-flags=\"--allow-natives-syntax --expose-gc\"\n // node --allow-natives-syntax --expose-gc\n try {\n if (typeof gc === 'function') {\n leakTracking = (() => {\n // avoid syntax errors when --allow-natives-syntax not present\n let GetWeakSetValues = new Function('weakSet', 'return %GetWeakSetValues(weakSet, 0)');\n containers = new WeakSet();\n return {\n hasContainers() {\n gc();\n return GetWeakSetValues(containers).length > 0;\n },\n reset() {\n let values = GetWeakSetValues(containers);\n for (let i = 0; i < values.length; i++) {\n containers.delete(values[i]);\n }\n }\n };\n })();\n }\n } catch (e) {\n // ignore\n }\n }\n /**\n A container used to instantiate and cache objects.\n \n Every `Container` must be associated with a `Registry`, which is referenced\n to determine the factory and options that should be used to instantiate\n objects.\n \n The public API for `Container` is still in flux and should not be considered\n stable.\n \n @private\n @class Container\n */\n class Container {\n constructor(registry, options = {}) {\n this.registry = registry;\n this.owner = options.owner || null;\n this.cache = (0, _utils.dictionary)(options.cache || null);\n this.factoryManagerCache = (0, _utils.dictionary)(options.factoryManagerCache || null);\n this.isDestroyed = false;\n this.isDestroying = false;\n if (_env.DEBUG) {\n this.validationCache = (0, _utils.dictionary)(options.validationCache || null);\n if (containers !== undefined) {\n containers.add(this);\n }\n }\n }\n /**\n @private\n @property registry\n @type Registry\n @since 1.11.0\n */\n /**\n @private\n @property cache\n @type InheritingDict\n */\n /**\n @private\n @property validationCache\n @type InheritingDict\n */\n /**\n Given a fullName return a corresponding instance.\n The default behavior is for lookup to return a singleton instance.\n The singleton is scoped to the container, allowing multiple containers\n to all have their own locally scoped singletons.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter');\n twitter instanceof Twitter; // => true\n // by default the container will return singletons\n let twitter2 = container.lookup('api:twitter');\n twitter2 instanceof Twitter; // => true\n twitter === twitter2; //=> true\n ```\n If singletons are not wanted, an optional flag can be provided at lookup.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter', { singleton: false });\n let twitter2 = container.lookup('api:twitter', { singleton: false });\n twitter === twitter2; //=> false\n ```\n @private\n @method lookup\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] The fullname of the request source (used for local lookup)\n @return {any}\n */\n lookup(fullName, options) {\n (0, _debug.assert)('expected container not to be destroyed', !this.isDestroyed);\n (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(fullName));\n return lookup(this, this.registry.normalize(fullName), options);\n }\n /**\n A depth first traversal, destroying the container, its descendant containers and all\n their managed objects.\n @private\n @method destroy\n */\n destroy() {\n destroyDestroyables(this);\n this.isDestroying = true;\n }\n finalizeDestroy() {\n resetCache(this);\n this.isDestroyed = true;\n }\n /**\n Clear either the entire cache or just the cache for a particular key.\n @private\n @method reset\n @param {String} fullName optional key to reset; if missing, resets everything\n */\n reset(fullName) {\n if (this.isDestroyed) return;\n if (fullName === undefined) {\n destroyDestroyables(this);\n resetCache(this);\n } else {\n resetMember(this, this.registry.normalize(fullName));\n }\n }\n /**\n Returns an object that can be used to provide an owner to a\n manually created instance.\n @private\n @method ownerInjection\n @returns { Object }\n */\n ownerInjection() {\n return { [_owner.OWNER]: this.owner };\n }\n /**\n Given a fullName, return the corresponding factory. The consumer of the factory\n is responsible for the destruction of any factory instances, as there is no\n way for the container to ensure instances are destroyed when it itself is\n destroyed.\n @public\n @method factoryFor\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] The fullname of the request source (used for local lookup)\n @return {any}\n */\n factoryFor(fullName, options = {}) {\n (0, _debug.assert)('expected container not to be destroyed', !this.isDestroyed);\n let normalizedName = this.registry.normalize(fullName);\n (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(normalizedName));\n (0, _debug.assert)('EMBER_MODULE_UNIFICATION must be enabled to pass a namespace option to factoryFor', _canaryFeatures.EMBER_MODULE_UNIFICATION || !options.namespace);\n if (options.source || options.namespace) {\n normalizedName = this.registry.expandLocalLookup(fullName, options);\n if (!normalizedName) {\n return;\n }\n }\n return factoryFor(this, normalizedName, fullName);\n }\n }\n exports.default = Container;\n if (_env.DEBUG) {\n Container._leakTracking = leakTracking;\n }\n /*\n * Wrap a factory manager in a proxy which will not permit properties to be\n * set on the manager.\n */\n function wrapManagerInDeprecationProxy(manager) {\n if (_utils.HAS_NATIVE_PROXY) {\n let validator = {\n set(_obj, prop) {\n throw new Error(`You attempted to set \"${prop}\" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`);\n }\n };\n // Note:\n // We have to proxy access to the manager here so that private property\n // access doesn't cause the above errors to occur.\n let m = manager;\n let proxiedManager = {\n class: m.class,\n create(props) {\n return m.create(props);\n }\n };\n let proxy = new Proxy(proxiedManager, validator);\n FACTORY_FOR.set(proxy, manager);\n }\n return manager;\n }\n function isSingleton(container, fullName) {\n return container.registry.getOption(fullName, 'singleton') !== false;\n }\n function isInstantiatable(container, fullName) {\n return container.registry.getOption(fullName, 'instantiate') !== false;\n }\n function lookup(container, fullName, options = {}) {\n (0, _debug.assert)('EMBER_MODULE_UNIFICATION must be enabled to pass a namespace option to lookup', _canaryFeatures.EMBER_MODULE_UNIFICATION || !options.namespace);\n let normalizedName = fullName;\n if (options.source || options.namespace) {\n normalizedName = container.registry.expandLocalLookup(fullName, options);\n if (!normalizedName) {\n return;\n }\n }\n if (options.singleton !== false) {\n let cached = container.cache[normalizedName];\n if (cached !== undefined) {\n return cached;\n }\n }\n return instantiateFactory(container, normalizedName, fullName, options);\n }\n function factoryFor(container, normalizedName, fullName) {\n let cached = container.factoryManagerCache[normalizedName];\n if (cached !== undefined) {\n return cached;\n }\n let factory = container.registry.resolve(normalizedName);\n if (factory === undefined) {\n return;\n }\n if (_env.DEBUG && factory && typeof factory._onLookup === 'function') {\n factory._onLookup(fullName);\n }\n let manager = new FactoryManager(container, factory, fullName, normalizedName);\n if (_env.DEBUG) {\n manager = wrapManagerInDeprecationProxy(manager);\n }\n container.factoryManagerCache[normalizedName] = manager;\n return manager;\n }\n function isSingletonClass(container, fullName, { instantiate, singleton }) {\n return singleton !== false && !instantiate && isSingleton(container, fullName) && !isInstantiatable(container, fullName);\n }\n function isSingletonInstance(container, fullName, { instantiate, singleton }) {\n return singleton !== false && instantiate !== false && isSingleton(container, fullName) && isInstantiatable(container, fullName);\n }\n function isFactoryClass(container, fullname, { instantiate, singleton }) {\n return instantiate === false && (singleton === false || !isSingleton(container, fullname)) && !isInstantiatable(container, fullname);\n }\n function isFactoryInstance(container, fullName, { instantiate, singleton }) {\n return instantiate !== false && (singleton !== false || isSingleton(container, fullName)) && isInstantiatable(container, fullName);\n }\n function instantiateFactory(container, normalizedName, fullName, options) {\n let factoryManager = factoryFor(container, normalizedName, fullName);\n if (factoryManager === undefined) {\n return;\n }\n // SomeClass { singleton: true, instantiate: true } | { singleton: true } | { instantiate: true } | {}\n // By default majority of objects fall into this case\n if (isSingletonInstance(container, fullName, options)) {\n return container.cache[normalizedName] = factoryManager.create();\n }\n // SomeClass { singleton: false, instantiate: true }\n if (isFactoryInstance(container, fullName, options)) {\n return factoryManager.create();\n }\n // SomeClass { singleton: true, instantiate: false } | { instantiate: false } | { singleton: false, instantiation: false }\n if (isSingletonClass(container, fullName, options) || isFactoryClass(container, fullName, options)) {\n return factoryManager.class;\n }\n throw new Error('Could not create factory');\n }\n function processInjections(container, injections, result) {\n if (_env.DEBUG) {\n container.registry.validateInjections(injections);\n }\n let hash = result.injections;\n if (hash === undefined) {\n hash = result.injections = {};\n }\n for (let i = 0; i < injections.length; i++) {\n let { property, specifier, source } = injections[i];\n if (source) {\n hash[property] = lookup(container, specifier, { source });\n } else {\n hash[property] = lookup(container, specifier);\n }\n if (!result.isDynamic) {\n result.isDynamic = !isSingleton(container, specifier);\n }\n }\n }\n function buildInjections(container, typeInjections, injections) {\n let result = {\n injections: undefined,\n isDynamic: false\n };\n if (typeInjections !== undefined) {\n processInjections(container, typeInjections, result);\n }\n if (injections !== undefined) {\n processInjections(container, injections, result);\n }\n return result;\n }\n function injectionsFor(container, fullName) {\n let registry = container.registry;\n let [type] = fullName.split(':');\n let typeInjections = registry.getTypeInjections(type);\n let injections = registry.getInjections(fullName);\n return buildInjections(container, typeInjections, injections);\n }\n function destroyDestroyables(container) {\n let cache = container.cache;\n let keys = Object.keys(cache);\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n let value = cache[key];\n if (value.destroy) {\n value.destroy();\n }\n }\n }\n function resetCache(container) {\n container.cache = (0, _utils.dictionary)(null);\n container.factoryManagerCache = (0, _utils.dictionary)(null);\n }\n function resetMember(container, fullName) {\n let member = container.cache[fullName];\n delete container.factoryManagerCache[fullName];\n if (member) {\n delete container.cache[fullName];\n if (member.destroy) {\n member.destroy();\n }\n }\n }\n const FACTORY_FOR = exports.FACTORY_FOR = new WeakMap();\n class FactoryManager {\n constructor(container, factory, fullName, normalizedName) {\n this.container = container;\n this.owner = container.owner;\n this.class = factory;\n this.fullName = fullName;\n this.normalizedName = normalizedName;\n this.madeToString = undefined;\n this.injections = undefined;\n FACTORY_FOR.set(this, this);\n }\n toString() {\n if (this.madeToString === undefined) {\n this.madeToString = this.container.registry.makeToString(this.class, this.fullName);\n }\n return this.madeToString;\n }\n create(options) {\n let injectionsCache = this.injections;\n if (injectionsCache === undefined) {\n let { injections, isDynamic } = injectionsFor(this.container, this.normalizedName);\n injectionsCache = injections;\n if (!isDynamic) {\n this.injections = injections;\n }\n }\n let props = injectionsCache;\n if (options !== undefined) {\n props = (0, _polyfills.assign)({}, injectionsCache, options);\n }\n if (_env.DEBUG) {\n let lazyInjections;\n let validationCache = this.container.validationCache;\n // Ensure that all lazy injections are valid at instantiation time\n if (!validationCache[this.fullName] && this.class && typeof this.class._lazyInjections === 'function') {\n lazyInjections = this.class._lazyInjections();\n lazyInjections = this.container.registry.normalizeInjectionsHash(lazyInjections);\n this.container.registry.validateInjections(lazyInjections);\n }\n validationCache[this.fullName] = true;\n }\n if (!this.class.create) {\n throw new Error(`Failed to create an instance of '${this.normalizedName}'. Most likely an improperly defined class or` + ` an invalid module export.`);\n }\n // required to allow access to things like\n // the customized toString, _debugContainerKey,\n // owner, etc. without a double extend and without\n // modifying the objects properties\n if (typeof this.class._initFactory === 'function') {\n this.class._initFactory(this);\n } else {\n // in the non-EmberObject case we need to still setOwner\n // this is required for supporting glimmer environment and\n // template instantiation which rely heavily on\n // `options[OWNER]` being passed into `create`\n // TODO: clean this up, and remove in future versions\n if (options === undefined || props === undefined) {\n // avoid mutating `props` here since they are the cached injections\n props = (0, _polyfills.assign)({}, props);\n }\n (0, _owner.setOwner)(props, this.owner);\n }\n let instance = this.class.create(props);\n FACTORY_FOR.set(instance, this);\n return instance;\n }\n }\n});","enifed('@ember/-internals/container/lib/registry', ['exports', '@ember/-internals/utils', '@ember/debug', '@ember/polyfills', '@glimmer/env', '@ember/-internals/container/lib/container'], function (exports, _utils, _debug, _polyfills, _env, _container) {\n 'use strict';\n\n exports.__esModule = true;\n exports.privatize = privatize;\n\n const VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/;\n /**\n A registry used to store factory and option information keyed\n by type.\n \n A `Registry` stores the factory and option information needed by a\n `Container` to instantiate and cache objects.\n \n The API for `Registry` is still in flux and should not be considered stable.\n \n @private\n @class Registry\n @since 1.11.0\n */\n class Registry {\n constructor(options = {}) {\n this.fallback = options.fallback || null;\n this.resolver = options.resolver || null;\n this.registrations = (0, _utils.dictionary)(options.registrations || null);\n this._typeInjections = (0, _utils.dictionary)(null);\n this._injections = (0, _utils.dictionary)(null);\n this._localLookupCache = Object.create(null);\n this._normalizeCache = (0, _utils.dictionary)(null);\n this._resolveCache = (0, _utils.dictionary)(null);\n this._failSet = new Set();\n this._options = (0, _utils.dictionary)(null);\n this._typeOptions = (0, _utils.dictionary)(null);\n }\n /**\n A backup registry for resolving registrations when no matches can be found.\n @private\n @property fallback\n @type Registry\n */\n /**\n An object that has a `resolve` method that resolves a name.\n @private\n @property resolver\n @type Resolver\n */\n /**\n @private\n @property registrations\n @type InheritingDict\n */\n /**\n @private\n @property _typeInjections\n @type InheritingDict\n */\n /**\n @private\n @property _injections\n @type InheritingDict\n */\n /**\n @private\n @property _normalizeCache\n @type InheritingDict\n */\n /**\n @private\n @property _resolveCache\n @type InheritingDict\n */\n /**\n @private\n @property _options\n @type InheritingDict\n */\n /**\n @private\n @property _typeOptions\n @type InheritingDict\n */\n /**\n Creates a container based on this registry.\n @private\n @method container\n @param {Object} options\n @return {Container} created container\n */\n container(options) {\n return new _container.default(this, options);\n }\n /**\n Registers a factory for later injection.\n Example:\n ```javascript\n let registry = new Registry();\n registry.register('model:user', Person, {singleton: false });\n registry.register('fruit:favorite', Orange);\n registry.register('communication:main', Email, {singleton: false});\n ```\n @private\n @method register\n @param {String} fullName\n @param {Function} factory\n @param {Object} options\n */\n register(fullName, factory, options = {}) {\n (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName));\n (0, _debug.assert)(`Attempting to register an unknown factory: '${fullName}'`, factory !== undefined);\n let normalizedName = this.normalize(fullName);\n (0, _debug.assert)(`Cannot re-register: '${fullName}', as it has already been resolved.`, !this._resolveCache[normalizedName]);\n this._failSet.delete(normalizedName);\n this.registrations[normalizedName] = factory;\n this._options[normalizedName] = options;\n }\n /**\n Unregister a fullName\n ```javascript\n let registry = new Registry();\n registry.register('model:user', User);\n registry.resolve('model:user').create() instanceof User //=> true\n registry.unregister('model:user')\n registry.resolve('model:user') === undefined //=> true\n ```\n @private\n @method unregister\n @param {String} fullName\n */\n unregister(fullName) {\n (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName));\n let normalizedName = this.normalize(fullName);\n this._localLookupCache = Object.create(null);\n delete this.registrations[normalizedName];\n delete this._resolveCache[normalizedName];\n delete this._options[normalizedName];\n this._failSet.delete(normalizedName);\n }\n /**\n Given a fullName return the corresponding factory.\n By default `resolve` will retrieve the factory from\n the registry.\n ```javascript\n let registry = new Registry();\n registry.register('api:twitter', Twitter);\n registry.resolve('api:twitter') // => Twitter\n ```\n Optionally the registry can be provided with a custom resolver.\n If provided, `resolve` will first provide the custom resolver\n the opportunity to resolve the fullName, otherwise it will fallback\n to the registry.\n ```javascript\n let registry = new Registry();\n registry.resolver = function(fullName) {\n // lookup via the module system of choice\n };\n // the twitter factory is added to the module system\n registry.resolve('api:twitter') // => Twitter\n ```\n @private\n @method resolve\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] the fullname of the request source (used for local lookups)\n @return {Function} fullName's factory\n */\n resolve(fullName, options) {\n let factory = resolve(this, this.normalize(fullName), options);\n if (factory === undefined && this.fallback !== null) {\n factory = this.fallback.resolve(...arguments);\n }\n return factory;\n }\n /**\n A hook that can be used to describe how the resolver will\n attempt to find the factory.\n For example, the default Ember `.describe` returns the full\n class name (including namespace) where Ember's resolver expects\n to find the `fullName`.\n @private\n @method describe\n @param {String} fullName\n @return {string} described fullName\n */\n describe(fullName) {\n if (this.resolver !== null && this.resolver.lookupDescription) {\n return this.resolver.lookupDescription(fullName);\n } else if (this.fallback !== null) {\n return this.fallback.describe(fullName);\n } else {\n return fullName;\n }\n }\n /**\n A hook to enable custom fullName normalization behavior\n @private\n @method normalizeFullName\n @param {String} fullName\n @return {string} normalized fullName\n */\n normalizeFullName(fullName) {\n if (this.resolver !== null && this.resolver.normalize) {\n return this.resolver.normalize(fullName);\n } else if (this.fallback !== null) {\n return this.fallback.normalizeFullName(fullName);\n } else {\n return fullName;\n }\n }\n /**\n Normalize a fullName based on the application's conventions\n @private\n @method normalize\n @param {String} fullName\n @return {string} normalized fullName\n */\n normalize(fullName) {\n return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName));\n }\n /**\n @method makeToString\n @private\n @param {any} factory\n @param {string} fullName\n @return {function} toString function\n */\n makeToString(factory, fullName) {\n if (this.resolver !== null && this.resolver.makeToString) {\n return this.resolver.makeToString(factory, fullName);\n } else if (this.fallback !== null) {\n return this.fallback.makeToString(factory, fullName);\n } else {\n return factory.toString();\n }\n }\n /**\n Given a fullName check if the container is aware of its factory\n or singleton instance.\n @private\n @method has\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] the fullname of the request source (used for local lookups)\n @return {Boolean}\n */\n has(fullName, options) {\n if (!this.isValidFullName(fullName)) {\n return false;\n }\n let source = options && options.source && this.normalize(options.source);\n let namespace = options && options.namespace || undefined;\n return has(this, this.normalize(fullName), source, namespace);\n }\n /**\n Allow registering options for all factories of a type.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n // if all of type `connection` must not be singletons\n registry.optionsForType('connection', { singleton: false });\n registry.register('connection:twitter', TwitterConnection);\n registry.register('connection:facebook', FacebookConnection);\n let twitter = container.lookup('connection:twitter');\n let twitter2 = container.lookup('connection:twitter');\n twitter === twitter2; // => false\n let facebook = container.lookup('connection:facebook');\n let facebook2 = container.lookup('connection:facebook');\n facebook === facebook2; // => false\n ```\n @private\n @method optionsForType\n @param {String} type\n @param {Object} options\n */\n optionsForType(type, options) {\n this._typeOptions[type] = options;\n }\n getOptionsForType(type) {\n let optionsForType = this._typeOptions[type];\n if (optionsForType === undefined && this.fallback !== null) {\n optionsForType = this.fallback.getOptionsForType(type);\n }\n return optionsForType;\n }\n /**\n @private\n @method options\n @param {String} fullName\n @param {Object} options\n */\n options(fullName, options) {\n let normalizedName = this.normalize(fullName);\n this._options[normalizedName] = options;\n }\n getOptions(fullName) {\n let normalizedName = this.normalize(fullName);\n let options = this._options[normalizedName];\n if (options === undefined && this.fallback !== null) {\n options = this.fallback.getOptions(fullName);\n }\n return options;\n }\n getOption(fullName, optionName) {\n let options = this._options[fullName];\n if (options !== undefined && options[optionName] !== undefined) {\n return options[optionName];\n }\n let type = fullName.split(':')[0];\n options = this._typeOptions[type];\n if (options && options[optionName] !== undefined) {\n return options[optionName];\n } else if (this.fallback !== null) {\n return this.fallback.getOption(fullName, optionName);\n }\n return undefined;\n }\n /**\n Used only via `injection`.\n Provides a specialized form of injection, specifically enabling\n all objects of one type to be injected with a reference to another\n object.\n For example, provided each object of type `controller` needed a `router`.\n one would do the following:\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('router:main', Router);\n registry.register('controller:user', UserController);\n registry.register('controller:post', PostController);\n registry.typeInjection('controller', 'router', 'router:main');\n let user = container.lookup('controller:user');\n let post = container.lookup('controller:post');\n user.router instanceof Router; //=> true\n post.router instanceof Router; //=> true\n // both controllers share the same router\n user.router === post.router; //=> true\n ```\n @private\n @method typeInjection\n @param {String} type\n @param {String} property\n @param {String} fullName\n */\n typeInjection(type, property, fullName) {\n (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName));\n let fullNameType = fullName.split(':')[0];\n (0, _debug.assert)(`Cannot inject a '${fullName}' on other ${type}(s).`, fullNameType !== type);\n let injections = this._typeInjections[type] || (this._typeInjections[type] = []);\n injections.push({ property, specifier: fullName });\n }\n /**\n Defines injection rules.\n These rules are used to inject dependencies onto objects when they\n are instantiated.\n Two forms of injections are possible:\n * Injecting one fullName on another fullName\n * Injecting one fullName on a type\n Example:\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('source:main', Source);\n registry.register('model:user', User);\n registry.register('model:post', Post);\n // injecting one fullName on another fullName\n // eg. each user model gets a post model\n registry.injection('model:user', 'post', 'model:post');\n // injecting one fullName on another type\n registry.injection('model', 'source', 'source:main');\n let user = container.lookup('model:user');\n let post = container.lookup('model:post');\n user.source instanceof Source; //=> true\n post.source instanceof Source; //=> true\n user.post instanceof Post; //=> true\n // and both models share the same source\n user.source === post.source; //=> true\n ```\n @private\n @method injection\n @param {String} factoryName\n @param {String} property\n @param {String} injectionName\n */\n injection(fullName, property, injectionName) {\n (0, _debug.assert)(`Invalid injectionName, expected: 'type:name' got: ${injectionName}`, this.isValidFullName(injectionName));\n let normalizedInjectionName = this.normalize(injectionName);\n if (fullName.indexOf(':') === -1) {\n return this.typeInjection(fullName, property, normalizedInjectionName);\n }\n (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName));\n let normalizedName = this.normalize(fullName);\n let injections = this._injections[normalizedName] || (this._injections[normalizedName] = []);\n injections.push({ property, specifier: normalizedInjectionName });\n }\n /**\n @private\n @method knownForType\n @param {String} type the type to iterate over\n */\n knownForType(type) {\n let localKnown = (0, _utils.dictionary)(null);\n let registeredNames = Object.keys(this.registrations);\n for (let index = 0; index < registeredNames.length; index++) {\n let fullName = registeredNames[index];\n let itemType = fullName.split(':')[0];\n if (itemType === type) {\n localKnown[fullName] = true;\n }\n }\n let fallbackKnown, resolverKnown;\n if (this.fallback !== null) {\n fallbackKnown = this.fallback.knownForType(type);\n }\n if (this.resolver !== null && this.resolver.knownForType) {\n resolverKnown = this.resolver.knownForType(type);\n }\n return (0, _polyfills.assign)({}, fallbackKnown, localKnown, resolverKnown);\n }\n isValidFullName(fullName) {\n return VALID_FULL_NAME_REGEXP.test(fullName);\n }\n getInjections(fullName) {\n let injections = this._injections[fullName];\n if (this.fallback !== null) {\n let fallbackInjections = this.fallback.getInjections(fullName);\n if (fallbackInjections !== undefined) {\n injections = injections === undefined ? fallbackInjections : injections.concat(fallbackInjections);\n }\n }\n return injections;\n }\n getTypeInjections(type) {\n let injections = this._typeInjections[type];\n if (this.fallback !== null) {\n let fallbackInjections = this.fallback.getTypeInjections(type);\n if (fallbackInjections !== undefined) {\n injections = injections === undefined ? fallbackInjections : injections.concat(fallbackInjections);\n }\n }\n return injections;\n }\n /**\n Given a fullName and a source fullName returns the fully resolved\n fullName. Used to allow for local lookup.\n ```javascript\n let registry = new Registry();\n // the twitter factory is added to the module system\n registry.expandLocalLookup('component:post-title', { source: 'template:post' }) // => component:post/post-title\n ```\n @private\n @method expandLocalLookup\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] the fullname of the request source (used for local lookups)\n @return {String} fullName\n */\n expandLocalLookup(fullName, options) {\n if (this.resolver !== null && this.resolver.expandLocalLookup) {\n (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName));\n (0, _debug.assert)('options.source must be a proper full name', !options.source || this.isValidFullName(options.source));\n let normalizedFullName = this.normalize(fullName);\n let normalizedSource = this.normalize(options.source);\n return expandLocalLookup(this, normalizedFullName, normalizedSource, options.namespace);\n } else if (this.fallback !== null) {\n return this.fallback.expandLocalLookup(fullName, options);\n } else {\n return null;\n }\n }\n }\n exports.default = Registry;\n if (_env.DEBUG) {\n const proto = Registry.prototype;\n proto.normalizeInjectionsHash = function (hash) {\n let injections = [];\n for (let key in hash) {\n if (hash.hasOwnProperty(key)) {\n let { specifier, source, namespace } = hash[key];\n (0, _debug.assert)(`Expected a proper full name, given '${specifier}'`, this.isValidFullName(specifier));\n injections.push({\n property: key,\n specifier,\n source,\n namespace\n });\n }\n }\n return injections;\n };\n proto.validateInjections = function (injections) {\n if (!injections) {\n return;\n }\n for (let i = 0; i < injections.length; i++) {\n let { specifier, source, namespace } = injections[i];\n (0, _debug.assert)(`Attempting to inject an unknown injection: '${specifier}'`, this.has(specifier, { source, namespace }));\n }\n };\n }\n function expandLocalLookup(registry, normalizedName, normalizedSource, namespace) {\n let cache = registry._localLookupCache;\n let normalizedNameCache = cache[normalizedName];\n if (!normalizedNameCache) {\n normalizedNameCache = cache[normalizedName] = Object.create(null);\n }\n let cacheKey = namespace || normalizedSource;\n let cached = normalizedNameCache[cacheKey];\n if (cached !== undefined) {\n return cached;\n }\n let expanded = registry.resolver.expandLocalLookup(normalizedName, normalizedSource, namespace);\n return normalizedNameCache[cacheKey] = expanded;\n }\n function resolve(registry, _normalizedName, options) {\n let normalizedName = _normalizedName;\n // when `source` is provided expand normalizedName\n // and source into the full normalizedName\n if (options !== undefined && (options.source || options.namespace)) {\n normalizedName = registry.expandLocalLookup(_normalizedName, options);\n if (!normalizedName) {\n return;\n }\n }\n let cached = registry._resolveCache[normalizedName];\n if (cached !== undefined) {\n return cached;\n }\n if (registry._failSet.has(normalizedName)) {\n return;\n }\n let resolved;\n if (registry.resolver) {\n resolved = registry.resolver.resolve(normalizedName);\n }\n if (resolved === undefined) {\n resolved = registry.registrations[normalizedName];\n }\n if (resolved === undefined) {\n registry._failSet.add(normalizedName);\n } else {\n registry._resolveCache[normalizedName] = resolved;\n }\n return resolved;\n }\n function has(registry, fullName, source, namespace) {\n return registry.resolve(fullName, { source, namespace }) !== undefined;\n }\n const privateNames = (0, _utils.dictionary)(null);\n const privateSuffix = `${Math.random()}${Date.now()}`.replace('.', '');\n function privatize([fullName]) {\n let name = privateNames[fullName];\n if (name) {\n return name;\n }\n let [type, rawName] = fullName.split(':');\n return privateNames[fullName] = (0, _utils.intern)(`${type}:${rawName}-${privateSuffix}`);\n }\n});","enifed('@ember/-internals/container/tests/container_test', ['@ember/-internals/owner', '@ember/polyfills', '@ember/canary-features', '@ember/-internals/container', 'internal-test-helpers'], function (_owner, _polyfills, _canaryFeatures, _container, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Container', class extends _internalTestHelpers.AbstractTestCase {\n ['@test A registered factory returns the same instance each time'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The lookup is an instance of the factory');\n\n assert.equal(postController, container.lookup('controller:post'));\n }\n\n ['@test uses create time injections if factory has no extend'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let AppleController = (0, _internalTestHelpers.factory)();\n let PostController = (0, _internalTestHelpers.factory)();\n\n PostController.extend = undefined; // remove extend\n\n registry.register('controller:apple', AppleController);\n registry.register('controller:post', PostController);\n registry.injection('controller:post', 'apple', 'controller:apple');\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController.apple instanceof AppleController, 'instance receives an apple of instance AppleController');\n }\n\n ['@test A registered factory returns a fresh instance if singleton: false is passed as an option'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let postController1 = container.lookup('controller:post');\n let postController2 = container.lookup('controller:post', {\n singleton: false\n });\n let postController3 = container.lookup('controller:post', {\n singleton: false\n });\n let postController4 = container.lookup('controller:post');\n\n assert.equal(postController1.toString(), postController4.toString(), 'Singleton factories looked up normally return the same value');\n assert.notEqual(postController1.toString(), postController2.toString(), 'Singleton factories are not equal to factories looked up with singleton: false');\n assert.notEqual(postController2.toString(), postController3.toString(), 'Two factories looked up with singleton: false are not equal');\n assert.notEqual(postController3.toString(), postController4.toString(), 'A singleton factory looked up after a factory called with singleton: false is not equal');\n\n assert.ok(postController1 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController2 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController3 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController4 instanceof PostController, 'All instances are instances of the registered factory');\n }\n\n [\"@test A factory type with a registered injection's instances receive that injection\"](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n\n registry.typeInjection('controller', 'store', 'store:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n\n assert.equal(postController.store, store);\n }\n\n ['@test An individual factory with a registered injection receives the injection'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n\n registry.injection('controller:post', 'store', 'store:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n\n assert.equal(postController.store, store, 'has the correct store injected');\n }\n\n ['@test A factory with both type and individual injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n let Router = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n registry.register('router:main', Router);\n\n registry.injection('controller:post', 'store', 'store:main');\n registry.typeInjection('controller', 'router', 'router:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n let router = container.lookup('router:main');\n\n assert.equal(postController.store, store);\n assert.equal(postController.router, router);\n }\n\n ['@test A non-singleton instance is never cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.register('view:post', PostView, { singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 !== postView2, 'Non-singletons are not cached');\n }\n\n ['@test A non-instantiated property is not instantiated'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let template = function () {};\n registry.register('template:foo', template, { instantiate: false });\n assert.equal(container.lookup('template:foo'), template);\n }\n\n ['@test A failed lookup returns undefined'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n assert.equal(container.lookup('doesnot:exist'), undefined);\n }\n\n ['@test An invalid factory throws an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n registry.register('controller:foo', {});\n\n assert.throws(() => {\n container.lookup('controller:foo');\n }, /Failed to create an instance of \\'controller:foo\\'/);\n }\n\n ['@test Injecting a failed lookup raises an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let fooInstance = {};\n let fooFactory = {};\n\n let Foo = {\n create() {\n return fooInstance;\n },\n extend() {\n return fooFactory;\n }\n };\n\n registry.register('model:foo', Foo);\n registry.injection('model:foo', 'store', 'store:main');\n\n assert.throws(() => {\n container.lookup('model:foo');\n });\n }\n\n ['@test Injecting a falsy value does not raise an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let ApplicationController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:application', ApplicationController);\n registry.register('user:current', null, { instantiate: false });\n registry.injection('controller:application', 'currentUser', 'user:current');\n\n assert.strictEqual(container.lookup('controller:application').currentUser, null);\n }\n\n ['@test The container returns same value each time even if the value is falsy'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n registry.register('falsy:value', null, { instantiate: false });\n\n assert.strictEqual(container.lookup('falsy:value'), container.lookup('falsy:value'));\n }\n\n ['@test Destroying the container destroys any cached singletons'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let PostView = (0, _internalTestHelpers.factory)();\n let template = function () {};\n\n registry.register('controller:post', PostController);\n registry.register('view:post', PostView, { singleton: false });\n registry.register('template:post', template, { instantiate: false });\n\n registry.injection('controller:post', 'postView', 'view:post');\n\n let postController = container.lookup('controller:post');\n let postView = postController.postView;\n\n assert.ok(postView instanceof PostView, 'The non-singleton was injected');\n\n container.destroy();\n\n assert.ok(postController.isDestroyed, 'Singletons are destroyed');\n assert.ok(!postView.isDestroyed, 'Non-singletons are not destroyed');\n }\n\n ['@test The container can use a registry hook to resolve factories lazily'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The correct factory was provided');\n }\n\n ['@test The container normalizes names before resolving'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let postController = container.lookup('controller:normalized');\n\n assert.ok(postController instanceof PostController, 'Normalizes the name before resolving');\n }\n\n ['@test The container normalizes names when looking factory up'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let fact = container.factoryFor('controller:normalized');\n\n let factInstance = fact.create();\n assert.ok(factInstance instanceof PostController, 'Normalizes the name');\n }\n\n ['@test Options can be registered that should be applied to a given factory'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'view:post') {\n return PostView;\n }\n }\n };\n\n registry.options('view:post', { instantiate: true, singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 instanceof PostView, 'The correct factory was provided');\n assert.ok(postView2 instanceof PostView, 'The correct factory was provided');\n\n assert.ok(postView1 !== postView2, 'The two lookups are different');\n }\n\n ['@test Options can be registered that should be applied to all factories for a given type'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'view:post') {\n return PostView;\n }\n }\n };\n\n registry.optionsForType('view', { singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 instanceof PostView, 'The correct factory was provided');\n assert.ok(postView2 instanceof PostView, 'The correct factory was provided');\n\n assert.ok(postView1 !== postView2, 'The two lookups are different');\n }\n\n ['@test An injected non-singleton instance is never cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n let PostViewHelper = (0, _internalTestHelpers.factory)();\n\n registry.register('view:post', PostView, { singleton: false });\n registry.register('view_helper:post', PostViewHelper, {\n singleton: false\n });\n registry.injection('view:post', 'viewHelper', 'view_helper:post');\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1.viewHelper !== postView2.viewHelper, 'Injected non-singletons are not cached');\n }\n\n ['@test Factory resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n\n container.factoryFor('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n }\n\n ['@test factory for non extendables (MODEL) resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n\n container.factoryFor('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n }\n\n ['@test factory for non extendables resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = {};\n let resolveWasCalled = [];\n\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n\n container.factoryFor('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n }\n\n [`@test A factory's lazy injections are validated when first instantiated`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Apple = (0, _internalTestHelpers.factory)();\n let Orange = (0, _internalTestHelpers.factory)();\n\n Apple.reopenClass({\n _lazyInjections() {\n return [{ specifier: 'orange:main' }, { specifier: 'banana:main' }];\n }\n });\n\n registry.register('apple:main', Apple);\n registry.register('orange:main', Orange);\n\n assert.throws(() => {\n container.lookup('apple:main');\n }, /Attempting to inject an unknown injection: 'banana:main'/);\n }\n\n ['@test Lazy injection validations are cached'](assert) {\n assert.expect(1);\n\n let registry = new _container.Registry();\n let container = registry.container();\n let Apple = (0, _internalTestHelpers.factory)();\n let Orange = (0, _internalTestHelpers.factory)();\n\n Apple.reopenClass({\n _lazyInjections: () => {\n assert.ok(true, 'should call lazy injection method');\n return [{ specifier: 'orange:main' }];\n }\n });\n\n registry.register('apple:main', Apple);\n registry.register('orange:main', Orange);\n\n container.lookup('apple:main');\n container.lookup('apple:main');\n }\n\n ['@test An object with its owner pre-set should be returned from ownerInjection'](assert) {\n let owner = {};\n let registry = new _container.Registry();\n let container = registry.container({ owner });\n\n let result = container.ownerInjection();\n\n assert.equal(result[_owner.OWNER], owner, 'owner is properly included');\n }\n\n ['@test lookup passes options through to expandlocallookup'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.expandLocalLookup = (fullName, options) => {\n assert.ok(true, 'expandLocalLookup was called');\n assert.equal(fullName, 'foo:bar');\n assert.deepEqual(options, { source: 'baz:qux' });\n\n return 'controller:post';\n };\n\n let PostControllerLookupResult = container.lookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.ok(PostControllerLookupResult instanceof PostController);\n }\n\n ['@test #factoryFor class is registered class'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.deepEqual(factoryManager.class, Component, 'No double extend');\n }\n\n ['@test #factoryFor must supply a fullname']() {\n let registry = new _container.Registry();\n let container = registry.container();\n expectAssertion(() => {\n container.factoryFor('chad-bar');\n }, /fullName must be a proper full name/);\n }\n\n ['@test #factoryFor returns a factory manager'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.ok(factoryManager.create);\n assert.ok(factoryManager.class);\n }\n\n ['@test #factoryFor returns a cached factory manager for the same type'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('component:baz-bar', Component);\n\n let factoryManager1 = container.factoryFor('component:foo-bar');\n let factoryManager2 = container.factoryFor('component:foo-bar');\n let factoryManager3 = container.factoryFor('component:baz-bar');\n\n assert.equal(factoryManager1, factoryManager2, 'cache hit');\n assert.notEqual(factoryManager1, factoryManager3, 'cache miss');\n }\n\n ['@test #factoryFor class returns the factory function'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.deepEqual(factoryManager.class, Component, 'No double extend');\n }\n\n ['@test #factoryFor instance have a common parent'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager1 = container.factoryFor('component:foo-bar');\n let factoryManager2 = container.factoryFor('component:foo-bar');\n let instance1 = factoryManager1.create({ foo: 'foo' });\n let instance2 = factoryManager2.create({ bar: 'bar' });\n\n assert.deepEqual(instance1.constructor, instance2.constructor);\n }\n\n ['@test can properly reset cache'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factory1 = container.factoryFor('component:foo-bar');\n let factory2 = container.factoryFor('component:foo-bar');\n\n let instance1 = container.lookup('component:foo-bar');\n let instance2 = container.lookup('component:foo-bar');\n\n assert.equal(instance1, instance2);\n assert.equal(factory1, factory2);\n\n container.reset();\n\n let factory3 = container.factoryFor('component:foo-bar');\n let instance3 = container.lookup('component:foo-bar');\n\n assert.notEqual(instance1, instance3);\n assert.notEqual(factory1, factory3);\n }\n\n ['@test #factoryFor created instances come with instance injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n let Ajax = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('util:ajax', Ajax);\n registry.injection('component:foo-bar', 'ajax', 'util:ajax');\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let component = componentFactory.create();\n\n assert.ok(component.ajax);\n assert.ok(component.ajax instanceof Ajax);\n }\n\n ['@test #factoryFor options passed to create clobber injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n let Ajax = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('util:ajax', Ajax);\n registry.injection('component:foo-bar', 'ajax', 'util:ajax');\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instrance = componentFactory.create({ ajax: 'fetch' });\n\n assert.equal(instrance.ajax, 'fetch');\n }\n\n ['@test #factoryFor does not add properties to the object being instantiated when _initFactory is present'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n class Component {\n static _initFactory() {}\n static create(options) {\n let instance = new this();\n (0, _polyfills.assign)(instance, options);\n return instance;\n }\n }\n registry.register('component:foo-bar', Component);\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instance = componentFactory.create();\n\n // note: _guid and isDestroyed are being set in the `factory` constructor\n // not via registry/container shenanigans\n assert.deepEqual(Object.keys(instance), []);\n }\n\n [`@test assert when calling lookup after destroy on a container`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n let instance = container.lookup('component:foo-bar');\n assert.ok(instance, 'precond lookup successful');\n\n this.runTask(() => {\n container.destroy();\n container.finalizeDestroy();\n });\n\n expectAssertion(() => {\n container.lookup('component:foo-bar');\n });\n }\n\n [`@test assert when calling factoryFor after destroy on a container`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n let instance = container.factoryFor('component:foo-bar');\n assert.ok(instance, 'precond lookup successful');\n\n this.runTask(() => {\n container.destroy();\n container.finalizeDestroy();\n });\n\n expectAssertion(() => {\n container.factoryFor('component:foo-bar');\n });\n }\n\n // this is skipped until templates and the glimmer environment do not require `OWNER` to be\n // passed in as constructor args\n ['@skip #factoryFor does not add properties to the object being instantiated'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n class Component {\n static create(options) {\n let instance = new this();\n (0, _polyfills.assign)(instance, options);\n return instance;\n }\n }\n registry.register('component:foo-bar', Component);\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instance = componentFactory.create();\n\n // note: _guid and isDestroyed are being set in the `factory` constructor\n // not via registry/container shenanigans\n assert.deepEqual(Object.keys(instance), []);\n }\n });\n\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n (0, _internalTestHelpers.moduleFor)('Container module unification', class extends _internalTestHelpers.AbstractTestCase {\n ['@test The container can expand and resolve a source to factoryFor'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedSource = 'template:routes/application';\n let registry = new _container.Registry();\n let resolveCount = 0;\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.source, expectedSource, 'source is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n resolveCount++;\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n assert.strictEqual(container.factoryFor(lookup, { source: expectedSource }).class, PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(container.factoryFor(lookup, { source: expectedSource }).class, PrivateComponent, 'The correct factory was provided again');\n assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time');\n }\n\n ['@test The container can expand and resolve a source to lookup']() {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedSource = 'template:routes/application';\n let registry = new _container.Registry();\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.source, expectedSource, 'source is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n let result = container.lookup(lookup, { source: expectedSource });\n this.assert.ok(result instanceof PrivateComponent, 'The correct factory was provided');\n\n this.assert.ok(container.cache[expandedKey] instanceof PrivateComponent, 'The correct factory was stored in the cache with the correct key which includes the source.');\n }\n\n ['@test The container can expand and resolve a namespace to factoryFor'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedNamespace = 'my-addon';\n let registry = new _container.Registry();\n let resolveCount = 0;\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.namespace, expectedNamespace, 'namespace is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n resolveCount++;\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n assert.strictEqual(container.factoryFor(lookup, { namespace: expectedNamespace }).class, PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(container.factoryFor(lookup, { namespace: expectedNamespace }).class, PrivateComponent, 'The correct factory was provided again');\n assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time');\n }\n\n ['@test The container can expand and resolve a namespace to lookup']() {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedNamespace = 'my-addon';\n let registry = new _container.Registry();\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.namespace, expectedNamespace, 'namespace is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n let result = container.lookup(lookup, { namespace: expectedNamespace });\n this.assert.ok(result instanceof PrivateComponent, 'The correct factory was provided');\n\n this.assert.ok(container.cache[expandedKey] instanceof PrivateComponent, 'The correct factory was stored in the cache with the correct key which includes the source.');\n }\n });\n }\n});","enifed('@ember/-internals/container/tests/owner_test', ['@ember/-internals/owner', 'internal-test-helpers'], function (_owner, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Owner', class extends _internalTestHelpers.AbstractTestCase {\n ['@test An owner can be set with `setOwner` and retrieved with `getOwner`'](assert) {\n let owner = {};\n let obj = {};\n\n assert.strictEqual((0, _owner.getOwner)(obj), undefined, 'owner has not been set');\n\n (0, _owner.setOwner)(obj, owner);\n\n assert.strictEqual((0, _owner.getOwner)(obj), owner, 'owner has been set');\n\n assert.strictEqual(obj[_owner.OWNER], owner, 'owner has been set to the OWNER symbol');\n }\n });\n});","enifed('@ember/-internals/container/tests/registry_test', ['@ember/-internals/container', 'internal-test-helpers', '@ember/canary-features'], function (_container, _internalTestHelpers, _canaryFeatures) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Registry', class extends _internalTestHelpers.AbstractTestCase {\n ['@test A registered factory is returned from resolve'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let PostControllerFactory = registry.resolve('controller:post');\n\n assert.ok(PostControllerFactory, 'factory is returned');\n assert.ok(PostControllerFactory.create() instanceof PostController, 'The return of factory.create is an instance of PostController');\n }\n\n ['@test The registered factory returned from resolve is the same factory each time'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n assert.deepEqual(registry.resolve('controller:post'), registry.resolve('controller:post'), 'The return of resolve is always the same');\n }\n\n ['@test The registered value returned from resolve is the same value each time even if the value is falsy'](assert) {\n let registry = new _container.Registry();\n\n registry.register('falsy:value', null, { instantiate: false });\n\n assert.strictEqual(registry.resolve('falsy:value'), registry.resolve('falsy:value'), 'The return of resolve is always the same');\n }\n\n ['@test The value returned from resolver is the same value as the original value even if the value is falsy'](assert) {\n let resolver = {\n resolve(fullName) {\n if (fullName === 'falsy:value') {\n return null;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve('falsy:value'), null);\n }\n\n ['@test A registered factory returns true for `has` if an item is registered'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n assert.equal(registry.has('controller:post'), true, 'The `has` method returned true for registered factories');\n assert.equal(registry.has('controller:posts'), false, 'The `has` method returned false for unregistered factories');\n }\n\n ['@test Throw exception when trying to inject `type:thing` on all type(s)']() {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n expectAssertion(() => {\n registry.typeInjection('controller', 'injected', 'controller:post');\n }, /Cannot inject a 'controller:post' on other controller\\(s\\)\\./);\n }\n\n ['@test The registry can take a hook to resolve factories lazily'](assert) {\n let PostController = (0, _internalTestHelpers.factory)();\n let resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve('controller:post'), PostController, 'The correct factory was provided');\n }\n\n ['@test The registry respects the resolver hook for `has`'](assert) {\n let PostController = (0, _internalTestHelpers.factory)();\n let resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.ok(registry.has('controller:post'), 'the `has` method uses the resolver hook');\n }\n\n ['@test The registry normalizes names when resolving'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let type = registry.resolve('controller:normalized');\n\n assert.strictEqual(type, PostController, 'Normalizes the name when resolving');\n }\n\n ['@test The registry normalizes names when checking if the factory is registered'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function (fullName) {\n return fullName === 'controller:normalized' ? 'controller:post' : fullName;\n };\n\n registry.register('controller:post', PostController);\n let isPresent = registry.has('controller:normalized');\n\n assert.equal(isPresent, true, 'Normalizes the name when checking if the factory or instance is present');\n }\n\n ['@test The registry normalizes names when injecting'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let user = { name: 'Stef' };\n\n registry.normalize = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n registry.register('user:post', user, { instantiate: false });\n registry.injection('controller:post', 'user', 'controller:normalized');\n\n assert.deepEqual(registry.resolve('controller:post'), user, 'Normalizes the name when injecting');\n }\n\n ['@test cannot register an `undefined` factory'](assert) {\n let registry = new _container.Registry();\n\n assert.throws(() => {\n registry.register('controller:apple', undefined);\n }, '');\n }\n\n ['@test can re-register a factory'](assert) {\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n registry.register('controller:apple', FirstApple);\n registry.register('controller:apple', SecondApple);\n\n assert.ok(registry.resolve('controller:apple').create() instanceof SecondApple);\n }\n\n ['@test cannot re-register a factory if it has been resolved'](assert) {\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n registry.register('controller:apple', FirstApple);\n assert.strictEqual(registry.resolve('controller:apple'), FirstApple);\n\n expectAssertion(function () {\n registry.register('controller:apple', SecondApple);\n }, /Cannot re-register: 'controller:apple', as it has already been resolved\\./);\n\n assert.strictEqual(registry.resolve('controller:apple'), FirstApple);\n }\n\n ['@test registry.has should not accidentally cause injections on that factory to be run. (Mitigate merely on observing)'](assert) {\n assert.expect(1);\n\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n SecondApple.extend = function () {\n assert.ok(false, 'should not extend or touch the injected model, merely to inspect existence of another');\n };\n\n registry.register('controller:apple', FirstApple);\n registry.register('controller:second-apple', SecondApple);\n registry.injection('controller:apple', 'badApple', 'controller:second-apple');\n\n assert.ok(registry.has('controller:apple'));\n }\n\n ['@test registry.has should not error for invalid fullNames'](assert) {\n let registry = new _container.Registry();\n\n assert.ok(!registry.has('foo:bar:baz'));\n }\n\n ['@test once resolved, always return the same result'](assert) {\n let registry = new _container.Registry();\n\n registry.resolver = {\n resolve() {\n return 'bar';\n }\n };\n\n let Bar = registry.resolve('models:bar');\n\n registry.resolver = {\n resolve() {\n return 'not bar';\n }\n };\n\n assert.equal(registry.resolve('models:bar'), Bar);\n }\n\n ['@test factory resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n\n registry.resolve('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n }\n\n ['@test factory for non extendables (MODEL) resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n\n registry.resolve('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n }\n\n ['@test factory for non extendables resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = {};\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n\n registry.resolve('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n }\n\n ['@test registry.container creates a container'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n registry.register('controller:post', PostController);\n\n let container = registry.container();\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The lookup is an instance of the registered factory');\n }\n\n ['@test `describe` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n describe(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n lookupDescription(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.describe('controller:post'), 'controller:post-resolver', '`describe` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.describe('controller:post'), 'controller:post-fallback', '`describe` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.describe('controller:post'), 'controller:post', '`describe` by default returns argument.');\n }\n\n ['@test `normalizeFullName` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n normalizeFullName(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n normalize(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post-resolver', '`normalizeFullName` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post-fallback', '`normalizeFullName` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post', '`normalizeFullName` by default returns argument.');\n }\n\n ['@test `makeToString` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n makeToString(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n makeToString(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post-resolver', '`makeToString` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post-fallback', '`makeToString` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post', '`makeToString` by default returns argument.');\n }\n\n ['@test `resolve` can be handled by a fallback registry'](assert) {\n let fallback = new _container.Registry();\n\n let registry = new _container.Registry({ fallback: fallback });\n let PostController = (0, _internalTestHelpers.factory)();\n\n fallback.register('controller:post', PostController);\n\n let PostControllerFactory = registry.resolve('controller:post');\n\n assert.ok(PostControllerFactory, 'factory is returned');\n assert.ok(PostControllerFactory.create() instanceof PostController, 'The return of factory.create is an instance of PostController');\n }\n\n ['@test `has` can be handled by a fallback registry'](assert) {\n let fallback = new _container.Registry();\n\n let registry = new _container.Registry({ fallback: fallback });\n let PostController = (0, _internalTestHelpers.factory)();\n\n fallback.register('controller:post', PostController);\n\n assert.equal(registry.has('controller:post'), true, 'Fallback registry is checked for registration');\n }\n\n ['@test `getInjections` includes injections from a fallback registry'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n assert.strictEqual(registry.getInjections('model:user'), undefined, 'No injections in the primary registry');\n\n fallback.injection('model:user', 'post', 'model:post');\n\n assert.equal(registry.getInjections('model:user').length, 1, 'Injections from the fallback registry are merged');\n }\n\n ['@test `getTypeInjections` includes type injections from a fallback registry'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n assert.strictEqual(registry.getTypeInjections('model'), undefined, 'No injections in the primary registry');\n\n fallback.injection('model', 'source', 'source:main');\n\n assert.equal(registry.getTypeInjections('model').length, 1, 'Injections from the fallback registry are merged');\n }\n\n ['@test `knownForType` contains keys for each item of a given type'](assert) {\n let registry = new _container.Registry();\n\n registry.register('foo:bar-baz', 'baz');\n registry.register('foo:qux-fez', 'fez');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:bar-baz': true,\n 'foo:qux-fez': true\n });\n }\n\n ['@test `knownForType` includes fallback registry results'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n registry.register('foo:bar-baz', 'baz');\n registry.register('foo:qux-fez', 'fez');\n fallback.register('foo:zurp-zorp', 'zorp');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:bar-baz': true,\n 'foo:qux-fez': true,\n 'foo:zurp-zorp': true\n });\n }\n\n ['@test `knownForType` is called on the resolver if present'](assert) {\n assert.expect(3);\n\n let resolver = {\n knownForType(type) {\n assert.ok(true, 'knownForType called on the resolver');\n assert.equal(type, 'foo', 'the type was passed through');\n\n return { 'foo:yorp': true };\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n registry.register('foo:bar-baz', 'baz');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:yorp': true,\n 'foo:bar-baz': true\n });\n }\n\n ['@test resolver.expandLocalLookup is not required'](assert) {\n let registry = new _container.Registry({\n resolver: {}\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, null);\n }\n\n ['@test expandLocalLookup is called on the resolver if present'](assert) {\n assert.expect(4);\n\n let resolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test `expandLocalLookup` is handled by the resolver, then by the fallback registry, if available'](assert) {\n assert.expect(9);\n\n let fallbackResolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the fallback resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar-fallback';\n }\n };\n\n let resolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar-resolver';\n }\n };\n\n let fallbackRegistry = new _container.Registry({\n resolver: fallbackResolver\n });\n\n let registry = new _container.Registry({\n fallback: fallbackRegistry,\n resolver\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar-resolver', 'handled by the resolver');\n\n registry.resolver = null;\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar-fallback', 'handled by the fallback registry');\n\n registry.fallback = null;\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, null, 'null is returned by default when no resolver or fallback registry is present');\n }\n\n ['@test resolver.expandLocalLookup result is cached'](assert) {\n assert.expect(3);\n let result;\n\n let resolver = {\n expandLocalLookup: () => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test resolver.expandLocalLookup cache is busted when any unregister is called'](assert) {\n assert.expect(4);\n let result;\n\n let resolver = {\n expandLocalLookup: () => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n\n registry.unregister('foo:bar');\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test resolve calls expandLocallookup when it receives options.source'](assert) {\n assert.expect(3);\n\n let resolver = {\n resolve() {},\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n registry.resolve('foo:bar', {\n source: 'baz:qux'\n });\n }\n\n ['@test has uses expandLocalLookup'](assert) {\n assert.expect(5);\n let resolvedFullNames = [];\n let result;\n\n let resolver = {\n resolve(name) {\n resolvedFullNames.push(name);\n return 'yippie!';\n },\n\n expandLocalLookup: targetFullName => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n if (targetFullName === 'foo:bar') {\n return 'foo:qux/bar';\n } else {\n return null;\n }\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.has('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.ok(result, 'found foo:bar/qux');\n\n result = registry.has('foo:baz', {\n source: 'baz:qux'\n });\n\n assert.ok(!result, 'foo:baz/qux not found');\n\n assert.deepEqual(['foo:qux/bar'], resolvedFullNames);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Registry privatize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test valid format'](assert) {\n let privatized = (0, _container.privatize)(['secret:factory']);\n let matched = privatized.match(/^([^:]+):([^:]+)-(\\d+)$/);\n\n assert.ok(matched, 'privatized format was recognized');\n assert.equal(matched[1], 'secret');\n assert.equal(matched[2], 'factory');\n assert.ok(/^\\d+$/.test(matched[3]));\n }\n });\n\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n (0, _internalTestHelpers.moduleFor)('Registry module unification', class extends _internalTestHelpers.AbstractTestCase {\n ['@test The registry can pass a source to the resolver'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let type = 'component';\n let name = 'my-input';\n let specifier = `${type}:${name}`;\n let source = 'template:routes/application';\n\n let resolver = new _internalTestHelpers.ModuleBasedTestResolver();\n resolver.add({ specifier, source }, PrivateComponent);\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve(specifier), undefined, 'Not returned when specifier not scoped');\n assert.strictEqual(registry.resolve(specifier, { source }), PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(registry.resolve(specifier, { source }), PrivateComponent, 'The correct factory was provided again');\n }\n\n ['@test The registry can pass a namespace to the resolver'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let type = 'component';\n let name = 'my-input';\n let specifier = `${type}:${name}`;\n let source = 'template:routes/application';\n let namespace = 'my-addon';\n\n let resolver = new _internalTestHelpers.ModuleBasedTestResolver();\n resolver.add({ specifier, source, namespace }, PrivateComponent);\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve(specifier), undefined, 'Not returned when specifier not scoped');\n assert.strictEqual(registry.resolve(specifier, { source }), undefined, 'Not returned when specifier is missing namespace');\n assert.strictEqual(registry.resolve(specifier, { source, namespace }), PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(registry.resolve(specifier, { source, namespace }), PrivateComponent, 'The correct factory was provided again');\n }\n });\n }\n});","enifed('@ember/-internals/environment/index', ['exports', '@ember/-internals/environment/lib/context', '@ember/-internals/environment/lib/env', '@ember/-internals/environment/lib/global'], function (exports, _context, _env, _global) {\n 'use strict';\n\n exports.__esModule = true;\n Object.keys(_context).forEach(function (key) {\n if (key === \"default\" || key === \"__esModule\") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return _context[key];\n }\n });\n });\n Object.keys(_env).forEach(function (key) {\n if (key === \"default\" || key === \"__esModule\") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return _env[key];\n }\n });\n });\n Object.defineProperty(exports, 'global', {\n enumerable: true,\n get: function () {\n return _global.default;\n }\n });\n});","enifed('@ember/-internals/environment/lib/context', ['exports', '@ember/-internals/environment/lib/global'], function (exports, _global) {\n 'use strict';\n\n exports.__esModule = true;\n exports.context = undefined;\n exports.getLookup = getLookup;\n exports.setLookup = setLookup;\n\n // legacy imports/exports/lookup stuff (should we keep this??)\n const context = exports.context = function (global, Ember) {\n return Ember === undefined ? { imports: global, exports: global, lookup: global } : {\n // import jQuery\n imports: Ember.imports || global,\n // export Ember\n exports: Ember.exports || global,\n // search for Namespaces\n lookup: Ember.lookup || global\n };\n }(_global.default, _global.default.Ember);\n function getLookup() {\n return context.lookup;\n }\n function setLookup(value) {\n context.lookup = value;\n }\n});","enifed('@ember/-internals/environment/lib/env', ['exports', '@ember/-internals/environment/lib/global'], function (exports, _global) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ENV = undefined;\n exports.getENV = getENV;\n\n /**\n The hash of environment variables used to control various configuration\n settings. To specify your own or override default settings, add the\n desired properties to a global hash named `EmberENV` (or `ENV` for\n backwards compatibility with earlier versions of Ember). The `EmberENV`\n hash must be created before loading Ember.\n \n @class EmberENV\n @type Object\n @public\n */\n const ENV = exports.ENV = {\n ENABLE_OPTIONAL_FEATURES: false,\n /**\n Determines whether Ember should add to `Array`, `Function`, and `String`\n native object prototypes, a few extra methods in order to provide a more\n friendly API.\n We generally recommend leaving this option set to true however, if you need\n to turn it off, you can add the configuration property\n `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.\n Note, when disabled (the default configuration for Ember Addons), you will\n instead have to access all methods and functions from the Ember\n namespace.\n @property EXTEND_PROTOTYPES\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n EXTEND_PROTOTYPES: {\n Array: true,\n Function: true,\n String: true\n },\n /**\n The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log\n a full stack trace during deprecation warnings.\n @property LOG_STACKTRACE_ON_DEPRECATION\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n LOG_STACKTRACE_ON_DEPRECATION: true,\n /**\n The `LOG_VERSION` property, when true, tells Ember to log versions of all\n dependent libraries in use.\n @property LOG_VERSION\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n LOG_VERSION: true,\n RAISE_ON_DEPRECATION: false,\n STRUCTURED_PROFILE: false,\n /**\n Whether to insert a `
` wrapper around the\n application template. See RFC #280.\n This is not intended to be set directly, as the implementation may change in\n the future. Use `@ember/optional-features` instead.\n @property _APPLICATION_TEMPLATE_WRAPPER\n @for EmberENV\n @type Boolean\n @default true\n @private\n */\n _APPLICATION_TEMPLATE_WRAPPER: true,\n /**\n Whether to use Glimmer Component semantics (as opposed to the classic \"Curly\"\n components semantics) for template-only components. See RFC #278.\n This is not intended to be set directly, as the implementation may change in\n the future. Use `@ember/optional-features` instead.\n @property _TEMPLATE_ONLY_GLIMMER_COMPONENTS\n @for EmberENV\n @type Boolean\n @default false\n @private\n */\n _TEMPLATE_ONLY_GLIMMER_COMPONENTS: false,\n /**\n Whether the app is using jQuery. See RFC #294.\n This is not intended to be set directly, as the implementation may change in\n the future. Use `@ember/optional-features` instead.\n @property _JQUERY_INTEGRATION\n @for EmberENV\n @type Boolean\n @default true\n @private\n */\n _JQUERY_INTEGRATION: true,\n EMBER_LOAD_HOOKS: {},\n FEATURES: {}\n };\n (EmberENV => {\n if (typeof EmberENV !== 'object' || EmberENV === null) return;\n for (let flag in EmberENV) {\n if (!EmberENV.hasOwnProperty(flag) || flag === 'EXTEND_PROTOTYPES' || flag === 'EMBER_LOAD_HOOKS') continue;\n let defaultValue = ENV[flag];\n if (defaultValue === true) {\n ENV[flag] = EmberENV[flag] !== false;\n } else if (defaultValue === false) {\n ENV[flag] = EmberENV[flag] === true;\n }\n }\n let { EXTEND_PROTOTYPES } = EmberENV;\n if (EXTEND_PROTOTYPES !== undefined) {\n if (typeof EXTEND_PROTOTYPES === 'object' && EXTEND_PROTOTYPES !== null) {\n ENV.EXTEND_PROTOTYPES.String = EXTEND_PROTOTYPES.String !== false;\n ENV.EXTEND_PROTOTYPES.Function = EXTEND_PROTOTYPES.Function !== false;\n ENV.EXTEND_PROTOTYPES.Array = EXTEND_PROTOTYPES.Array !== false;\n } else {\n let isEnabled = EXTEND_PROTOTYPES !== false;\n ENV.EXTEND_PROTOTYPES.String = isEnabled;\n ENV.EXTEND_PROTOTYPES.Function = isEnabled;\n ENV.EXTEND_PROTOTYPES.Array = isEnabled;\n }\n }\n // TODO this does not seem to be used by anything,\n // can we remove it? do we need to deprecate it?\n let { EMBER_LOAD_HOOKS } = EmberENV;\n if (typeof EMBER_LOAD_HOOKS === 'object' && EMBER_LOAD_HOOKS !== null) {\n for (let hookName in EMBER_LOAD_HOOKS) {\n if (!EMBER_LOAD_HOOKS.hasOwnProperty(hookName)) continue;\n let hooks = EMBER_LOAD_HOOKS[hookName];\n if (Array.isArray(hooks)) {\n ENV.EMBER_LOAD_HOOKS[hookName] = hooks.filter(hook => typeof hook === 'function');\n }\n }\n }\n let { FEATURES } = EmberENV;\n if (typeof FEATURES === 'object' && FEATURES !== null) {\n for (let feature in FEATURES) {\n if (!FEATURES.hasOwnProperty(feature)) continue;\n ENV.FEATURES[feature] = FEATURES[feature] === true;\n }\n }\n })(_global.default.EmberENV || _global.default.ENV);\n function getENV() {\n return ENV;\n }\n});","enifed('@ember/-internals/environment/lib/global', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n // from lodash to catch fake globals\n function checkGlobal(value) {\n return value && value.Object === Object ? value : undefined;\n }\n // element ids can ruin global miss checks\n function checkElementIdShadowing(value) {\n return value && value.nodeType === undefined ? value : undefined;\n }\n // export real global\n exports.default = 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\n new Function('return this')();\n});","enifed(\"@ember/-internals/error-handling/index\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.getOnerror = getOnerror;\n exports.setOnerror = setOnerror;\n exports.getDispatchOverride = getDispatchOverride;\n exports.setDispatchOverride = setDispatchOverride;\n let onerror;\n const onErrorTarget = exports.onErrorTarget = {\n get onerror() {\n return onerror;\n }\n };\n // Ember.onerror getter\n function getOnerror() {\n return onerror;\n }\n // Ember.onerror setter\n function setOnerror(handler) {\n onerror = handler;\n }\n let dispatchOverride;\n // allows testing adapter to override dispatch\n function getDispatchOverride() {\n return dispatchOverride;\n }\n function setDispatchOverride(handler) {\n dispatchOverride = handler;\n }\n});","enifed('@ember/-internals/extension-support/index', ['exports', '@ember/-internals/extension-support/lib/data_adapter', '@ember/-internals/extension-support/lib/container_debug_adapter'], function (exports, _data_adapter, _container_debug_adapter) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'DataAdapter', {\n enumerable: true,\n get: function () {\n return _data_adapter.default;\n }\n });\n Object.defineProperty(exports, 'ContainerDebugAdapter', {\n enumerable: true,\n get: function () {\n return _container_debug_adapter.default;\n }\n });\n});","enifed('@ember/-internals/extension-support/lib/container_debug_adapter', ['exports', '@ember/string', '@ember/-internals/runtime'], function (exports, _string, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _runtime.Object.extend({\n /**\n The resolver instance of the application\n being debugged. This property will be injected\n on creation.\n @property resolver\n @default null\n @public\n */\n resolver: null,\n\n /**\n Returns true if it is possible to catalog a list of available\n classes in the resolver for a given type.\n @method canCatalogEntriesByType\n @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n @return {boolean} whether a list is available for this type.\n @public\n */\n canCatalogEntriesByType(type) {\n if (type === 'model' || type === 'template') {\n return false;\n }\n\n return true;\n },\n\n /**\n Returns the available classes a given type.\n @method catalogEntriesByType\n @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n @return {Array} An array of strings.\n @public\n */\n catalogEntriesByType(type) {\n let namespaces = (0, _runtime.A)(_runtime.Namespace.NAMESPACES);\n let types = (0, _runtime.A)();\n let typeSuffixRegex = new RegExp(`${(0, _string.classify)(type)}$`);\n\n namespaces.forEach(namespace => {\n for (let key in namespace) {\n if (!namespace.hasOwnProperty(key)) {\n continue;\n }\n if (typeSuffixRegex.test(key)) {\n let klass = namespace[key];\n if ((0, _runtime.typeOf)(klass) === 'class') {\n types.push((0, _string.dasherize)(key.replace(typeSuffixRegex, '')));\n }\n }\n }\n });\n return types;\n }\n });\n});","enifed('@ember/-internals/extension-support/lib/data_adapter', ['exports', '@ember/-internals/owner', '@ember/runloop', '@ember/-internals/metal', '@ember/string', '@ember/-internals/runtime'], function (exports, _owner, _runloop, _metal, _string, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _runtime.Object.extend({\n init() {\n this._super(...arguments);\n this.releaseMethods = (0, _runtime.A)();\n },\n\n /**\n The container-debug-adapter which is used\n to list all models.\n @property containerDebugAdapter\n @default undefined\n @since 1.5.0\n @public\n **/\n containerDebugAdapter: undefined,\n\n /**\n The number of attributes to send\n as columns. (Enough to make the record\n identifiable).\n @private\n @property attributeLimit\n @default 3\n @since 1.3.0\n */\n attributeLimit: 3,\n\n /**\n Ember Data > v1.0.0-beta.18\n requires string model names to be passed\n around instead of the actual factories.\n This is a stamp for the Ember Inspector\n to differentiate between the versions\n to be able to support older versions too.\n @public\n @property acceptsModelName\n */\n acceptsModelName: true,\n\n /**\n Stores all methods that clear observers.\n These methods will be called on destruction.\n @private\n @property releaseMethods\n @since 1.3.0\n */\n releaseMethods: (0, _runtime.A)(),\n\n /**\n Specifies how records can be filtered.\n Records returned will need to have a `filterValues`\n property with a key for every name in the returned array.\n @public\n @method getFilters\n @return {Array} List of objects defining filters.\n The object should have a `name` and `desc` property.\n */\n getFilters() {\n return (0, _runtime.A)();\n },\n\n /**\n Fetch the model types and observe them for changes.\n @public\n @method watchModelTypes\n @param {Function} typesAdded Callback to call to add types.\n Takes an array of objects containing wrapped types (returned from `wrapModelType`).\n @param {Function} typesUpdated Callback to call when a type has changed.\n Takes an array of objects containing wrapped types.\n @return {Function} Method to call to remove all observers\n */\n watchModelTypes(typesAdded, typesUpdated) {\n let modelTypes = this.getModelTypes();\n let releaseMethods = (0, _runtime.A)();\n let typesToSend;\n\n typesToSend = modelTypes.map(type => {\n let klass = type.klass;\n let wrapped = this.wrapModelType(klass, type.name);\n releaseMethods.push(this.observeModelType(type.name, typesUpdated));\n return wrapped;\n });\n\n typesAdded(typesToSend);\n\n let release = () => {\n releaseMethods.forEach(fn => fn());\n this.releaseMethods.removeObject(release);\n };\n this.releaseMethods.pushObject(release);\n return release;\n },\n\n _nameToClass(type) {\n if (typeof type === 'string') {\n let owner = (0, _owner.getOwner)(this);\n let Factory = owner.factoryFor(`model:${type}`);\n type = Factory && Factory.class;\n }\n return type;\n },\n\n /**\n Fetch the records of a given type and observe them for changes.\n @public\n @method watchRecords\n @param {String} modelName The model name.\n @param {Function} recordsAdded Callback to call to add records.\n Takes an array of objects containing wrapped records.\n The object should have the following properties:\n columnValues: {Object} The key and value of a table cell.\n object: {Object} The actual record object.\n @param {Function} recordsUpdated Callback to call when a record has changed.\n Takes an array of objects containing wrapped records.\n @param {Function} recordsRemoved Callback to call when a record has removed.\n Takes the following parameters:\n index: The array index where the records were removed.\n count: The number of records removed.\n @return {Function} Method to call to remove all observers.\n */\n watchRecords(modelName, recordsAdded, recordsUpdated, recordsRemoved) {\n let releaseMethods = (0, _runtime.A)();\n let klass = this._nameToClass(modelName);\n let records = this.getRecords(klass, modelName);\n let release;\n\n function recordUpdated(updatedRecord) {\n recordsUpdated([updatedRecord]);\n }\n\n let recordsToSend = records.map(record => {\n releaseMethods.push(this.observeRecord(record, recordUpdated));\n return this.wrapRecord(record);\n });\n\n let contentDidChange = (array, idx, removedCount, addedCount) => {\n for (let i = idx; i < idx + addedCount; i++) {\n let record = (0, _metal.objectAt)(array, i);\n let wrapped = this.wrapRecord(record);\n releaseMethods.push(this.observeRecord(record, recordUpdated));\n recordsAdded([wrapped]);\n }\n\n if (removedCount) {\n recordsRemoved(idx, removedCount);\n }\n };\n\n let observer = {\n didChange: contentDidChange,\n willChange() {\n return this;\n }\n };\n (0, _metal.addArrayObserver)(records, this, observer);\n\n release = () => {\n releaseMethods.forEach(fn => fn());\n (0, _metal.removeArrayObserver)(records, this, observer);\n this.releaseMethods.removeObject(release);\n };\n\n recordsAdded(recordsToSend);\n\n this.releaseMethods.pushObject(release);\n return release;\n },\n\n /**\n Clear all observers before destruction\n @private\n @method willDestroy\n */\n willDestroy() {\n this._super(...arguments);\n this.releaseMethods.forEach(fn => fn());\n },\n\n /**\n Detect whether a class is a model.\n Test that against the model class\n of your persistence library.\n @private\n @method detect\n @return boolean Whether the class is a model class or not.\n */\n detect() {\n return false;\n },\n\n /**\n Get the columns for a given model type.\n @private\n @method columnsForType\n @return {Array} An array of columns of the following format:\n name: {String} The name of the column.\n desc: {String} Humanized description (what would show in a table column name).\n */\n columnsForType() {\n return (0, _runtime.A)();\n },\n\n /**\n Adds observers to a model type class.\n @private\n @method observeModelType\n @param {String} modelName The model type name.\n @param {Function} typesUpdated Called when a type is modified.\n @return {Function} The function to call to remove observers.\n */\n\n observeModelType(modelName, typesUpdated) {\n let klass = this._nameToClass(modelName);\n let records = this.getRecords(klass, modelName);\n\n function onChange() {\n typesUpdated([this.wrapModelType(klass, modelName)]);\n }\n\n let observer = {\n didChange(array, idx, removedCount, addedCount) {\n // Only re-fetch records if the record count changed\n // (which is all we care about as far as model types are concerned).\n if (removedCount > 0 || addedCount > 0) {\n (0, _runloop.scheduleOnce)('actions', this, onChange);\n }\n },\n willChange() {\n return this;\n }\n };\n\n (0, _metal.addArrayObserver)(records, this, observer);\n\n let release = () => (0, _metal.removeArrayObserver)(records, this, observer);\n\n return release;\n },\n\n /**\n Wraps a given model type and observes changes to it.\n @private\n @method wrapModelType\n @param {Class} klass A model class.\n @param {String} modelName Name of the class.\n @return {Object} Contains the wrapped type and the function to remove observers\n Format:\n type: {Object} The wrapped type.\n The wrapped type has the following format:\n name: {String} The name of the type.\n count: {Integer} The number of records available.\n columns: {Columns} An array of columns to describe the record.\n object: {Class} The actual Model type class.\n release: {Function} The function to remove observers.\n */\n wrapModelType(klass, name) {\n let records = this.getRecords(klass, name);\n let typeToSend;\n\n typeToSend = {\n name,\n count: (0, _metal.get)(records, 'length'),\n columns: this.columnsForType(klass),\n object: klass\n };\n\n return typeToSend;\n },\n\n /**\n Fetches all models defined in the application.\n @private\n @method getModelTypes\n @return {Array} Array of model types.\n */\n getModelTypes() {\n let containerDebugAdapter = this.get('containerDebugAdapter');\n let types;\n\n if (containerDebugAdapter.canCatalogEntriesByType('model')) {\n types = containerDebugAdapter.catalogEntriesByType('model');\n } else {\n types = this._getObjectsOnNamespaces();\n }\n\n // New adapters return strings instead of classes.\n types = (0, _runtime.A)(types).map(name => {\n return {\n klass: this._nameToClass(name),\n name\n };\n });\n types = (0, _runtime.A)(types).filter(type => this.detect(type.klass));\n\n return (0, _runtime.A)(types);\n },\n\n /**\n Loops over all namespaces and all objects\n attached to them.\n @private\n @method _getObjectsOnNamespaces\n @return {Array} Array of model type strings.\n */\n _getObjectsOnNamespaces() {\n let namespaces = (0, _runtime.A)(_runtime.Namespace.NAMESPACES);\n let types = (0, _runtime.A)();\n\n namespaces.forEach(namespace => {\n for (let key in namespace) {\n if (!namespace.hasOwnProperty(key)) {\n continue;\n }\n // Even though we will filter again in `getModelTypes`,\n // we should not call `lookupFactory` on non-models\n if (!this.detect(namespace[key])) {\n continue;\n }\n let name = (0, _string.dasherize)(key);\n types.push(name);\n }\n });\n return types;\n },\n\n /**\n Fetches all loaded records for a given type.\n @private\n @method getRecords\n @return {Array} An array of records.\n This array will be observed for changes,\n so it should update when new records are added/removed.\n */\n getRecords() {\n return (0, _runtime.A)();\n },\n\n /**\n Wraps a record and observers changes to it.\n @private\n @method wrapRecord\n @param {Object} record The record instance.\n @return {Object} The wrapped record. Format:\n columnValues: {Array}\n searchKeywords: {Array}\n */\n wrapRecord(record) {\n let recordToSend = { object: record };\n\n recordToSend.columnValues = this.getRecordColumnValues(record);\n recordToSend.searchKeywords = this.getRecordKeywords(record);\n recordToSend.filterValues = this.getRecordFilterValues(record);\n recordToSend.color = this.getRecordColor(record);\n\n return recordToSend;\n },\n\n /**\n Gets the values for each column.\n @private\n @method getRecordColumnValues\n @return {Object} Keys should match column names defined\n by the model type.\n */\n getRecordColumnValues() {\n return {};\n },\n\n /**\n Returns keywords to match when searching records.\n @private\n @method getRecordKeywords\n @return {Array} Relevant keywords for search.\n */\n getRecordKeywords() {\n return (0, _runtime.A)();\n },\n\n /**\n Returns the values of filters defined by `getFilters`.\n @private\n @method getRecordFilterValues\n @param {Object} record The record instance.\n @return {Object} The filter values.\n */\n getRecordFilterValues() {\n return {};\n },\n\n /**\n Each record can have a color that represents its state.\n @private\n @method getRecordColor\n @param {Object} record The record instance\n @return {String} The records color.\n Possible options: black, red, blue, green.\n */\n getRecordColor() {\n return null;\n },\n\n /**\n Observes all relevant properties and re-sends the wrapped record\n when a change occurs.\n @private\n @method observerRecord\n @return {Function} The function to call to remove all observers.\n */\n observeRecord() {\n return function () {};\n }\n });\n});","enifed('@ember/-internals/extension-support/tests/container_debug_adapter_test', ['internal-test-helpers', '@ember/polyfills', '@ember/runloop', '@ember/controller', '@ember/debug', '@ember/-internals/extension-support/index'], function (_internalTestHelpers, _polyfills, _runloop, _controller, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug'); // Must be required to export Ember.ContainerDebugAdapter.\n\n\n (0, _internalTestHelpers.moduleFor)('Container Debug Adapter', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', () => {});\n super();\n this.adapter = this.application.__deprecatedInstance__.lookup('container-debug-adapter:main');\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true\n });\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n (0, _runloop.run)(() => {\n this.adapter.destroy();\n });\n\n super.teardown();\n }\n\n ['@test default ContainerDebugAdapter cannot catalog certain entries by type'](assert) {\n assert.equal(this.adapter.canCatalogEntriesByType('model'), false, 'canCatalogEntriesByType should return false for model');\n assert.equal(this.adapter.canCatalogEntriesByType('template'), false, 'canCatalogEntriesByType should return false for template');\n }\n\n ['@test default ContainerDebugAdapter can catalog typical entries by type'](assert) {\n assert.equal(this.adapter.canCatalogEntriesByType('controller'), true, 'canCatalogEntriesByType should return true for controller');\n assert.equal(this.adapter.canCatalogEntriesByType('route'), true, 'canCatalogEntriesByType should return true for route');\n assert.equal(this.adapter.canCatalogEntriesByType('view'), true, 'canCatalogEntriesByType should return true for view');\n }\n\n ['@test default ContainerDebugAdapter catalogs controller entries'](assert) {\n this.application.PostController = _controller.default.extend();\n let controllerClasses = this.adapter.catalogEntriesByType('controller');\n\n assert.equal(controllerClasses.length, 1, 'found 1 class');\n assert.equal(controllerClasses[0], 'post', 'found the right class');\n }\n });\n});","enifed('@ember/-internals/extension-support/tests/data_adapter_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/extension-support/lib/data_adapter', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _data_adapter, _internalTestHelpers) {\n 'use strict';\n\n let adapter;\n const Model = _runtime.Object.extend();\n\n const PostClass = Model.extend();\n\n const DataAdapter = _data_adapter.default.extend({\n detect(klass) {\n return klass !== Model && Model.detect(klass);\n },\n init() {\n this._super(...arguments);\n this.set('containerDebugAdapter', {\n canCatalogEntriesByType() {\n return true;\n },\n catalogEntriesByType() {\n return (0, _runtime.A)(['post']);\n }\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Data Adapter', class extends _internalTestHelpers.ApplicationTestCase {\n teardown() {\n super.teardown();\n adapter = undefined;\n }\n\n ['@test Model types added'](assert) {\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return (0, _runtime.A)([1, 2, 3]);\n },\n columnsForType() {\n return [{ name: 'title', desc: 'Title' }];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n let adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded(types) {\n assert.equal(types.length, 1);\n let postType = types[0];\n assert.equal(postType.name, 'post', 'Correctly sets the name');\n assert.equal(postType.count, 3, 'Correctly sets the record count');\n assert.strictEqual(postType.object, PostClass, 'Correctly sets the object');\n assert.deepEqual(postType.columns, [{ name: 'title', desc: 'Title' }], 'Correctly sets the columns');\n }\n\n adapter.watchModelTypes(modelTypesAdded);\n });\n }\n\n ['@test getRecords gets a model name as second argument'](assert) {\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords(klass, name) {\n assert.equal(name, 'post');\n return (0, _runtime.A)();\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n adapter.watchModelTypes(function () {});\n });\n }\n\n ['@test Model types added with custom container-debug-adapter'](assert) {\n let StubContainerDebugAdapter = _runtime.Object.extend({\n canCatalogEntriesByType() {\n return true;\n },\n catalogEntriesByType() {\n return (0, _runtime.A)(['post']);\n }\n });\n this.add('container-debug-adapter:main', StubContainerDebugAdapter);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return (0, _runtime.A)([1, 2, 3]);\n },\n columnsForType() {\n return [{ name: 'title', desc: 'Title' }];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n let adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded(types) {\n assert.equal(types.length, 1);\n let postType = types[0];\n assert.equal(postType.name, 'post', 'Correctly sets the name');\n assert.equal(postType.count, 3, 'Correctly sets the record count');\n assert.strictEqual(postType.object, PostClass, 'Correctly sets the object');\n assert.deepEqual(postType.columns, [{ name: 'title', desc: 'Title' }], 'Correctly sets the columns');\n }\n\n adapter.watchModelTypes(modelTypesAdded);\n });\n }\n\n ['@test Model Types Updated'](assert) {\n let records = (0, _runtime.A)([1, 2, 3]);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return records;\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded() {\n (0, _runloop.run)(() => {\n records.pushObject(4);\n });\n }\n\n function modelTypesUpdated(types) {\n let postType = types[0];\n assert.equal(postType.count, 4, 'Correctly updates the count');\n }\n\n adapter.watchModelTypes(modelTypesAdded, modelTypesUpdated);\n });\n }\n\n ['@test Model Types Updated but Unchanged Do not Trigger Callbacks'](assert) {\n assert.expect(0);\n let records = (0, _runtime.A)([1, 2, 3]);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return records;\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded() {\n (0, _runloop.run)(() => {\n records.arrayContentDidChange(0, 0, 0);\n });\n }\n\n function modelTypesUpdated() {\n assert.ok(false, \"modelTypesUpdated should not be triggered if the array didn't change\");\n }\n\n adapter.watchModelTypes(modelTypesAdded, modelTypesUpdated);\n });\n }\n\n ['@test Records Added'](assert) {\n let countAdded = 1;\n let post = PostClass.create();\n let recordList = (0, _runtime.A)([post]);\n\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return recordList;\n },\n getRecordColor() {\n return 'blue';\n },\n getRecordColumnValues() {\n return { title: 'Post ' + countAdded };\n },\n getRecordKeywords() {\n return ['Post ' + countAdded];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function recordsAdded(records) {\n let record = records[0];\n assert.equal(record.color, 'blue', 'Sets the color correctly');\n assert.deepEqual(record.columnValues, { title: 'Post ' + countAdded }, 'Sets the column values correctly');\n assert.deepEqual(record.searchKeywords, ['Post ' + countAdded], 'Sets search keywords correctly');\n assert.strictEqual(record.object, post, 'Sets the object to the record instance');\n }\n\n adapter.watchRecords('post', recordsAdded);\n countAdded++;\n post = PostClass.create();\n recordList.pushObject(post);\n });\n }\n\n ['@test Observes and releases a record correctly'](assert) {\n let updatesCalled = 0;\n let post = PostClass.create({ title: 'Post' });\n let recordList = (0, _runtime.A)([post]);\n\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return recordList;\n },\n observeRecord(record, recordUpdated) {\n let self = this;\n function callback() {\n recordUpdated(self.wrapRecord(record));\n }\n (0, _metal.addObserver)(record, 'title', callback);\n return function () {\n (0, _metal.removeObserver)(record, 'title', callback);\n };\n },\n getRecordColumnValues(record) {\n return { title: (0, _metal.get)(record, 'title') };\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function recordsAdded() {\n (0, _metal.set)(post, 'title', 'Post Modified');\n }\n\n function recordsUpdated(records) {\n updatesCalled++;\n assert.equal(records[0].columnValues.title, 'Post Modified');\n }\n\n let release = adapter.watchRecords('post', recordsAdded, recordsUpdated);\n release();\n (0, _metal.set)(post, 'title', 'New Title');\n assert.equal(updatesCalled, 1, 'Release function removes observers');\n });\n }\n\n ['@test _nameToClass does not error when not found'](assert) {\n this.add('data-adapter:main', DataAdapter);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n let klass = adapter._nameToClass('foo');\n\n assert.equal(klass, undefined, 'returns undefined');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/index', ['exports', '@ember/-internals/glimmer/lib/templates/root', '@ember/-internals/glimmer/lib/template', '@ember/-internals/glimmer/lib/components/checkbox', '@ember/-internals/glimmer/lib/components/text_field', '@ember/-internals/glimmer/lib/components/text_area', '@ember/-internals/glimmer/lib/components/link-to', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/helper', '@ember/-internals/glimmer/lib/environment', '@ember/-internals/glimmer/lib/utils/string', '@ember/-internals/glimmer/lib/renderer', '@ember/-internals/glimmer/lib/template_registry', '@ember/-internals/glimmer/lib/setup-registry', '@ember/-internals/glimmer/lib/dom', '@ember/-internals/glimmer/lib/syntax', '@ember/-internals/glimmer/lib/component-managers/abstract', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/utils/iterable', '@ember/-internals/glimmer/lib/utils/debug-stack', '@ember/-internals/glimmer/lib/views/outlet', '@ember/-internals/glimmer/lib/component-managers/custom', '@ember/-internals/glimmer/lib/utils/custom-component-manager', '@ember/-internals/glimmer/lib/utils/serialization-first-node-helpers'], function (exports, _root, _template, _checkbox, _text_field, _text_area, _linkTo, _component, _helper, _environment, _string, _renderer, _template_registry, _setupRegistry, _dom, _syntax, _abstract, _references, _iterable, _debugStack, _outlet, _custom, _customComponentManager, _serializationFirstNodeHelpers) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'RootTemplate', {\n enumerable: true,\n get: function () {\n return _root.default;\n }\n });\n Object.defineProperty(exports, 'template', {\n enumerable: true,\n get: function () {\n return _template.default;\n }\n });\n Object.defineProperty(exports, 'Checkbox', {\n enumerable: true,\n get: function () {\n return _checkbox.default;\n }\n });\n Object.defineProperty(exports, 'TextField', {\n enumerable: true,\n get: function () {\n return _text_field.default;\n }\n });\n Object.defineProperty(exports, 'TextArea', {\n enumerable: true,\n get: function () {\n return _text_area.default;\n }\n });\n Object.defineProperty(exports, 'LinkComponent', {\n enumerable: true,\n get: function () {\n return _linkTo.default;\n }\n });\n Object.defineProperty(exports, 'Component', {\n enumerable: true,\n get: function () {\n return _component.default;\n }\n });\n Object.defineProperty(exports, 'ROOT_REF', {\n enumerable: true,\n get: function () {\n return _component.ROOT_REF;\n }\n });\n Object.defineProperty(exports, 'Helper', {\n enumerable: true,\n get: function () {\n return _helper.default;\n }\n });\n Object.defineProperty(exports, 'helper', {\n enumerable: true,\n get: function () {\n return _helper.helper;\n }\n });\n Object.defineProperty(exports, 'Environment', {\n enumerable: true,\n get: function () {\n return _environment.default;\n }\n });\n Object.defineProperty(exports, 'SafeString', {\n enumerable: true,\n get: function () {\n return _string.SafeString;\n }\n });\n Object.defineProperty(exports, 'escapeExpression', {\n enumerable: true,\n get: function () {\n return _string.escapeExpression;\n }\n });\n Object.defineProperty(exports, 'htmlSafe', {\n enumerable: true,\n get: function () {\n return _string.htmlSafe;\n }\n });\n Object.defineProperty(exports, 'isHTMLSafe', {\n enumerable: true,\n get: function () {\n return _string.isHTMLSafe;\n }\n });\n Object.defineProperty(exports, 'Renderer', {\n enumerable: true,\n get: function () {\n return _renderer.Renderer;\n }\n });\n Object.defineProperty(exports, 'InertRenderer', {\n enumerable: true,\n get: function () {\n return _renderer.InertRenderer;\n }\n });\n Object.defineProperty(exports, 'InteractiveRenderer', {\n enumerable: true,\n get: function () {\n return _renderer.InteractiveRenderer;\n }\n });\n Object.defineProperty(exports, '_resetRenderers', {\n enumerable: true,\n get: function () {\n return _renderer._resetRenderers;\n }\n });\n Object.defineProperty(exports, 'renderSettled', {\n enumerable: true,\n get: function () {\n return _renderer.renderSettled;\n }\n });\n Object.defineProperty(exports, 'getTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.getTemplate;\n }\n });\n Object.defineProperty(exports, 'setTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.setTemplate;\n }\n });\n Object.defineProperty(exports, 'hasTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.hasTemplate;\n }\n });\n Object.defineProperty(exports, 'getTemplates', {\n enumerable: true,\n get: function () {\n return _template_registry.getTemplates;\n }\n });\n Object.defineProperty(exports, 'setTemplates', {\n enumerable: true,\n get: function () {\n return _template_registry.setTemplates;\n }\n });\n Object.defineProperty(exports, 'setupEngineRegistry', {\n enumerable: true,\n get: function () {\n return _setupRegistry.setupEngineRegistry;\n }\n });\n Object.defineProperty(exports, 'setupApplicationRegistry', {\n enumerable: true,\n get: function () {\n return _setupRegistry.setupApplicationRegistry;\n }\n });\n Object.defineProperty(exports, 'DOMChanges', {\n enumerable: true,\n get: function () {\n return _dom.DOMChanges;\n }\n });\n Object.defineProperty(exports, 'NodeDOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _dom.NodeDOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, 'DOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _dom.DOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, '_registerMacros', {\n enumerable: true,\n get: function () {\n return _syntax.registerMacros;\n }\n });\n Object.defineProperty(exports, '_experimentalMacros', {\n enumerable: true,\n get: function () {\n return _syntax.experimentalMacros;\n }\n });\n Object.defineProperty(exports, 'AbstractComponentManager', {\n enumerable: true,\n get: function () {\n return _abstract.default;\n }\n });\n Object.defineProperty(exports, 'UpdatableReference', {\n enumerable: true,\n get: function () {\n return _references.UpdatableReference;\n }\n });\n Object.defineProperty(exports, 'INVOKE', {\n enumerable: true,\n get: function () {\n return _references.INVOKE;\n }\n });\n Object.defineProperty(exports, 'iterableFor', {\n enumerable: true,\n get: function () {\n return _iterable.default;\n }\n });\n Object.defineProperty(exports, 'DebugStack', {\n enumerable: true,\n get: function () {\n return _debugStack.default;\n }\n });\n Object.defineProperty(exports, 'OutletView', {\n enumerable: true,\n get: function () {\n return _outlet.default;\n }\n });\n Object.defineProperty(exports, 'capabilities', {\n enumerable: true,\n get: function () {\n return _custom.capabilities;\n }\n });\n Object.defineProperty(exports, 'setComponentManager', {\n enumerable: true,\n get: function () {\n return _customComponentManager.setComponentManager;\n }\n });\n Object.defineProperty(exports, 'getComponentManager', {\n enumerable: true,\n get: function () {\n return _customComponentManager.getComponentManager;\n }\n });\n Object.defineProperty(exports, 'isSerializationFirstNode', {\n enumerable: true,\n get: function () {\n return _serializationFirstNodeHelpers.isSerializationFirstNode;\n }\n });\n});","enifed(\"@ember/-internals/glimmer/lib/compile-time-lookup\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n class CompileTimeLookup {\n constructor(resolver) {\n this.resolver = resolver;\n }\n getCapabilities(handle) {\n let definition = this.resolver.resolve(handle);\n let { manager, state } = definition;\n return manager.getCapabilities(state);\n }\n getLayout(handle) {\n const { manager, state } = this.resolver.resolve(handle);\n const capabilities = manager.getCapabilities(state);\n if (capabilities.dynamicLayout) {\n return null;\n }\n const invocation = manager.getLayout(state, this.resolver);\n return {\n // TODO: this seems weird, it already is compiled\n compile() {\n return invocation.handle;\n },\n symbolTable: invocation.symbolTable\n };\n }\n lookupHelper(name, referrer) {\n return this.resolver.lookupHelper(name, referrer);\n }\n lookupModifier(name, referrer) {\n return this.resolver.lookupModifier(name, referrer);\n }\n lookupComponentDefinition(name, referrer) {\n return this.resolver.lookupComponentHandle(name, referrer);\n }\n lookupPartial(name, referrer) {\n return this.resolver.lookupPartial(name, referrer);\n }\n }\n exports.default = CompileTimeLookup;\n});","enifed('@ember/-internals/glimmer/lib/component-managers/abstract', ['exports', '@glimmer/env'], function (exports, _env) {\n 'use strict';\n\n exports.__esModule = true;\n\n // implements the ComponentManager interface as defined in glimmer:\n // tslint:disable-next-line:max-line-length\n // https://github.com/glimmerjs/glimmer-vm/blob/v0.24.0-beta.4/packages/%40glimmer/runtime/lib/component/interfaces.ts#L21\n class AbstractManager {\n constructor() {\n this.debugStack = undefined;\n }\n prepareArgs(_state, _args) {\n return null;\n }\n didCreateElement(_component, _element, _operations) {}\n // noop\n\n // inheritors should also call `this.debugStack.pop()` to\n // ensure the rerendering assertion messages are properly\n // maintained\n didRenderLayout(_component, _bounds) {\n // noop\n }\n didCreate(_bucket) {}\n // noop\n\n // inheritors should also call `this._pushToDebugStack`\n // to ensure the rerendering assertion messages are\n // properly maintained\n update(_bucket, _dynamicScope) {}\n // noop\n\n // inheritors should also call `this.debugStack.pop()` to\n // ensure the rerendering assertion messages are properly\n // maintained\n didUpdateLayout(_bucket, _bounds) {\n // noop\n }\n didUpdate(_bucket) {\n // noop\n }\n }\n exports.default = AbstractManager;\n if (_env.DEBUG) {\n AbstractManager.prototype._pushToDebugStack = function (name, environment) {\n this.debugStack = environment.debugStack;\n this.debugStack.push(name);\n };\n AbstractManager.prototype._pushEngineToDebugStack = function (name, environment) {\n this.debugStack = environment.debugStack;\n this.debugStack.pushEngine(name);\n };\n }\n});","enifed('@ember/-internals/glimmer/lib/component-managers/curly', ['exports', '@ember/-internals/container', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/-internals/utils', '@ember/-internals/views', '@ember/debug', '@ember/deprecated-features', '@ember/instrumentation', '@ember/polyfills', '@glimmer/env', '@glimmer/reference', '@glimmer/runtime', '@glimmer/util', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/utils/bindings', '@ember/-internals/glimmer/lib/utils/curly-component-state-bucket', '@ember/-internals/glimmer/lib/utils/process-args', '@ember/-internals/glimmer/lib/component-managers/abstract'], function (exports, _container, _metal, _owner, _utils, _views, _debug, _deprecatedFeatures, _instrumentation, _polyfills, _env, _reference, _runtime, _util, _component, _bindings, _curlyComponentStateBucket, _processArgs, _abstract) {\n 'use strict';\n\n exports.__esModule = true;\n exports.CurlyComponentDefinition = exports.CURLY_CAPABILITIES = undefined;\n exports.validatePositionalParameters = validatePositionalParameters;\n exports.processComponentInitializationAssertions = processComponentInitializationAssertions;\n exports.initialRenderInstrumentDetails = initialRenderInstrumentDetails;\n exports.rerenderInstrumentDetails = rerenderInstrumentDetails;\n\n function aliasIdToElementId(args, props) {\n if (args.named.has('id')) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`You cannot invoke a component with both 'id' and 'elementId' at the same time.`, !args.named.has('elementId'));\n props.elementId = props.id;\n }\n }\n function isTemplateFactory(template) {\n return typeof template.create === 'function';\n }\n // We must traverse the attributeBindings in reverse keeping track of\n // what has already been applied. This is essentially refining the concatenated\n // properties applying right to left.\n function applyAttributeBindings(element, attributeBindings, component, operations) {\n let seen = [];\n let i = attributeBindings.length - 1;\n while (i !== -1) {\n let binding = attributeBindings[i];\n let parsed = _bindings.AttributeBinding.parse(binding);\n let attribute = parsed[1];\n if (seen.indexOf(attribute) === -1) {\n seen.push(attribute);\n _bindings.AttributeBinding.install(element, component, parsed, operations);\n }\n i--;\n }\n if (seen.indexOf('id') === -1) {\n let id = component.elementId ? component.elementId : (0, _utils.guidFor)(component);\n operations.setAttribute('id', _runtime.PrimitiveReference.create(id), false, null);\n }\n if (seen.indexOf('style') === -1) {\n _bindings.IsVisibleBinding.install(element, component, operations);\n }\n }\n const DEFAULT_LAYOUT = _container.privatize`template:components/-default`;\n class CurlyComponentManager extends _abstract.default {\n getLayout(state, _resolver) {\n return {\n // TODO fix\n handle: state.handle,\n symbolTable: state.symbolTable\n };\n }\n templateFor(component, resolver) {\n let layout = (0, _metal.get)(component, 'layout');\n if (layout !== undefined) {\n // This needs to be cached by template.id\n if (isTemplateFactory(layout)) {\n return resolver.createTemplate(layout, (0, _owner.getOwner)(component));\n } else {\n // we were provided an instance already\n return layout;\n }\n }\n let owner = (0, _owner.getOwner)(component);\n let layoutName = (0, _metal.get)(component, 'layoutName');\n if (layoutName) {\n let template = owner.lookup('template:' + layoutName);\n if (template) {\n return template;\n }\n }\n return owner.lookup(DEFAULT_LAYOUT);\n }\n getDynamicLayout({ component }, resolver) {\n const template = this.templateFor(component, resolver);\n const layout = template.asWrappedLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n getTagName(state) {\n const { component, hasWrappedElement } = state;\n if (!hasWrappedElement) {\n return null;\n }\n return component && component.tagName || 'div';\n }\n getCapabilities(state) {\n return state.capabilities;\n }\n prepareArgs(state, args) {\n const { positionalParams } = state.ComponentClass.class;\n // early exits\n if (positionalParams === undefined || positionalParams === null || args.positional.length === 0) {\n return null;\n }\n let named;\n if (typeof positionalParams === 'string') {\n (0, _debug.assert)(`You cannot specify positional parameters and the hash argument \\`${positionalParams}\\`.`, !args.named.has(positionalParams));\n named = { [positionalParams]: args.positional.capture() };\n (0, _polyfills.assign)(named, args.named.capture().map);\n } else if (Array.isArray(positionalParams) && positionalParams.length > 0) {\n const count = Math.min(positionalParams.length, args.positional.length);\n named = {};\n (0, _polyfills.assign)(named, args.named.capture().map);\n if (_deprecatedFeatures.POSITIONAL_PARAM_CONFLICT) {\n for (let i = 0; i < count; i++) {\n const name = positionalParams[i];\n (0, _debug.deprecate)(`You cannot specify both a positional param (at position ${i}) and the hash argument \\`${name}\\`.`, !args.named.has(name), {\n id: 'ember-glimmer.positional-param-conflict',\n until: '3.5.0'\n });\n named[name] = args.positional.at(i);\n }\n }\n } else {\n return null;\n }\n return { positional: _util.EMPTY_ARRAY, named };\n }\n /*\n * This hook is responsible for actually instantiating the component instance.\n * It also is where we perform additional bookkeeping to support legacy\n * features like exposed by view mixins like ChildViewSupport, ActionSupport,\n * etc.\n */\n create(environment, state, args, dynamicScope, callerSelfRef, hasBlock) {\n if (_env.DEBUG) {\n this._pushToDebugStack(`component:${state.name}`, environment);\n }\n // Get the nearest concrete component instance from the scope. \"Virtual\"\n // components will be skipped.\n let parentView = dynamicScope.view;\n // Get the Ember.Component subclass to instantiate for this component.\n let factory = state.ComponentClass;\n // Capture the arguments, which tells Glimmer to give us our own, stable\n // copy of the Arguments object that is safe to hold on to between renders.\n let capturedArgs = args.named.capture();\n let props = (0, _processArgs.processComponentArgs)(capturedArgs);\n // Alias `id` argument to `elementId` property on the component instance.\n aliasIdToElementId(args, props);\n // Set component instance's parentView property to point to nearest concrete\n // component.\n props.parentView = parentView;\n // Set whether this component was invoked with a block\n // (`{{#my-component}}{{/my-component}}`) or without one\n // (`{{my-component}}`).\n props[_component.HAS_BLOCK] = hasBlock;\n // Save the current `this` context of the template as the component's\n // `_targetObject`, so bubbled actions are routed to the right place.\n props._targetObject = callerSelfRef.value();\n // static layout asserts CurriedDefinition\n if (state.template) {\n props.layout = state.template;\n }\n // Now that we've built up all of the properties to set on the component instance,\n // actually create it.\n let component = factory.create(props);\n let finalizer = (0, _instrumentation._instrumentStart)('render.component', initialRenderInstrumentDetails, component);\n // We become the new parentView for downstream components, so save our\n // component off on the dynamic scope.\n dynamicScope.view = component;\n // Unless we're the root component, we need to add ourselves to our parent\n // component's childViews array.\n if (parentView !== null && parentView !== undefined) {\n (0, _views.addChildView)(parentView, component);\n }\n component.trigger('didReceiveAttrs');\n let hasWrappedElement = component.tagName !== '';\n // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n if (!hasWrappedElement) {\n if (environment.isInteractive) {\n component.trigger('willRender');\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n }\n // Track additional lifecycle metadata about this component in a state bucket.\n // Essentially we're saving off all the state we'll need in the future.\n let bucket = new _curlyComponentStateBucket.default(environment, component, capturedArgs, finalizer, hasWrappedElement);\n if (args.named.has('class')) {\n bucket.classRef = args.named.get('class');\n }\n if (_env.DEBUG) {\n processComponentInitializationAssertions(component, props);\n }\n if (environment.isInteractive && hasWrappedElement) {\n component.trigger('willRender');\n }\n return bucket;\n }\n getSelf({ component }) {\n return component[_component.ROOT_REF];\n }\n didCreateElement({ component, classRef, environment }, element, operations) {\n (0, _views.setViewElement)(component, element);\n let { attributeBindings, classNames, classNameBindings } = component;\n if (attributeBindings && attributeBindings.length) {\n applyAttributeBindings(element, attributeBindings, component, operations);\n } else {\n let id = component.elementId ? component.elementId : (0, _utils.guidFor)(component);\n operations.setAttribute('id', _runtime.PrimitiveReference.create(id), false, null);\n _bindings.IsVisibleBinding.install(element, component, operations);\n }\n if (classRef) {\n const ref = new _bindings.SimpleClassNameBindingReference(classRef, classRef['_propertyKey']);\n operations.setAttribute('class', ref, false, null);\n }\n if (classNames && classNames.length) {\n classNames.forEach(name => {\n operations.setAttribute('class', _runtime.PrimitiveReference.create(name), false, null);\n });\n }\n if (classNameBindings && classNameBindings.length) {\n classNameBindings.forEach(binding => {\n _bindings.ClassNameBinding.install(element, component, binding, operations);\n });\n }\n operations.setAttribute('class', _runtime.PrimitiveReference.create('ember-view'), false, null);\n if ('ariaRole' in component) {\n operations.setAttribute('role', (0, _bindings.referenceForKey)(component, 'ariaRole'), false, null);\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n }\n didRenderLayout(bucket, bounds) {\n bucket.component[_component.BOUNDS] = bounds;\n bucket.finalize();\n if (_env.DEBUG) {\n this.debugStack.pop();\n }\n }\n getTag({ args, component }) {\n return args ? (0, _reference.combine)([args.tag, component[_component.DIRTY_TAG]]) : component[_component.DIRTY_TAG];\n }\n didCreate({ component, environment }) {\n if (environment.isInteractive) {\n component._transitionTo('inDOM');\n component.trigger('didInsertElement');\n component.trigger('didRender');\n }\n }\n update(bucket) {\n let { component, args, argsRevision, environment } = bucket;\n if (_env.DEBUG) {\n this._pushToDebugStack(component._debugContainerKey, environment);\n }\n bucket.finalizer = (0, _instrumentation._instrumentStart)('render.component', rerenderInstrumentDetails, component);\n if (args && !args.tag.validate(argsRevision)) {\n let props = (0, _processArgs.processComponentArgs)(args);\n bucket.argsRevision = args.tag.value();\n component[_component.IS_DISPATCHING_ATTRS] = true;\n component.setProperties(props);\n component[_component.IS_DISPATCHING_ATTRS] = false;\n component.trigger('didUpdateAttrs');\n component.trigger('didReceiveAttrs');\n }\n if (environment.isInteractive) {\n component.trigger('willUpdate');\n component.trigger('willRender');\n }\n }\n didUpdateLayout(bucket) {\n bucket.finalize();\n if (_env.DEBUG) {\n this.debugStack.pop();\n }\n }\n didUpdate({ component, environment }) {\n if (environment.isInteractive) {\n component.trigger('didUpdate');\n component.trigger('didRender');\n }\n }\n getDestructor(stateBucket) {\n return stateBucket;\n }\n }\n exports.default = CurlyComponentManager;\n function validatePositionalParameters(named, positional, positionalParamsDefinition) {\n if (_env.DEBUG) {\n if (!named || !positional || !positional.length) {\n return;\n }\n let paramType = typeof positionalParamsDefinition;\n if (paramType === 'string') {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`You cannot specify positional parameters and the hash argument \\`${positionalParamsDefinition}\\`.`, !named.has(positionalParamsDefinition));\n } else {\n if (positional.length < positionalParamsDefinition.length) {\n positionalParamsDefinition = positionalParamsDefinition.slice(0, positional.length);\n }\n for (let i = 0; i < positionalParamsDefinition.length; i++) {\n let name = positionalParamsDefinition[i];\n (0, _debug.assert)(`You cannot specify both a positional param (at position ${i}) and the hash argument \\`${name}\\`.`, !named.has(name));\n }\n }\n }\n }\n function processComponentInitializationAssertions(component, props) {\n (0, _debug.assert)(`classNameBindings must be non-empty strings: ${component}`, (() => {\n let { classNameBindings } = component;\n for (let i = 0; i < classNameBindings.length; i++) {\n let binding = classNameBindings[i];\n if (typeof binding !== 'string' || binding.length === 0) {\n return false;\n }\n }\n return true;\n })());\n (0, _debug.assert)(`classNameBindings must not have spaces in them: ${component}`, (() => {\n let { classNameBindings } = component;\n for (let i = 0; i < classNameBindings.length; i++) {\n let binding = classNameBindings[i];\n if (binding.split(' ').length > 1) {\n return false;\n }\n }\n return true;\n })());\n (0, _debug.assert)(`You cannot use \\`classNameBindings\\` on a tag-less component: ${component}`, component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0);\n (0, _debug.assert)(`You cannot use \\`elementId\\` on a tag-less component: ${component}`, component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== '');\n (0, _debug.assert)(`You cannot use \\`attributeBindings\\` on a tag-less component: ${component}`, component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0);\n }\n function initialRenderInstrumentDetails(component) {\n return component.instrumentDetails({ initialRender: true });\n }\n function rerenderInstrumentDetails(component) {\n return component.instrumentDetails({ initialRender: false });\n }\n const CURLY_CAPABILITIES = exports.CURLY_CAPABILITIES = {\n dynamicLayout: true,\n dynamicTag: true,\n prepareArgs: true,\n createArgs: true,\n attributeHook: true,\n elementHook: true,\n createCaller: true,\n dynamicScope: true,\n updateHook: true,\n createInstance: true\n };\n const CURLY_COMPONENT_MANAGER = new CurlyComponentManager();\n class CurlyComponentDefinition {\n // tslint:disable-next-line:no-shadowed-variable\n constructor(name, ComponentClass, handle, template, args) {\n this.name = name;\n this.ComponentClass = ComponentClass;\n this.handle = handle;\n this.manager = CURLY_COMPONENT_MANAGER;\n const layout = template && template.asLayout();\n const symbolTable = layout ? layout.symbolTable : undefined;\n this.symbolTable = symbolTable;\n this.template = template;\n this.args = args;\n this.state = {\n name,\n ComponentClass,\n handle,\n template,\n capabilities: CURLY_CAPABILITIES,\n symbolTable\n };\n }\n }\n exports.CurlyComponentDefinition = CurlyComponentDefinition;\n});","enifed('@ember/-internals/glimmer/lib/component-managers/custom', ['exports', '@ember/debug', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/component-managers/abstract'], function (exports, _debug, _references, _abstract) {\n 'use strict';\n\n exports.__esModule = true;\n exports.CustomManagerDefinition = exports.CustomComponentState = undefined;\n exports.capabilities = capabilities;\n exports.hasAsyncLifeCycleCallbacks = hasAsyncLifeCycleCallbacks;\n exports.hasDestructors = hasDestructors;\n\n const CAPABILITIES = {\n dynamicLayout: false,\n dynamicTag: false,\n prepareArgs: false,\n createArgs: true,\n attributeHook: false,\n elementHook: false,\n createCaller: false,\n dynamicScope: true,\n updateHook: true,\n createInstance: true\n };\n function capabilities(managerAPI, options = {}) {\n (0, _debug.assert)('Invalid component manager compatibility specified', managerAPI === '3.4');\n return {\n asyncLifeCycleCallbacks: !!options.asyncLifecycleCallbacks,\n destructor: !!options.destructor\n };\n }\n function hasAsyncLifeCycleCallbacks(delegate) {\n return delegate.capabilities.asyncLifeCycleCallbacks;\n }\n function hasDestructors(delegate) {\n return delegate.capabilities.destructor;\n }\n function valueForCapturedArgs(args) {\n return {\n named: args.named.value(),\n positional: args.positional.value()\n };\n }\n /**\n The CustomComponentManager allows addons to provide custom component\n implementations that integrate seamlessly into Ember. This is accomplished\n through a delegate, registered with the custom component manager, which\n implements a set of hooks that determine component behavior.\n \n To create a custom component manager, instantiate a new CustomComponentManager\n class and pass the delegate as the first argument:\n \n ```js\n let manager = new CustomComponentManager({\n // ...delegate implementation...\n });\n ```\n \n ## Delegate Hooks\n \n Throughout the lifecycle of a component, the component manager will invoke\n delegate hooks that are responsible for surfacing those lifecycle changes to\n the end developer.\n \n * `create()` - invoked when a new instance of a component should be created\n * `update()` - invoked when the arguments passed to a component change\n * `getContext()` - returns the object that should be\n */\n class CustomComponentManager extends _abstract.default {\n create(_env, definition, args) {\n const { delegate } = definition;\n const capturedArgs = args.capture();\n let invocationArgs = valueForCapturedArgs(capturedArgs);\n const component = delegate.createComponent(definition.ComponentClass.class, invocationArgs);\n return new CustomComponentState(delegate, component, capturedArgs);\n }\n update({ delegate, component, args }) {\n delegate.updateComponent(component, valueForCapturedArgs(args));\n }\n didCreate({ delegate, component }) {\n if (hasAsyncLifeCycleCallbacks(delegate)) {\n delegate.didCreateComponent(component);\n }\n }\n didUpdate({ delegate, component }) {\n if (hasAsyncLifeCycleCallbacks(delegate)) {\n delegate.didUpdateComponent(component);\n }\n }\n getContext({ delegate, component }) {\n delegate.getContext(component);\n }\n getSelf({ delegate, component }) {\n const context = delegate.getContext(component);\n return new _references.RootReference(context);\n }\n getDestructor(state) {\n if (hasDestructors(state.delegate)) {\n return state;\n } else {\n return null;\n }\n }\n getCapabilities() {\n return CAPABILITIES;\n }\n getTag({ args }) {\n return args.tag;\n }\n didRenderLayout() {}\n getLayout(state) {\n return {\n handle: state.template.asLayout().compile(),\n symbolTable: state.symbolTable\n };\n }\n }\n exports.default = CustomComponentManager;\n const CUSTOM_COMPONENT_MANAGER = new CustomComponentManager();\n /**\n * Stores internal state about a component instance after it's been created.\n */\n class CustomComponentState {\n constructor(delegate, component, args) {\n this.delegate = delegate;\n this.component = component;\n this.args = args;\n }\n destroy() {\n const { delegate, component } = this;\n if (hasDestructors(delegate)) {\n delegate.destroyComponent(component);\n }\n }\n }\n exports.CustomComponentState = CustomComponentState;\n class CustomManagerDefinition {\n constructor(name, ComponentClass, delegate, template) {\n this.name = name;\n this.ComponentClass = ComponentClass;\n this.delegate = delegate;\n this.template = template;\n this.manager = CUSTOM_COMPONENT_MANAGER;\n const layout = template.asLayout();\n const symbolTable = layout.symbolTable;\n this.symbolTable = symbolTable;\n this.state = {\n name,\n ComponentClass,\n template,\n symbolTable,\n delegate\n };\n }\n }\n exports.CustomManagerDefinition = CustomManagerDefinition;\n});","enifed(\"@ember/-internals/glimmer/lib/component-managers/definition-state\", [], function () {\n \"use strict\";\n\n ;\n});","enifed('@ember/-internals/glimmer/lib/component-managers/mount', ['exports', '@glimmer/env', '@glimmer/reference', '@ember/-internals/routing', '@ember/canary-features', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/component-managers/abstract'], function (exports, _env, _reference, _routing, _canaryFeatures, _references, _abstract) {\n 'use strict';\n\n exports.__esModule = true;\n exports.MountDefinition = undefined;\n\n const CAPABILITIES = {\n dynamicLayout: true,\n dynamicTag: false,\n prepareArgs: false,\n createArgs: false,\n attributeHook: false,\n elementHook: false,\n createCaller: true,\n dynamicScope: true,\n updateHook: true,\n createInstance: true\n };\n class MountManager extends _abstract.default {\n getDynamicLayout(state, _) {\n let template = state.engine.lookup('template:application');\n let layout = template.asLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n getCapabilities() {\n return CAPABILITIES;\n }\n create(environment, state) {\n if (_env.DEBUG) {\n this._pushEngineToDebugStack(`engine:${state.name}`, environment);\n }\n // TODO\n // mount is a runtime helper, this shouldn't use dynamic layout\n // we should resolve the engine app template in the helper\n // it also should use the owner that looked up the mount helper.\n let engine = environment.owner.buildChildEngineInstance(state.name);\n engine.boot();\n let applicationFactory = engine.factoryFor(`controller:application`);\n let controllerFactory = applicationFactory || (0, _routing.generateControllerFactory)(engine, 'application');\n let controller;\n let self;\n let bucket;\n let tag;\n if (_canaryFeatures.EMBER_ENGINES_MOUNT_PARAMS) {\n let modelRef = state.modelRef;\n if (modelRef === undefined) {\n controller = controllerFactory.create();\n self = new _references.RootReference(controller);\n tag = _reference.CONSTANT_TAG;\n bucket = { engine, controller, self, tag };\n } else {\n let model = modelRef.value();\n let modelRev = modelRef.tag.value();\n controller = controllerFactory.create({ model });\n self = new _references.RootReference(controller);\n tag = modelRef.tag;\n bucket = { engine, controller, self, tag, modelRef, modelRev };\n }\n } else {\n controller = controllerFactory.create();\n self = new _references.RootReference(controller);\n tag = _reference.CONSTANT_TAG;\n bucket = { engine, controller, self, tag };\n }\n return bucket;\n }\n getSelf({ self }) {\n return self;\n }\n getTag(state) {\n return state.tag;\n }\n getDestructor({ engine }) {\n return engine;\n }\n didRenderLayout() {\n if (_env.DEBUG) {\n this.debugStack.pop();\n }\n }\n update(bucket) {\n if (_canaryFeatures.EMBER_ENGINES_MOUNT_PARAMS) {\n let { controller, modelRef, modelRev } = bucket;\n if (!modelRef.tag.validate(modelRev)) {\n let model = modelRef.value();\n bucket.modelRev = modelRef.tag.value();\n controller.set('model', model);\n }\n }\n }\n }\n const MOUNT_MANAGER = new MountManager();\n class MountDefinition {\n constructor(name, modelRef) {\n this.manager = MOUNT_MANAGER;\n this.state = { name, modelRef };\n }\n }\n exports.MountDefinition = MountDefinition;\n});","enifed('@ember/-internals/glimmer/lib/component-managers/outlet', ['exports', '@ember/-internals/environment', '@ember/-internals/utils', '@ember/instrumentation', '@ember/polyfills', '@glimmer/env', '@glimmer/reference', '@glimmer/runtime', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/component-managers/abstract'], function (exports, _environment, _utils, _instrumentation, _polyfills, _env2, _reference, _runtime, _references, _abstract) {\n 'use strict';\n\n exports.__esModule = true;\n exports.OutletComponentDefinition = undefined;\n exports.createRootOutlet = createRootOutlet;\n\n function instrumentationPayload(def) {\n return { object: `${def.name}:${def.outlet}` };\n }\n const CAPABILITIES = {\n dynamicLayout: false,\n dynamicTag: false,\n prepareArgs: false,\n createArgs: false,\n attributeHook: false,\n elementHook: false,\n createCaller: true,\n dynamicScope: true,\n updateHook: true,\n createInstance: true\n };\n class OutletComponentManager extends _abstract.default {\n create(environment, definition, _args, dynamicScope) {\n if (_env2.DEBUG) {\n this._pushToDebugStack(`template:${definition.template.referrer.moduleName}`, environment);\n }\n dynamicScope.outletState = definition.ref;\n let controller = definition.controller;\n let self = controller === undefined ? _runtime.UNDEFINED_REFERENCE : new _references.RootReference(controller);\n return {\n self,\n finalize: (0, _instrumentation._instrumentStart)('render.outlet', instrumentationPayload, definition)\n };\n }\n layoutFor(_state, _component, _env) {\n throw new Error('Method not implemented.');\n }\n getLayout({ template }, _resolver) {\n // The router has already resolved the template\n const layout = template.asLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n getCapabilities() {\n return CAPABILITIES;\n }\n getSelf({ self }) {\n return self;\n }\n getTag() {\n // an outlet has no hooks\n return _reference.CONSTANT_TAG;\n }\n didRenderLayout(state) {\n state.finalize();\n if (_env2.DEBUG) {\n this.debugStack.pop();\n }\n }\n getDestructor() {\n return null;\n }\n }\n const OUTLET_MANAGER = new OutletComponentManager();\n class OutletComponentDefinition {\n constructor(state, manager = OUTLET_MANAGER) {\n this.state = state;\n this.manager = manager;\n }\n }\n exports.OutletComponentDefinition = OutletComponentDefinition;\n function createRootOutlet(outletView) {\n if (_environment.ENV._APPLICATION_TEMPLATE_WRAPPER) {\n const WRAPPED_CAPABILITIES = (0, _polyfills.assign)({}, CAPABILITIES, {\n dynamicTag: true,\n elementHook: true\n });\n const WrappedOutletComponentManager = class extends OutletComponentManager {\n getTagName(_component) {\n return 'div';\n }\n getLayout(state) {\n // The router has already resolved the template\n const template = state.template;\n const layout = template.asWrappedLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n getCapabilities() {\n return WRAPPED_CAPABILITIES;\n }\n didCreateElement(component, element, _operations) {\n // to add GUID id and class\n element.setAttribute('class', 'ember-view');\n element.setAttribute('id', (0, _utils.guidFor)(component));\n }\n };\n const WRAPPED_OUTLET_MANAGER = new WrappedOutletComponentManager();\n return new OutletComponentDefinition(outletView.state, WRAPPED_OUTLET_MANAGER);\n } else {\n return new OutletComponentDefinition(outletView.state);\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/component-managers/root', ['exports', '@ember/-internals/container', '@ember/instrumentation', '@glimmer/env', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/utils/curly-component-state-bucket', '@ember/-internals/glimmer/lib/component-managers/curly'], function (exports, _container, _instrumentation, _env, _component, _curlyComponentStateBucket, _curly) {\n 'use strict';\n\n exports.__esModule = true;\n exports.RootComponentDefinition = exports.ROOT_CAPABILITIES = undefined;\n\n class RootComponentManager extends _curly.default {\n constructor(component) {\n super();\n this.component = component;\n }\n getLayout(_state, resolver) {\n const template = this.templateFor(this.component, resolver);\n const layout = template.asWrappedLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n create(environment, _state, _args, dynamicScope) {\n let component = this.component;\n if (_env.DEBUG) {\n this._pushToDebugStack(component._debugContainerKey, environment);\n }\n let finalizer = (0, _instrumentation._instrumentStart)('render.component', _curly.initialRenderInstrumentDetails, component);\n dynamicScope.view = component;\n let hasWrappedElement = component.tagName !== '';\n // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n if (!hasWrappedElement) {\n if (environment.isInteractive) {\n component.trigger('willRender');\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n }\n if (_env.DEBUG) {\n (0, _curly.processComponentInitializationAssertions)(component, {});\n }\n return new _curlyComponentStateBucket.default(environment, component, null, finalizer, hasWrappedElement);\n }\n }\n // ROOT is the top-level template it has nothing but one yield.\n // it is supposed to have a dummy element\n const ROOT_CAPABILITIES = exports.ROOT_CAPABILITIES = {\n dynamicLayout: false,\n dynamicTag: true,\n prepareArgs: false,\n createArgs: false,\n attributeHook: true,\n elementHook: true,\n createCaller: true,\n dynamicScope: true,\n updateHook: true,\n createInstance: false\n };\n class RootComponentDefinition {\n constructor(component) {\n this.component = component;\n let manager = new RootComponentManager(component);\n this.manager = manager;\n let factory = _container.FACTORY_FOR.get(component);\n this.state = {\n name: factory.fullName.slice(10),\n capabilities: ROOT_CAPABILITIES,\n ComponentClass: factory,\n handle: null\n };\n }\n getTag({ component }) {\n return component[_component.DIRTY_TAG];\n }\n }\n exports.RootComponentDefinition = RootComponentDefinition;\n});","enifed('@ember/-internals/glimmer/lib/component-managers/template-only', ['exports', '@glimmer/reference', '@glimmer/runtime', '@ember/-internals/glimmer/lib/component-managers/abstract'], function (exports, _reference, _runtime, _abstract) {\n 'use strict';\n\n exports.__esModule = true;\n exports.TemplateOnlyComponentDefinition = undefined;\n\n const CAPABILITIES = {\n dynamicLayout: false,\n dynamicTag: false,\n prepareArgs: false,\n createArgs: false,\n attributeHook: false,\n elementHook: false,\n createCaller: true,\n dynamicScope: true,\n updateHook: true,\n createInstance: true\n };\n class TemplateOnlyComponentManager extends _abstract.default {\n getLayout(template) {\n const layout = template.asLayout();\n return {\n handle: layout.compile(),\n symbolTable: layout.symbolTable\n };\n }\n getCapabilities() {\n return CAPABILITIES;\n }\n create() {\n return null;\n }\n getSelf() {\n return _runtime.NULL_REFERENCE;\n }\n getTag() {\n return _reference.CONSTANT_TAG;\n }\n getDestructor() {\n return null;\n }\n }\n exports.default = TemplateOnlyComponentManager;\n const MANAGER = new TemplateOnlyComponentManager();\n class TemplateOnlyComponentDefinition {\n constructor(state) {\n this.state = state;\n this.manager = MANAGER;\n }\n }\n exports.TemplateOnlyComponentDefinition = TemplateOnlyComponentDefinition;\n});","enifed('@ember/-internals/glimmer/lib/component', ['exports', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/-internals/runtime', '@ember/-internals/utils', '@ember/-internals/views', '@ember/debug', '@glimmer/reference', '@glimmer/runtime', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _metal, _owner, _runtime, _utils, _views, _debug, _reference, _runtime2, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.BOUNDS = exports.HAS_BLOCK = exports.IS_DISPATCHING_ATTRS = exports.ROOT_REF = exports.ARGS = exports.DIRTY_TAG = undefined;\n const DIRTY_TAG = exports.DIRTY_TAG = (0, _utils.symbol)('DIRTY_TAG');\n const ARGS = exports.ARGS = (0, _utils.symbol)('ARGS');\n const ROOT_REF = exports.ROOT_REF = (0, _utils.symbol)('ROOT_REF');\n const IS_DISPATCHING_ATTRS = exports.IS_DISPATCHING_ATTRS = (0, _utils.symbol)('IS_DISPATCHING_ATTRS');\n const HAS_BLOCK = exports.HAS_BLOCK = (0, _utils.symbol)('HAS_BLOCK');\n const BOUNDS = exports.BOUNDS = (0, _utils.symbol)('BOUNDS');\n /**\n @module @ember/component\n */\n /**\n A `Component` is a view that is completely\n isolated. Properties accessed in its templates go\n to the view object and actions are targeted at\n the view object. There is no access to the\n surrounding context or outer controller; all\n contextual information must be passed in.\n \n The easiest way to create a `Component` is via\n a template. If you name a template\n `app/templates/components/my-foo.hbs`, you will be able to use\n `{{my-foo}}` in other templates, which will make\n an instance of the isolated component.\n \n ```app/templates/components/my-foo.hbs\n {{person-profile person=currentUser}}\n ```\n \n ```app/templates/components/person-profile.hbs\n

{{person.title}}

\n \n

{{person.signature}}

\n ```\n \n You can use `yield` inside a template to\n include the **contents** of any block attached to\n the component. The block will be executed in the\n context of the surrounding context or outer controller:\n \n ```handlebars\n {{#person-profile person=currentUser}}\n

Admin mode

\n {{! Executed in the controller's context. }}\n {{/person-profile}}\n ```\n \n ```app/templates/components/person-profile.hbs\n

{{person.title}}

\n {{! Executed in the component's context. }}\n {{yield}} {{! block contents }}\n ```\n \n If you want to customize the component, in order to\n handle events or actions, you implement a subclass\n of `Component` named after the name of the\n component.\n \n For example, you could implement the action\n `hello` for the `person-profile` component:\n \n ```app/components/person-profile.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n hello(name) {\n console.log(\"Hello\", name);\n }\n }\n });\n ```\n \n And then use it in the component's template:\n \n ```app/templates/components/person-profile.hbs\n

{{person.title}}

\n {{yield}} \n \n ```\n \n Components must have a `-` in their name to avoid\n conflicts with built-in controls that wrap HTML\n elements. This is consistent with the same\n requirement in web components.\n \n ## HTML Tag\n \n The default HTML tag name used for a component's DOM representation is `div`.\n This can be customized by setting the `tagName` property.\n The following component class:\n \n ```app/components/emphasized-paragraph.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'em'\n });\n ```\n \n Would result in instances with the following HTML:\n \n ```html\n \n ```\n \n ## HTML `class` Attribute\n \n The HTML `class` attribute of a component's tag can be set by providing a\n `classNames` property that is set to an array of strings:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNames: ['my-class', 'my-other-class']\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n `class` attribute values can also be set by providing a `classNameBindings`\n property set to an array of properties names for the component. The return value\n of these properties will be added as part of the value for the components's `class`\n attribute. These properties can be computed properties:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n \n export default Component.extend({\n classNameBindings: ['propertyA', 'propertyB'],\n \n propertyA: 'from-a',\n propertyB: computed(function() {\n if (someLogic) { return 'from-b'; }\n })\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n If the value of a class name binding returns a boolean the property name\n itself will be used as the class name if the property is true.\n The class name will not be added if the value is `false` or `undefined`.\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['hovered'],\n \n hovered: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n When using boolean class name bindings you can supply a string value other\n than the property name for use as the `class` HTML attribute by appending the\n preferred value after a \":\" character when defining the binding:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['awesome:so-very-cool'],\n \n awesome: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n Boolean value class name bindings whose property names are in a\n camelCase-style format will be converted to a dasherized format:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['isUrgent'],\n \n isUrgent: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n Class name bindings can also refer to object values that are found by\n traversing a path relative to the component itself:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n import EmberObject from '@ember/object';\n \n export default Component.extend({\n classNameBindings: ['messages.empty'],\n \n messages: EmberObject.create({\n empty: true\n })\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n If you want to add a class name for a property which evaluates to true and\n and a different class name if it evaluates to false, you can pass a binding\n like this:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['isEnabled:enabled:disabled'],\n isEnabled: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n When isEnabled is `false`, the resulting HTML representation looks like\n this:\n \n ```html\n
\n ```\n \n This syntax offers the convenience to add a class if a property is `false`:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n // Applies no class when isEnabled is true and class 'disabled' when isEnabled is false\n export default Component.extend({\n classNameBindings: ['isEnabled::disabled'],\n isEnabled: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n When the `isEnabled` property on the component is set to `false`, it will result\n in component instances with an HTML representation of:\n \n ```html\n
\n ```\n \n Updates to the value of a class name binding will result in automatic\n update of the HTML `class` attribute in the component's rendered HTML\n representation. If the value becomes `false` or `undefined` the class name\n will be removed.\n Both `classNames` and `classNameBindings` are concatenated properties. See\n [EmberObject](/api/ember/release/classes/EmberObject) documentation for more\n information about concatenated properties.\n \n ## HTML Attributes\n \n The HTML attribute section of a component's tag can be set by providing an\n `attributeBindings` property set to an array of property names on the component.\n The return value of these properties will be used as the value of the component's\n HTML associated attribute:\n \n ```app/components/my-anchor.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'a',\n attributeBindings: ['href'],\n \n href: 'http://google.com'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n \n ```\n \n One property can be mapped on to another by placing a \":\" between\n the source property and the destination property:\n \n ```app/components/my-anchor.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'a',\n attributeBindings: ['url:href'],\n \n url: 'http://google.com'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n \n ```\n \n Namespaced attributes (e.g. `xlink:href`) are supported, but have to be\n mapped, since `:` is not a valid character for properties in Javascript:\n \n ```app/components/my-use.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'use',\n attributeBindings: ['xlinkHref:xlink:href'],\n \n xlinkHref: '#triangle'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n \n ```\n \n If the return value of an `attributeBindings` monitored property is a boolean\n the attribute will be present or absent depending on the value:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'input',\n attributeBindings: ['disabled'],\n \n disabled: false\n });\n ```\n \n Will result in a component instance with an HTML representation of:\n \n ```html\n \n ```\n \n `attributeBindings` can refer to computed properties:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n \n export default Component.extend({\n tagName: 'input',\n attributeBindings: ['disabled'],\n \n disabled: computed(function() {\n if (someLogic) {\n return true;\n } else {\n return false;\n }\n })\n });\n ```\n \n To prevent setting an attribute altogether, use `null` or `undefined` as the\n return value of the `attributeBindings` monitored property:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'form',\n attributeBindings: ['novalidate'],\n novalidate: null\n });\n ```\n \n Updates to the property of an attribute binding will result in automatic\n update of the HTML attribute in the component's rendered HTML representation.\n `attributeBindings` is a concatenated property. See [EmberObject](/api/ember/release/classes/EmberObject)\n documentation for more information about concatenated properties.\n \n ## Layouts\n \n See [Ember.Templates.helpers.yield](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield)\n for more information.\n \n Layout can be used to wrap content in a component. In addition\n to wrapping content in a Component's template, you can also use\n the public layout API in your Component JavaScript.\n \n ```app/templates/components/person-profile.hbs\n

Person's Title

\n
{{yield}}
\n ```\n \n ```app/components/person-profile.js\n import Component from '@ember/component';\n import layout from '../templates/components/person-profile';\n \n export default Component.extend({\n layout\n });\n ```\n \n If you call the `person-profile` component like so:\n \n ```\n {{#person-profile}}\n

Chief Basket Weaver

\n

Fisherman Industries

\n {{/person-profile}}\n \n It will result in the following HTML output:\n \n ```html\n

Person's Title

\n
\n

Chief Basket Weaver

\n

Fisherman Industries

\n
\n ```\n \n ## Responding to Browser Events\n \n Components can respond to user-initiated events in one of three ways: method\n implementation, through an event manager, and through `{{action}}` helper use\n in their template or layout.\n \n ### Method Implementation\n \n Components can respond to user-initiated events by implementing a method that\n matches the event name. A `jQuery.Event` object will be passed as the\n argument to this method.\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n click(event) {\n // will be called when an instance's\n // rendered element is clicked\n }\n });\n ```\n \n ### `{{action}}` Helper\n \n See [Ember.Templates.helpers.action](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield).\n \n ### Event Names\n \n All of the event handling approaches described above respond to the same set\n of events. The names of the built-in events are listed below. (The hash of\n built-in events exists in `Ember.EventDispatcher`.) Additional, custom events\n can be registered by using `Application.customEvents`.\n \n Touch events:\n \n * `touchStart`\n * `touchMove`\n * `touchEnd`\n * `touchCancel`\n \n Keyboard events:\n \n * `keyDown`\n * `keyUp`\n * `keyPress`\n \n Mouse events:\n \n * `mouseDown`\n * `mouseUp`\n * `contextMenu`\n * `click`\n * `doubleClick`\n * `mouseMove`\n * `focusIn`\n * `focusOut`\n * `mouseEnter`\n * `mouseLeave`\n \n Form events:\n \n * `submit`\n * `change`\n * `focusIn`\n * `focusOut`\n * `input`\n \n HTML5 drag and drop events:\n \n * `dragStart`\n * `drag`\n * `dragEnter`\n * `dragLeave`\n * `dragOver`\n * `dragEnd`\n * `drop`\n \n @class Component\n @extends Ember.CoreView\n @uses Ember.TargetActionSupport\n @uses Ember.ClassNamesSupport\n @uses Ember.ActionSupport\n @uses Ember.ViewMixin\n @uses Ember.ViewStateSupport\n @public\n */\n const Component = _views.CoreView.extend(_views.ChildViewsSupport, _views.ViewStateSupport, _views.ClassNamesSupport, _runtime.TargetActionSupport, _views.ActionSupport, _views.ViewMixin, {\n isComponent: true,\n init() {\n this._super(...arguments);\n this[IS_DISPATCHING_ATTRS] = false;\n this[DIRTY_TAG] = _reference.DirtyableTag.create();\n this[ROOT_REF] = new _references.RootReference(this);\n this[BOUNDS] = null;\n // If in a tagless component, assert that no event handlers are defined\n (0, _debug.assert)(\n // tslint:disable-next-line:max-line-length\n `You can not define a function that handles DOM events in the \\`${this}\\` tagless component since it doesn't have any DOM element.`, this.tagName !== '' || !this.renderer._destinedForDOM || !(() => {\n let eventDispatcher = (0, _owner.getOwner)(this).lookup('event_dispatcher:main');\n let events = eventDispatcher && eventDispatcher._finalEvents || {};\n // tslint:disable-next-line:forin\n for (let key in events) {\n let methodName = events[key];\n if (typeof this[methodName] === 'function') {\n return true; // indicate that the assertion should be triggered\n }\n }\n return false;\n })());\n },\n rerender() {\n this[DIRTY_TAG].inner.dirty();\n this._super();\n },\n [_metal.PROPERTY_DID_CHANGE](key) {\n if (this[IS_DISPATCHING_ATTRS]) {\n return;\n }\n let args = this[ARGS];\n let reference = args !== undefined ? args[key] : undefined;\n if (reference !== undefined && reference[_references.UPDATE] !== undefined) {\n reference[_references.UPDATE]((0, _metal.get)(this, key));\n }\n },\n getAttr(key) {\n // TODO Intimate API should be deprecated\n return this.get(key);\n },\n /**\n Normally, Ember's component model is \"write-only\". The component takes a\n bunch of attributes that it got passed in, and uses them to render its\n template.\n One nice thing about this model is that if you try to set a value to the\n same thing as last time, Ember (through HTMLBars) will avoid doing any\n work on the DOM.\n This is not just a performance optimization. If an attribute has not\n changed, it is important not to clobber the element's \"hidden state\".\n For example, if you set an input's `value` to the same value as before,\n it will clobber selection state and cursor position. In other words,\n setting an attribute is not **always** idempotent.\n This method provides a way to read an element's attribute and also\n update the last value Ember knows about at the same time. This makes\n setting an attribute idempotent.\n In particular, what this means is that if you get an `` element's\n `value` attribute and then re-render the template with the same value,\n it will avoid clobbering the cursor and selection position.\n Since most attribute sets are idempotent in the browser, you typically\n can get away with reading attributes using jQuery, but the most reliable\n way to do so is through this method.\n @method readDOMAttr\n @param {String} name the name of the attribute\n @return String\n @public\n */\n readDOMAttr(name) {\n // TODO revisit this\n let element = (0, _views.getViewElement)(this);\n let isSVG = element.namespaceURI === _runtime2.SVG_NAMESPACE;\n let { type, normalized } = (0, _runtime2.normalizeProperty)(element, name);\n if (isSVG || type === 'attr') {\n return element.getAttribute(normalized);\n }\n return element[normalized];\n },\n /**\n The WAI-ARIA role of the control represented by this view. For example, a\n button may have a role of type 'button', or a pane may have a role of\n type 'alertdialog'. This property is used by assistive software to help\n visually challenged users navigate rich web applications.\n The full list of valid WAI-ARIA roles is available at:\n [http://www.w3.org/TR/wai-aria/roles#roles_categorization](http://www.w3.org/TR/wai-aria/roles#roles_categorization)\n @property ariaRole\n @type String\n @default null\n @public\n */\n /**\n Enables components to take a list of parameters as arguments.\n For example, a component that takes two parameters with the names\n `name` and `age`:\n ```app/components/my-component.js\n import Component from '@ember/component';\n let MyComponent = Component.extend();\n MyComponent.reopenClass({\n positionalParams: ['name', 'age']\n });\n export default MyComponent;\n ```\n It can then be invoked like this:\n ```hbs\n {{my-component \"John\" 38}}\n ```\n The parameters can be referred to just like named parameters:\n ```hbs\n Name: {{name}}, Age: {{age}}.\n ```\n Using a string instead of an array allows for an arbitrary number of\n parameters:\n ```app/components/my-component.js\n import Component from '@ember/component';\n let MyComponent = Component.extend();\n MyComponent.reopenClass({\n positionalParams: 'names'\n });\n export default MyComponent;\n ```\n It can then be invoked like this:\n ```hbs\n {{my-component \"John\" \"Michael\" \"Scott\"}}\n ```\n The parameters can then be referred to by enumerating over the list:\n ```hbs\n {{#each names as |name|}}{{name}}{{/each}}\n ```\n @static\n @public\n @property positionalParams\n @since 1.13.0\n */\n /**\n Called when the attributes passed into the component have been updated.\n Called both during the initial render of a container and during a rerender.\n Can be used in place of an observer; code placed here will be executed\n every time any attribute updates.\n @method didReceiveAttrs\n @public\n @since 1.13.0\n */\n didReceiveAttrs() {},\n /**\n Called when the attributes passed into the component have been updated.\n Called both during the initial render of a container and during a rerender.\n Can be used in place of an observer; code placed here will be executed\n every time any attribute updates.\n @event didReceiveAttrs\n @public\n @since 1.13.0\n */\n /**\n Called after a component has been rendered, both on initial render and\n in subsequent rerenders.\n @method didRender\n @public\n @since 1.13.0\n */\n didRender() {},\n /**\n Called after a component has been rendered, both on initial render and\n in subsequent rerenders.\n @event didRender\n @public\n @since 1.13.0\n */\n /**\n Called before a component has been rendered, both on initial render and\n in subsequent rerenders.\n @method willRender\n @public\n @since 1.13.0\n */\n willRender() {},\n /**\n Called before a component has been rendered, both on initial render and\n in subsequent rerenders.\n @event willRender\n @public\n @since 1.13.0\n */\n /**\n Called when the attributes passed into the component have been changed.\n Called only during a rerender, not during an initial render.\n @method didUpdateAttrs\n @public\n @since 1.13.0\n */\n didUpdateAttrs() {},\n /**\n Called when the attributes passed into the component have been changed.\n Called only during a rerender, not during an initial render.\n @event didUpdateAttrs\n @public\n @since 1.13.0\n */\n /**\n Called when the component is about to update and rerender itself.\n Called only during a rerender, not during an initial render.\n @method willUpdate\n @public\n @since 1.13.0\n */\n willUpdate() {},\n /**\n Called when the component is about to update and rerender itself.\n Called only during a rerender, not during an initial render.\n @event willUpdate\n @public\n @since 1.13.0\n */\n /**\n Called when the component has updated and rerendered itself.\n Called only during a rerender, not during an initial render.\n @method didUpdate\n @public\n @since 1.13.0\n */\n didUpdate() {}\n });\n Component.toString = () => '@ember/component';\n Component.reopenClass({\n isComponentFactory: true,\n positionalParams: []\n });\n exports.default = Component;\n});","enifed('@ember/-internals/glimmer/lib/components/checkbox', ['exports', '@ember/-internals/metal', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/templates/empty'], function (exports, _metal, _component, _empty) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module @ember/component\n */\n /**\n The internal class used to create text inputs when the `{{input}}`\n helper is used with `type` of `checkbox`.\n \n See [Ember.Templates.helpers.input](/api/ember/release/classes/Ember.Templates.helpers/methods/input?anchor=input) for usage details.\n \n ## Direct manipulation of `checked`\n \n The `checked` attribute of an `Checkbox` object should always be set\n through the Ember object or by interacting with its rendered element\n representation via the mouse, keyboard, or touch. Updating the value of the\n checkbox via jQuery will result in the checked value of the object and its\n element losing synchronization.\n \n ## Layout and LayoutName properties\n \n Because HTML `input` elements are self closing `layout` and `layoutName`\n properties will not be applied.\n \n @class Checkbox\n @extends Component\n @public\n */\n const Checkbox = _component.default.extend({\n layout: _empty.default,\n classNames: ['ember-checkbox'],\n tagName: 'input',\n attributeBindings: ['type', 'checked', 'indeterminate', 'disabled', 'tabindex', 'name', 'autofocus', 'required', 'form'],\n type: 'checkbox',\n disabled: false,\n indeterminate: false,\n didInsertElement() {\n this._super(...arguments);\n (0, _metal.get)(this, 'element').indeterminate = !!(0, _metal.get)(this, 'indeterminate');\n },\n change() {\n (0, _metal.set)(this, 'checked', this.element.checked);\n }\n });\n Checkbox.toString = () => '@ember/component/checkbox';\n exports.default = Checkbox;\n});","enifed('@ember/-internals/glimmer/lib/components/link-to', ['exports', '@ember/-internals/metal', '@ember/-internals/views', '@ember/debug', '@ember/instrumentation', '@ember/service', '@glimmer/env', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/templates/link-to'], function (exports, _metal, _views, _debug, _instrumentation, _service, _env, _component, _linkTo) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module @ember/routing\n */\n /**\n `LinkComponent` renders an element whose `click` event triggers a\n transition of the application's instance of `Router` to\n a supplied route by name.\n \n `LinkComponent` components are invoked with {{#link-to}}. Properties\n of this class can be overridden with `reopen` to customize application-wide\n behavior.\n \n @class LinkComponent\n @extends Component\n @see {Ember.Templates.helpers.link-to}\n @public\n **/\n /**\n @module ember\n */\n /**\n The `{{link-to}}` component renders a link to the supplied\n `routeName` passing an optionally supplied model to the\n route as its `model` context of the route. The block\n for `{{link-to}}` becomes the innerHTML of the rendered\n element:\n \n ```handlebars\n {{#link-to 'photoGallery'}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n You can also use an inline form of `{{link-to}}` component by\n passing the link text as the first argument\n to the component:\n \n ```handlebars\n {{link-to 'Great Hamster Photos' 'photoGallery'}}\n ```\n \n Both will result in:\n \n ```html\n \n Great Hamster Photos\n \n ```\n \n ### Supplying a tagName\n By default `{{link-to}}` renders an `` element. This can\n be overridden for a single use of `{{link-to}}` by supplying\n a `tagName` option:\n \n ```handlebars\n {{#link-to 'photoGallery' tagName=\"li\"}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n ```html\n
  • \n Great Hamster Photos\n
  • \n ```\n \n To override this option for your entire application, see\n \"Overriding Application-wide Defaults\".\n \n ### Disabling the `link-to` component\n By default `{{link-to}}` is enabled.\n any passed value to the `disabled` component property will disable\n the `link-to` component.\n \n static use: the `disabled` option:\n \n ```handlebars\n {{#link-to 'photoGallery' disabled=true}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n dynamic use: the `disabledWhen` option:\n \n ```handlebars\n {{#link-to 'photoGallery' disabledWhen=controller.someProperty}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n any truthy value passed to `disabled` will disable it except `undefined`.\n \n See \"Overriding Application-wide Defaults\" for more.\n \n ### Handling `href`\n `{{link-to}}` will use your application's Router to\n fill the element's `href` property with a url that\n matches the path to the supplied `routeName` for your\n router's configured `Location` scheme, which defaults\n to HashLocation.\n \n ### Handling current route\n `{{link-to}}` will apply a CSS class name of 'active'\n when the application's current route matches\n the supplied routeName. For example, if the application's\n current route is 'photoGallery.recent' the following\n use of `{{link-to}}`:\n \n ```handlebars\n {{#link-to 'photoGallery.recent'}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n will result in\n \n ```html\n
    \n Great Hamster Photos\n \n ```\n \n The CSS class name used for active classes can be customized\n for a single use of `{{link-to}}` by passing an `activeClass`\n option:\n \n ```handlebars\n {{#link-to 'photoGallery.recent' activeClass=\"current-url\"}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n ```html\n \n Great Hamster Photos\n \n ```\n \n To override this option for your entire application, see\n \"Overriding Application-wide Defaults\".\n \n ### Keeping a link active for other routes\n \n If you need a link to be 'active' even when it doesn't match\n the current route, you can use the `current-when` argument.\n \n ```handlebars\n {{#link-to 'photoGallery' current-when='photos'}}\n Photo Gallery\n {{/link-to}}\n ```\n \n This may be helpful for keeping links active for:\n \n * non-nested routes that are logically related\n * some secondary menu approaches\n * 'top navigation' with 'sub navigation' scenarios\n \n A link will be active if `current-when` is `true` or the current\n route is the route this link would transition to.\n \n To match multiple routes 'space-separate' the routes:\n \n ```handlebars\n {{#link-to 'gallery' current-when='photos drawings paintings'}}\n Art Gallery\n {{/link-to}}\n ```\n \n ### Supplying a model\n An optional model argument can be used for routes whose\n paths contain dynamic segments. This argument will become\n the model context of the linked route:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", {path: \"hamster-photos/:photo_id\"});\n });\n ```\n \n ```handlebars\n {{#link-to 'photoGallery' aPhoto}}\n {{aPhoto.title}}\n {{/link-to}}\n ```\n \n ```html\n \n Tomster\n \n ```\n \n ### Supplying multiple models\n For deep-linking to route paths that contain multiple\n dynamic segments, multiple model arguments can be used.\n As the router transitions through the route path, each\n supplied model argument will become the context for the\n route with the dynamic segments:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" }, function() {\n this.route(\"comment\", {path: \"comments/:comment_id\"});\n });\n });\n ```\n This argument will become the model context of the linked route:\n \n ```handlebars\n {{#link-to 'photoGallery.comment' aPhoto comment}}\n {{comment.body}}\n {{/link-to}}\n ```\n \n ```html\n \n A+++ would snuggle again.\n \n ```\n \n ### Supplying an explicit dynamic segment value\n If you don't have a model object available to pass to `{{link-to}}`,\n an optional string or integer argument can be passed for routes whose\n paths contain dynamic segments. This argument will become the value\n of the dynamic segment:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" });\n });\n ```\n \n ```handlebars\n {{#link-to 'photoGallery' aPhotoId}}\n {{aPhoto.title}}\n {{/link-to}}\n ```\n \n ```html\n \n Tomster\n \n ```\n \n When transitioning into the linked route, the `model` hook will\n be triggered with parameters including this passed identifier.\n \n ### Allowing Default Action\n \n By default the `{{link-to}}` component prevents the default browser action\n by calling `preventDefault()` as this sort of action bubbling is normally\n handled internally and we do not want to take the browser to a new URL (for\n example).\n \n If you need to override this behavior specify `preventDefault=false` in\n your template:\n \n ```handlebars\n {{#link-to 'photoGallery' aPhotoId preventDefault=false}}\n {{aPhotoId.title}}\n {{/link-to}}\n ```\n \n ### Overriding attributes\n You can override any given property of the `LinkComponent`\n that is generated by the `{{link-to}}` component by passing\n key/value pairs, like so:\n \n ```handlebars\n {{#link-to aPhoto tagName='li' title='Following this link will change your life' classNames='pic sweet'}}\n Uh-mazing!\n {{/link-to}}\n ```\n \n See [LinkComponent](/api/ember/release/classes/LinkComponent) for a\n complete list of overrideable properties. Be sure to also\n check out inherited properties of `LinkComponent`.\n \n ### Overriding Application-wide Defaults\n \n ``{{link-to}}`` creates an instance of `LinkComponent` for rendering. To\n override options for your entire application, export your customized\n `LinkComponent` from `app/components/link-to.js` with the desired overrides:\n \n ```javascript\n // app/components/link-to.js\n import LinkComponent from '@ember/routing/link-component';\n \n export default LinkComponent.extend({\n activeClass: \"is-active\",\n tagName: 'li'\n })\n ```\n \n It is also possible to override the default event in this manner:\n \n ```javascript\n import LinkComponent from '@ember/routing/link-component';\n \n export default LinkComponent.extend({\n eventName: 'customEventName'\n });\n ```\n \n @method link-to\n @for Ember.Templates.helpers\n @param {String} routeName\n @param {Object} [context]*\n @param [options] {Object} Handlebars key/value pairs of options, you can override any property of Ember.LinkComponent\n @return {String} HTML string\n @see {LinkComponent}\n @public\n */\n const LinkComponent = _component.default.extend({\n layout: _linkTo.default,\n tagName: 'a',\n /**\n Used to determine when this `LinkComponent` is active.\n @property current-when\n @public\n */\n 'current-when': null,\n /**\n Sets the `title` attribute of the `LinkComponent`'s HTML element.\n @property title\n @default null\n @public\n **/\n title: null,\n /**\n Sets the `rel` attribute of the `LinkComponent`'s HTML element.\n @property rel\n @default null\n @public\n **/\n rel: null,\n /**\n Sets the `tabindex` attribute of the `LinkComponent`'s HTML element.\n @property tabindex\n @default null\n @public\n **/\n tabindex: null,\n /**\n Sets the `target` attribute of the `LinkComponent`'s HTML element.\n @since 1.8.0\n @property target\n @default null\n @public\n **/\n target: null,\n /**\n The CSS class to apply to `LinkComponent`'s element when its `active`\n property is `true`.\n @property activeClass\n @type String\n @default active\n @public\n **/\n activeClass: 'active',\n /**\n The CSS class to apply to `LinkComponent`'s element when its `loading`\n property is `true`.\n @property loadingClass\n @type String\n @default loading\n @private\n **/\n loadingClass: 'loading',\n /**\n The CSS class to apply to a `LinkComponent`'s element when its `disabled`\n property is `true`.\n @property disabledClass\n @type String\n @default disabled\n @private\n **/\n disabledClass: 'disabled',\n /**\n Determines whether the `LinkComponent` will trigger routing via\n the `replaceWith` routing strategy.\n @property replace\n @type Boolean\n @default false\n @public\n **/\n replace: false,\n /**\n By default the `{{link-to}}` component will bind to the `href` and\n `title` attributes. It's discouraged that you override these defaults,\n however you can push onto the array if needed.\n @property attributeBindings\n @type Array | String\n @default ['title', 'rel', 'tabindex', 'target']\n @public\n */\n attributeBindings: ['href', 'title', 'rel', 'tabindex', 'target'],\n /**\n By default the `{{link-to}}` component will bind to the `active`, `loading`,\n and `disabled` classes. It is discouraged to override these directly.\n @property classNameBindings\n @type Array\n @default ['active', 'loading', 'disabled', 'ember-transitioning-in', 'ember-transitioning-out']\n @public\n */\n classNameBindings: ['active', 'loading', 'disabled', 'transitioningIn', 'transitioningOut'],\n /**\n By default the `{{link-to}}` component responds to the `click` event. You\n can override this globally by setting this property to your custom\n event name.\n This is particularly useful on mobile when one wants to avoid the 300ms\n click delay using some sort of custom `tap` event.\n @property eventName\n @type String\n @default click\n @private\n */\n eventName: 'click',\n // this is doc'ed here so it shows up in the events\n // section of the API documentation, which is where\n // people will likely go looking for it.\n /**\n Triggers the `LinkComponent`'s routing behavior. If\n `eventName` is changed to a value other than `click`\n the routing behavior will trigger on that custom event\n instead.\n @event click\n @private\n */\n /**\n An overridable method called when `LinkComponent` objects are instantiated.\n Example:\n ```app/components/my-link.js\n import LinkComponent from '@ember/routing/link-component';\n export default LinkComponent.extend({\n init() {\n this._super(...arguments);\n console.log('Event is ' + this.get('eventName'));\n }\n });\n ```\n NOTE: If you do override `init` for a framework class like `Component`,\n be sure to call `this._super(...arguments)` in your\n `init` declaration! If you don't, Ember may not have an opportunity to\n do important setup work, and you'll see strange behavior in your\n application.\n @method init\n @private\n */\n init() {\n this._super(...arguments);\n // Map desired event name to invoke function\n let eventName = (0, _metal.get)(this, 'eventName');\n this.on(eventName, this, this._invoke);\n },\n _routing: (0, _service.inject)('-routing'),\n /**\n Accessed as a classname binding to apply the `LinkComponent`'s `disabledClass`\n CSS `class` to the element when the link is disabled.\n When `true` interactions with the element will not trigger route changes.\n @property disabled\n @private\n */\n disabled: (0, _metal.computed)({\n get(_key) {\n // always returns false for `get` because (due to the `set` just below)\n // the cached return value from the set will prevent this getter from _ever_\n // being called after a set has occured\n return false;\n },\n set(_key, value) {\n this._isDisabled = value;\n return value ? (0, _metal.get)(this, 'disabledClass') : false;\n }\n }),\n _isActive(routerState) {\n if ((0, _metal.get)(this, 'loading')) {\n return false;\n }\n let currentWhen = (0, _metal.get)(this, 'current-when');\n if (typeof currentWhen === 'boolean') {\n return currentWhen;\n }\n let isCurrentWhenSpecified = !!currentWhen;\n currentWhen = currentWhen || (0, _metal.get)(this, 'qualifiedRouteName');\n currentWhen = currentWhen.split(' ');\n let routing = (0, _metal.get)(this, '_routing');\n let models = (0, _metal.get)(this, 'models');\n let resolvedQueryParams = (0, _metal.get)(this, 'resolvedQueryParams');\n for (let i = 0; i < currentWhen.length; i++) {\n if (routing.isActiveForRoute(models, resolvedQueryParams, currentWhen[i], routerState, isCurrentWhenSpecified)) {\n return true;\n }\n }\n return false;\n },\n /**\n Accessed as a classname binding to apply the `LinkComponent`'s `activeClass`\n CSS `class` to the element when the link is active.\n A `LinkComponent` is considered active when its `currentWhen` property is `true`\n or the application's current route is the route the `LinkComponent` would trigger\n transitions into.\n The `currentWhen` property can match against multiple routes by separating\n route names using the ` ` (space) character.\n @property active\n @private\n */\n active: (0, _metal.computed)('activeClass', '_active', function computeLinkToComponentActiveClass() {\n return this.get('_active') ? (0, _metal.get)(this, 'activeClass') : false;\n }),\n _active: (0, _metal.computed)('_routing.currentState', 'attrs.params', function computeLinkToComponentActive() {\n let currentState = (0, _metal.get)(this, '_routing.currentState');\n if (!currentState) {\n return false;\n }\n return this._isActive(currentState);\n }),\n willBeActive: (0, _metal.computed)('_routing.targetState', function computeLinkToComponentWillBeActive() {\n let routing = (0, _metal.get)(this, '_routing');\n let targetState = (0, _metal.get)(routing, 'targetState');\n if ((0, _metal.get)(routing, 'currentState') === targetState) {\n return;\n }\n return this._isActive(targetState);\n }),\n transitioningIn: (0, _metal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningIn() {\n if ((0, _metal.get)(this, 'willBeActive') === true && !(0, _metal.get)(this, '_active')) {\n return 'ember-transitioning-in';\n } else {\n return false;\n }\n }),\n transitioningOut: (0, _metal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningOut() {\n if ((0, _metal.get)(this, 'willBeActive') === false && (0, _metal.get)(this, '_active')) {\n return 'ember-transitioning-out';\n } else {\n return false;\n }\n }),\n /**\n Event handler that invokes the link, activating the associated route.\n @method _invoke\n @param {Event} event\n @private\n */\n _invoke(event) {\n if (!(0, _views.isSimpleClick)(event)) {\n return true;\n }\n let preventDefault = (0, _metal.get)(this, 'preventDefault');\n let targetAttribute = (0, _metal.get)(this, 'target');\n if (preventDefault !== false && (!targetAttribute || targetAttribute === '_self')) {\n event.preventDefault();\n }\n if ((0, _metal.get)(this, 'bubbles') === false) {\n event.stopPropagation();\n }\n if (this._isDisabled) {\n return false;\n }\n if ((0, _metal.get)(this, 'loading')) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.warn)('This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.', false, {\n id: 'ember-glimmer.link-to.inactive-loading-state'\n });\n return false;\n }\n if (targetAttribute && targetAttribute !== '_self') {\n return false;\n }\n let qualifiedRouteName = (0, _metal.get)(this, 'qualifiedRouteName');\n let models = (0, _metal.get)(this, 'models');\n let queryParams = (0, _metal.get)(this, 'queryParams.values');\n let shouldReplace = (0, _metal.get)(this, 'replace');\n let payload = {\n queryParams,\n routeName: qualifiedRouteName\n };\n // tslint:disable-next-line:max-line-length\n (0, _instrumentation.flaggedInstrument)('interaction.link-to', payload, this._generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace));\n return false;\n },\n _generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace) {\n let routing = (0, _metal.get)(this, '_routing');\n return () => {\n payload.transition = routing.transitionTo(qualifiedRouteName, models, queryParams, shouldReplace);\n };\n },\n queryParams: null,\n qualifiedRouteName: (0, _metal.computed)('targetRouteName', '_routing.currentState', function computeLinkToComponentQualifiedRouteName() {\n let params = (0, _metal.get)(this, 'params');\n let paramsLength = params.length;\n let lastParam = params[paramsLength - 1];\n if (lastParam && lastParam.isQueryParams) {\n paramsLength--;\n }\n let onlyQueryParamsSupplied = this[_component.HAS_BLOCK] ? paramsLength === 0 : paramsLength === 1;\n if (onlyQueryParamsSupplied) {\n return (0, _metal.get)(this, '_routing.currentRouteName');\n }\n return (0, _metal.get)(this, 'targetRouteName');\n }),\n resolvedQueryParams: (0, _metal.computed)('queryParams', function computeLinkToComponentResolvedQueryParams() {\n let resolvedQueryParams = {};\n let queryParams = (0, _metal.get)(this, 'queryParams');\n if (!queryParams) {\n return resolvedQueryParams;\n }\n let values = queryParams.values;\n for (let key in values) {\n if (!values.hasOwnProperty(key)) {\n continue;\n }\n resolvedQueryParams[key] = values[key];\n }\n return resolvedQueryParams;\n }),\n /**\n Sets the element's `href` attribute to the url for\n the `LinkComponent`'s targeted route.\n If the `LinkComponent`'s `tagName` is changed to a value other\n than `a`, this property will be ignored.\n @property href\n @private\n */\n href: (0, _metal.computed)('models', 'qualifiedRouteName', function computeLinkToComponentHref() {\n if ((0, _metal.get)(this, 'tagName') !== 'a') {\n return;\n }\n let qualifiedRouteName = (0, _metal.get)(this, 'qualifiedRouteName');\n let models = (0, _metal.get)(this, 'models');\n if ((0, _metal.get)(this, 'loading')) {\n return (0, _metal.get)(this, 'loadingHref');\n }\n let routing = (0, _metal.get)(this, '_routing');\n let queryParams = (0, _metal.get)(this, 'queryParams.values');\n if (_env.DEBUG) {\n /*\n * Unfortunately, to get decent error messages, we need to do this.\n * In some future state we should be able to use a \"feature flag\"\n * which allows us to strip this without needing to call it twice.\n *\n * if (isDebugBuild()) {\n * // Do the useful debug thing, probably including try/catch.\n * } else {\n * // Do the performant thing.\n * }\n */\n try {\n routing.generateURL(qualifiedRouteName, models, queryParams);\n } catch (e) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)('You attempted to define a `{{link-to \"' + qualifiedRouteName + '\"}}` but did not pass the parameters required for generating its dynamic segments. ' + e.message);\n }\n }\n return routing.generateURL(qualifiedRouteName, models, queryParams);\n }),\n loading: (0, _metal.computed)('_modelsAreLoaded', 'qualifiedRouteName', function computeLinkToComponentLoading() {\n let qualifiedRouteName = (0, _metal.get)(this, 'qualifiedRouteName');\n let modelsAreLoaded = (0, _metal.get)(this, '_modelsAreLoaded');\n if (!modelsAreLoaded || qualifiedRouteName === null || qualifiedRouteName === undefined) {\n return (0, _metal.get)(this, 'loadingClass');\n }\n }),\n _modelsAreLoaded: (0, _metal.computed)('models', function computeLinkToComponentModelsAreLoaded() {\n let models = (0, _metal.get)(this, 'models');\n for (let i = 0; i < models.length; i++) {\n let model = models[i];\n if (model === null || model === undefined) {\n return false;\n }\n }\n return true;\n }),\n _getModels(params) {\n let modelCount = params.length - 1;\n let models = new Array(modelCount);\n for (let i = 0; i < modelCount; i++) {\n let value = params[i + 1];\n models[i] = value;\n }\n return models;\n },\n /**\n The default href value to use while a link-to is loading.\n Only applies when tagName is 'a'\n @property loadingHref\n @type String\n @default #\n @private\n */\n loadingHref: '#',\n didReceiveAttrs() {\n let queryParams;\n let params = (0, _metal.get)(this, 'params');\n if (params) {\n // Do not mutate params in place\n params = params.slice();\n }\n (0, _debug.assert)('You must provide one or more parameters to the link-to component.', params && params.length);\n let disabledWhen = (0, _metal.get)(this, 'disabledWhen');\n if (disabledWhen !== undefined) {\n this.set('disabled', disabledWhen);\n }\n // Process the positional arguments, in order.\n // 1. Inline link title comes first, if present.\n if (!this[_component.HAS_BLOCK]) {\n this.set('linkTitle', params.shift());\n }\n // 2. `targetRouteName` is now always at index 0.\n this.set('targetRouteName', params[0]);\n // 3. The last argument (if still remaining) is the `queryParams` object.\n let lastParam = params[params.length - 1];\n if (lastParam && lastParam.isQueryParams) {\n queryParams = params.pop();\n } else {\n queryParams = { values: {} };\n }\n this.set('queryParams', queryParams);\n // 4. Any remaining indices (excepting `targetRouteName` at 0) are `models`.\n if (params.length > 1) {\n this.set('models', this._getModels(params));\n } else {\n this.set('models', []);\n }\n }\n });\n LinkComponent.toString = () => '@ember/routing/link-component';\n LinkComponent.reopenClass({\n positionalParams: 'params'\n });\n exports.default = LinkComponent;\n});","enifed('@ember/-internals/glimmer/lib/components/text_area', ['exports', '@ember/-internals/views', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/templates/empty'], function (exports, _views, _component, _empty) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n `{{textarea}}` inserts a new instance of `\n ```\n \n Bound:\n \n In the following example, the `writtenWords` property on the application\n Controller will be updated live as the user types 'Lots of text that IS\n bound' into the text area of their browser's window.\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n \n export default Controller.extend({\n writtenWords: \"Lots of text that IS bound\"\n });\n ```\n \n ```handlebars\n {{textarea value=writtenWords}}\n ```\n \n Would result in the following HTML:\n \n ```html\n \n ```\n \n If you wanted a one way binding between the text area and a div tag\n somewhere else on your screen, you could use `oneWay`:\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { oneWay } from '@ember/object/computed';\n \n export default Controller.extend({\n writtenWords: \"Lots of text that IS bound\",\n \n outputWrittenWords: oneWay(\"writtenWords\")\n });\n ```\n \n ```handlebars\n {{textarea value=writtenWords}}\n
    \n {{outputWrittenWords}}\n
    \n ```\n \n Would result in the following HTML:\n \n ```html\n \n <-- the following div will be updated in real time as you type -->\n
    \n Lots of text that IS bound\n
    \n ```\n \n Finally, this example really shows the power and ease of Ember when two\n properties are bound to eachother via `alias`. Type into\n either text area box and they'll both stay in sync. Note that\n `alias` costs more in terms of performance, so only use it when\n your really binding in both directions:\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { alias } from '@ember/object/computed';\n \n export default Controller.extend({\n writtenWords: \"Lots of text that IS bound\",\n \n twoWayWrittenWords: alias(\"writtenWords\")\n });\n ```\n \n ```handlebars\n {{textarea value=writtenWords}}\n {{textarea value=twoWayWrittenWords}}\n ```\n \n ```html\n \n <-- both updated in real time -->\n \n ```\n \n ### Actions\n \n The helper can send multiple actions based on user events.\n The action property defines the action which is send when\n the user presses the return key.\n \n ```handlebars\n {{input action=\"submit\"}}\n ```\n \n The helper allows some user events to send actions.\n \n * `enter`\n * `insert-newline`\n * `escape-press`\n * `focus-in`\n * `focus-out`\n * `key-press`\n \n For example, if you desire an action to be sent when the input is blurred,\n you only need to setup the action name to the event name property.\n \n ```handlebars\n {{textarea focus-out=\"alertMessage\"}}\n ```\n \n See more about [Text Support Actions](/api/ember/release/classes/TextArea)\n \n ### Extension\n \n Internally, `{{textarea}}` creates an instance of `TextArea`, passing\n arguments from the helper to `TextArea`'s `create` method. You can\n extend the capabilities of text areas in your application by reopening this\n class. For example, if you are building a Bootstrap project where `data-*`\n attributes are used, you can globally add support for a `data-*` attribute\n on all `{{textarea}}`s' in your app by reopening `TextArea` or\n `TextSupport` and adding it to the `attributeBindings` concatenated\n property:\n \n ```javascript\n import TextArea from '@ember/component/text-area';\n \n TextArea.reopen({\n attributeBindings: ['data-error']\n });\n ```\n \n Keep in mind when writing `TextArea` subclasses that `TextArea`\n itself extends `Component`. Expect isolated component semantics, not\n legacy 1.x view semantics (like `controller` being present).\n \n See more about [Ember components](/api/ember/release/classes/Component)\n \n @method textarea\n @for Ember.Templates.helpers\n @param {Hash} options\n @public\n */\n /**\n The internal class used to create textarea element when the `{{textarea}}`\n helper is used.\n \n See [Ember.Templates.helpers.textarea](/api/ember/release/classes/Ember.Templates.helpers/methods/textarea?anchor=textarea) for usage details.\n \n ## Layout and LayoutName properties\n \n Because HTML `textarea` elements do not contain inner HTML the `layout` and\n `layoutName` properties will not be applied.\n \n @class TextArea\n @extends Component\n @uses Ember.TextSupport\n @public\n */\n const TextArea = _component.default.extend(_views.TextSupport, {\n classNames: ['ember-text-area'],\n layout: _empty.default,\n tagName: 'textarea',\n attributeBindings: ['rows', 'cols', 'name', 'selectionEnd', 'selectionStart', 'autocomplete', 'wrap', 'lang', 'dir', 'value'],\n rows: null,\n cols: null\n }); /**\n @module @ember/component\n */\n\n TextArea.toString = () => '@ember/component/text-area';\n exports.default = TextArea;\n});","enifed('@ember/-internals/glimmer/lib/components/text_field', ['exports', '@ember/-internals/browser-environment', '@ember/-internals/metal', '@ember/-internals/views', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/templates/empty'], function (exports, _browserEnvironment, _metal, _views, _component, _empty) {\n 'use strict';\n\n exports.__esModule = true;\n\n const inputTypes = Object.create(null); /**\n @module @ember/component\n */\n\n function canSetTypeOfInput(type) {\n if (type in inputTypes) {\n return inputTypes[type];\n }\n // if running in outside of a browser always return the\n // original type\n if (!_browserEnvironment.hasDOM) {\n inputTypes[type] = type;\n return type;\n }\n let inputTypeTestElement = document.createElement('input');\n try {\n inputTypeTestElement.type = type;\n } catch (e) {\n // ignored\n }\n return inputTypes[type] = inputTypeTestElement.type === type;\n }\n /**\n \n The internal class used to create text inputs when the `{{input}}`\n helper is used with `type` of `text`.\n \n See [Ember.Templates.helpers.input](/api/ember/release/classes/Ember.Templates.helpers/methods/input?anchor=input) for usage details.\n \n ## Layout and LayoutName properties\n \n Because HTML `input` elements are self closing `layout` and `layoutName`\n properties will not be applied.\n \n @class TextField\n @extends Component\n @uses Ember.TextSupport\n @public\n */\n const TextField = _component.default.extend(_views.TextSupport, {\n layout: _empty.default,\n classNames: ['ember-text-field'],\n tagName: 'input',\n attributeBindings: ['accept', 'autocomplete', 'autosave', 'dir', 'formaction', 'formenctype', 'formmethod', 'formnovalidate', 'formtarget', 'height', 'inputmode', 'lang', 'list', 'type', 'max', 'min', 'multiple', 'name', 'pattern', 'size', 'step', 'value', 'width'],\n /**\n The `value` attribute of the input element. As the user inputs text, this\n property is updated live.\n @property value\n @type String\n @default \"\"\n @public\n */\n value: '',\n /**\n The `type` attribute of the input element.\n @property type\n @type String\n @default \"text\"\n @public\n */\n type: (0, _metal.computed)({\n get() {\n return 'text';\n },\n set(_key, value) {\n let type = 'text';\n if (canSetTypeOfInput(value)) {\n type = value;\n }\n return type;\n }\n }),\n /**\n The `size` of the text field in characters.\n @property size\n @type String\n @default null\n @public\n */\n size: null,\n /**\n The `pattern` attribute of input element.\n @property pattern\n @type String\n @default null\n @public\n */\n pattern: null,\n /**\n The `min` attribute of input element used with `type=\"number\"` or `type=\"range\"`.\n @property min\n @type String\n @default null\n @since 1.4.0\n @public\n */\n min: null,\n /**\n The `max` attribute of input element used with `type=\"number\"` or `type=\"range\"`.\n @property max\n @type String\n @default null\n @since 1.4.0\n @public\n */\n max: null\n });\n TextField.toString = () => '@ember/component/text-field';\n exports.default = TextField;\n});","enifed('@ember/-internals/glimmer/lib/dom', ['exports', '@glimmer/runtime', '@glimmer/node'], function (exports, _runtime, _node) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'DOMChanges', {\n enumerable: true,\n get: function () {\n return _runtime.DOMChanges;\n }\n });\n Object.defineProperty(exports, 'DOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _runtime.DOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, 'clientBuilder', {\n enumerable: true,\n get: function () {\n return _runtime.clientBuilder;\n }\n });\n Object.defineProperty(exports, 'rehydrationBuilder', {\n enumerable: true,\n get: function () {\n return _runtime.rehydrationBuilder;\n }\n });\n Object.defineProperty(exports, 'NodeDOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _node.NodeDOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, 'serializeBuilder', {\n enumerable: true,\n get: function () {\n return _node.serializeBuilder;\n }\n });\n});","enifed('@ember/-internals/glimmer/lib/environment', ['exports', '@ember/-internals/owner', '@ember/-internals/views', '@ember/debug', '@glimmer/env', '@glimmer/runtime', '@ember/-internals/glimmer/lib/utils/debug-stack', '@ember/-internals/glimmer/lib/utils/iterable', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/utils/string', '@ember/-internals/glimmer/lib/protocol-for-url'], function (exports, _owner, _views, _debug, _env, _runtime, _debugStack, _iterable, _references, _string, _protocolForUrl) {\n 'use strict';\n\n exports.__esModule = true;\n class Environment extends _runtime.Environment {\n constructor(injections) {\n super(injections);\n this.inTransaction = false;\n this.owner = injections[_owner.OWNER];\n this.isInteractive = this.owner.lookup('-environment:main').isInteractive;\n // can be removed once https://github.com/tildeio/glimmer/pull/305 lands\n this.destroyedComponents = [];\n (0, _protocolForUrl.default)(this);\n if (_env.DEBUG) {\n this.debugStack = new _debugStack.default();\n }\n }\n static create(options) {\n return new this(options);\n }\n // this gets clobbered by installPlatformSpecificProtocolForURL\n // it really should just delegate to a platform specific injection\n protocolForURL(s) {\n return s;\n }\n lookupComponent(name, meta) {\n return (0, _views.lookupComponent)(meta.owner, name, meta);\n }\n toConditionalReference(reference) {\n return _references.ConditionalReference.create(reference);\n }\n iterableFor(ref, key) {\n return (0, _iterable.default)(ref, key);\n }\n scheduleInstallModifier(modifier, manager) {\n if (this.isInteractive) {\n super.scheduleInstallModifier(modifier, manager);\n }\n }\n scheduleUpdateModifier(modifier, manager) {\n if (this.isInteractive) {\n super.scheduleUpdateModifier(modifier, manager);\n }\n }\n didDestroy(destroyable) {\n destroyable.destroy();\n }\n begin() {\n this.inTransaction = true;\n super.begin();\n }\n commit() {\n let destroyedComponents = this.destroyedComponents;\n this.destroyedComponents = [];\n // components queued for destruction must be destroyed before firing\n // `didCreate` to prevent errors when removing and adding a component\n // with the same name (would throw an error when added to view registry)\n for (let i = 0; i < destroyedComponents.length; i++) {\n destroyedComponents[i].destroy();\n }\n try {\n super.commit();\n } finally {\n this.inTransaction = false;\n }\n }\n }\n exports.default = Environment;\n if (_env.DEBUG) {\n class StyleAttributeManager extends _runtime.SimpleDynamicAttribute {\n set(dom, value, env) {\n (0, _debug.warn)((0, _views.constructStyleDeprecationMessage)(value), (() => {\n if (value === null || value === undefined || (0, _string.isHTMLSafe)(value)) {\n return true;\n }\n return false;\n })(), { id: 'ember-htmlbars.style-xss-warning' });\n super.set(dom, value, env);\n }\n update(value, env) {\n (0, _debug.warn)((0, _views.constructStyleDeprecationMessage)(value), (() => {\n if (value === null || value === undefined || (0, _string.isHTMLSafe)(value)) {\n return true;\n }\n return false;\n })(), { id: 'ember-htmlbars.style-xss-warning' });\n super.update(value, env);\n }\n }\n Environment.prototype.attributeFor = function (element, attribute, isTrusting, namespace) {\n if (attribute === 'style' && !isTrusting) {\n return new StyleAttributeManager({ element, name: attribute, namespace });\n }\n return _runtime.Environment.prototype.attributeFor.call(this, element, attribute, isTrusting, namespace);\n };\n }\n});","enifed('@ember/-internals/glimmer/lib/helper', ['exports', '@ember/-internals/runtime', '@ember/-internals/utils', '@glimmer/reference'], function (exports, _runtime, _utils, _reference) {\n 'use strict';\n\n exports.__esModule = true;\n exports.RECOMPUTE_TAG = undefined;\n exports.isHelperFactory = isHelperFactory;\n exports.isSimpleHelper = isSimpleHelper;\n exports.helper = helper;\n const RECOMPUTE_TAG = exports.RECOMPUTE_TAG = (0, _utils.symbol)('RECOMPUTE_TAG'); /**\n @module @ember/component\n */\n function isHelperFactory(helper) {\n return typeof helper === 'object' && helper !== null && helper.class && helper.class.isHelperFactory;\n }\n function isSimpleHelper(helper) {\n return helper.destroy === undefined;\n }\n /**\n Ember Helpers are functions that can compute values, and are used in templates.\n For example, this code calls a helper named `format-currency`:\n \n ```handlebars\n
    {{format-currency cents currency=\"$\"}}
    \n ```\n \n Additionally a helper can be called as a nested helper (sometimes called a\n subexpression). In this example, the computed value of a helper is passed\n to a component named `show-money`:\n \n ```handlebars\n {{show-money amount=(format-currency cents currency=\"$\")}}\n ```\n \n Helpers defined using a class must provide a `compute` function. For example:\n \n ```app/helpers/format-currency.js\n import Helper from '@ember/component/helper';\n \n export default Helper.extend({\n compute([cents], { currency }) {\n return `${currency}${cents * 0.01}`;\n }\n });\n ```\n \n Each time the input to a helper changes, the `compute` function will be\n called again.\n \n As instances, these helpers also have access to the container and will accept\n injected dependencies.\n \n Additionally, class helpers can call `recompute` to force a new computation.\n \n @class Helper\n @public\n @since 1.13.0\n */\n let Helper = _runtime.FrameworkObject.extend({\n init() {\n this._super(...arguments);\n this[RECOMPUTE_TAG] = _reference.DirtyableTag.create();\n },\n /**\n On a class-based helper, it may be useful to force a recomputation of that\n helpers value. This is akin to `rerender` on a component.\n For example, this component will rerender when the `currentUser` on a\n session service changes:\n ```app/helpers/current-user-email.js\n import Helper from '@ember/component/helper'\n import { inject as service } from '@ember/service'\n import { observer } from '@ember/object'\n export default Helper.extend({\n session: service(),\n onNewUser: observer('session.currentUser', function() {\n this.recompute();\n }),\n compute() {\n return this.get('session.currentUser.email');\n }\n });\n ```\n @method recompute\n @public\n @since 1.13.0\n */\n recompute() {\n this[RECOMPUTE_TAG].inner.dirty();\n }\n });\n Helper.isHelperFactory = true;\n class Wrapper {\n constructor(compute) {\n this.compute = compute;\n this.isHelperFactory = true;\n }\n create() {\n // needs new instance or will leak containers\n return {\n compute: this.compute\n };\n }\n }\n /**\n In many cases, the ceremony of a full `Helper` class is not required.\n The `helper` method create pure-function helpers without instances. For\n example:\n \n ```app/helpers/format-currency.js\n import { helper } from '@ember/component/helper';\n \n export default helper(function(params, hash) {\n let cents = params[0];\n let currency = hash.currency;\n return `${currency}${cents * 0.01}`;\n });\n ```\n \n @static\n @param {Function} helper The helper function\n @method helper\n @for @ember/component/helper\n @public\n @since 1.13.0\n */\n function helper(helperFn) {\n return new Wrapper(helperFn);\n }\n exports.default = Helper;\n});","enifed('@ember/-internals/glimmer/lib/helpers/-assert-implicit-component-helper-argument', ['exports', '@glimmer/env'], function (exports, _env) {\n 'use strict';\n\n exports.__esModule = true;\n\n class ComponentAssertionReference {\n constructor(component, message) {\n this.component = component;\n this.message = message;\n this.tag = component.tag;\n }\n value() {\n let value = this.component.value();\n if (typeof value === 'string') {\n throw new TypeError(this.message);\n }\n return value;\n }\n get(property) {\n return this.component.get(property);\n }\n }\n\n exports.default = (_vm, args) => {\n if (_env.DEBUG) {\n return new ComponentAssertionReference(args.positional.at(0), args.positional.at(1).value());\n } else {\n return args.positional.at(0);\n }\n };\n});","enifed('@ember/-internals/glimmer/lib/helpers/-class', ['exports', '@ember/string', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _string, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(classHelper, args.capture());\n };\n\n function classHelper({ positional }) {\n let path = positional.at(0);\n let args = positional.length;\n let value = path.value();\n if (value === true) {\n if (args > 1) {\n return (0, _string.dasherize)(positional.at(1).value());\n }\n return null;\n }\n if (value === false) {\n if (args > 2) {\n return (0, _string.dasherize)(positional.at(2).value());\n }\n return null;\n }\n return value;\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/-html-safe', ['exports', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/utils/string'], function (exports, _references, _string) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(htmlSafe, args.capture());\n };\n\n function htmlSafe({ positional }) {\n let path = positional.at(0);\n return new _string.SafeString(path.value());\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/-input-type', ['exports', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(inputTypeHelper, args.capture());\n };\n\n function inputTypeHelper({ positional }) {\n let type = positional.at(0).value();\n if (type === 'checkbox') {\n return '-checkbox';\n }\n return '-text-field';\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/-normalize-class', ['exports', '@ember/string', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _string, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(normalizeClass, args.capture());\n };\n\n function normalizeClass({ positional }) {\n let classNameParts = positional.at(0).value().split('.');\n let className = classNameParts[classNameParts.length - 1];\n let value = positional.at(1).value();\n if (value === true) {\n return (0, _string.dasherize)(className);\n } else if (!value && value !== 0) {\n return '';\n } else {\n return String(value);\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/action', ['exports', '@ember/-internals/metal', '@ember/debug', '@ember/instrumentation', '@ember/runloop', '@glimmer/env', '@glimmer/reference', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _metal, _debug, _instrumentation, _runloop, _env, _reference, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n let { named, positional } = args;\n let capturedArgs = positional.capture();\n // The first two argument slots are reserved.\n // pos[0] is the context (or `this`)\n // pos[1] is the action name or function\n // Anything else is an action argument.\n let [context, action, ...restArgs] = capturedArgs.references;\n // TODO: Is there a better way of doing this?\n let debugKey = action._propertyKey;\n let target = named.has('target') ? named.get('target') : context;\n let processArgs = makeArgsProcessor(named.has('value') && named.get('value'), restArgs);\n let fn;\n if (typeof action[_references.INVOKE] === 'function') {\n fn = makeClosureAction(action, action, action[_references.INVOKE], processArgs, debugKey);\n } else if ((0, _reference.isConst)(target) && (0, _reference.isConst)(action)) {\n fn = makeClosureAction(context.value(), target.value(), action.value(), processArgs, debugKey);\n } else {\n fn = makeDynamicClosureAction(context.value(), target, action, processArgs, debugKey);\n }\n fn[_references.ACTION] = true;\n return new _references.UnboundReference(fn);\n };\n\n /**\n @module ember\n */\n function NOOP(args) {\n return args;\n }\n /**\n The `{{action}}` helper provides a way to pass triggers for behavior (usually\n just a function) between components, and into components from controllers.\n \n ### Passing functions with the action helper\n \n There are three contexts an action helper can be used in. The first two\n contexts to discuss are attribute context, and Handlebars value context.\n \n ```handlebars\n {{! An example of attribute context }}\n
    \n {{! Examples of Handlebars value context }}\n {{input on-input=(action \"save\")}}\n {{yield (action \"refreshData\") andAnotherParam}}\n ```\n \n In these contexts,\n the helper is called a \"closure action\" helper. Its behavior is simple:\n If passed a function name, read that function off the `actions` property\n of the current context. Once that function is read, or immediately if a function was\n passed, create a closure over that function and any arguments.\n The resulting value of an action helper used this way is simply a function.\n \n For example, in the attribute context:\n \n ```handlebars\n {{! An example of attribute context }}\n
    \n ```\n \n The resulting template render logic would be:\n \n ```js\n var div = document.createElement('div');\n var actionFunction = (function(context){\n return function() {\n return context.actions.save.apply(context, arguments);\n };\n })(context);\n div.onclick = actionFunction;\n ```\n \n Thus when the div is clicked, the action on that context is called.\n Because the `actionFunction` is just a function, closure actions can be\n passed between components and still execute in the correct context.\n \n Here is an example action handler on a component:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n save() {\n this.get('model').save();\n }\n }\n });\n ```\n \n Actions are always looked up on the `actions` property of the current context.\n This avoids collisions in the naming of common actions, such as `destroy`.\n Two options can be passed to the `action` helper when it is used in this way.\n \n * `target=someProperty` will look to `someProperty` instead of the current\n context for the `actions` hash. This can be useful when targeting a\n service for actions.\n * `value=\"target.value\"` will read the path `target.value` off the first\n argument to the action when it is called and rewrite the first argument\n to be that value. This is useful when attaching actions to event listeners.\n \n ### Invoking an action\n \n Closure actions curry both their scope and any arguments. When invoked, any\n additional arguments are added to the already curried list.\n Actions should be invoked using the [sendAction](/api/ember/release/classes/Component/methods/sendAction?anchor=sendAction)\n method. The first argument to `sendAction` is the action to be called, and\n additional arguments are passed to the action function. This has interesting\n properties combined with currying of arguments. For example:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n // Usage {{input on-input=(action (action 'setName' model) value=\"target.value\")}}\n setName(model, name) {\n model.set('name', name);\n }\n }\n });\n ```\n \n The first argument (`model`) was curried over, and the run-time argument (`event`)\n becomes a second argument. Action calls can be nested this way because each simply\n returns a function. Any function can be passed to the `{{action}}` helper, including\n other actions.\n \n Actions invoked with `sendAction` have the same currying behavior as demonstrated\n with `on-input` above. For example:\n \n ```app/components/my-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n setName(model, name) {\n model.set('name', name);\n }\n }\n });\n ```\n \n ```handlebars\n {{my-input submit=(action 'setName' model)}}\n ```\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n click() {\n // Note that model is not passed, it was curried in the template\n this.sendAction('submit', 'bob');\n }\n });\n ```\n \n ### Attaching actions to DOM elements\n \n The third context of the `{{action}}` helper can be called \"element space\".\n For example:\n \n ```handlebars\n {{! An example of element space }}\n
    \n ```\n \n Used this way, the `{{action}}` helper provides a useful shortcut for\n registering an HTML element in a template for a single DOM event and\n forwarding that interaction to the template's context (controller or component).\n If the context of a template is a controller, actions used this way will\n bubble to routes when the controller does not implement the specified action.\n Once an action hits a route, it will bubble through the route hierarchy.\n \n ### Event Propagation\n \n `{{action}}` helpers called in element space can control event bubbling. Note\n that the closure style actions cannot.\n \n Events triggered through the action helper will automatically have\n `.preventDefault()` called on them. You do not need to do so in your event\n handlers. If you need to allow event propagation (to handle file inputs for\n example) you can supply the `preventDefault=false` option to the `{{action}}` helper:\n \n ```handlebars\n
    \n \n \n
    \n ```\n \n To disable bubbling, pass `bubbles=false` to the helper:\n \n ```handlebars\n \n ```\n \n To disable bubbling with closure style actions you must create your own\n wrapper helper that makes use of `event.stopPropagation()`:\n \n ```handlebars\n
    Hello
    \n ```\n \n ```app/helpers/disable-bubbling.js\n import { helper } from '@ember/component/helper';\n \n export function disableBubbling([action]) {\n return function(event) {\n event.stopPropagation();\n return action(event);\n };\n }\n export default helper(disableBubbling);\n ```\n \n If you need the default handler to trigger you should either register your\n own event handler, or use event methods on your view class. See\n [\"Responding to Browser Events\"](/api/ember/release/classes/Component)\n in the documentation for `Component` for more information.\n \n ### Specifying DOM event type\n \n `{{action}}` helpers called in element space can specify an event type.\n By default the `{{action}}` helper registers for DOM `click` events. You can\n supply an `on` option to the helper to specify a different DOM event name:\n \n ```handlebars\n
    \n click me\n
    \n ```\n \n See [\"Event Names\"](/api/ember/release/classes/Component) for a list of\n acceptable DOM event names.\n \n ### Specifying whitelisted modifier keys\n \n `{{action}}` helpers called in element space can specify modifier keys.\n By default the `{{action}}` helper will ignore click events with pressed modifier\n keys. You can supply an `allowedKeys` option to specify which keys should not be ignored.\n \n ```handlebars\n
    \n click me\n
    \n ```\n \n This way the action will fire when clicking with the alt key pressed down.\n Alternatively, supply \"any\" to the `allowedKeys` option to accept any combination of modifier keys.\n \n ```handlebars\n
    \n click me with any key pressed\n
    \n ```\n \n ### Specifying a Target\n \n A `target` option can be provided to the helper to change\n which object will receive the method call. This option must be a path\n to an object, accessible in the current context:\n \n ```app/templates/application.hbs\n
    \n click me\n
    \n ```\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { inject as service } from '@ember/service';\n \n export default Controller.extend({\n someService: service()\n });\n ```\n \n @method action\n @for Ember.Templates.helpers\n @public\n */\n\n function makeArgsProcessor(valuePathRef, actionArgsRef) {\n let mergeArgs;\n if (actionArgsRef.length > 0) {\n mergeArgs = args => {\n return actionArgsRef.map(ref => ref.value()).concat(args);\n };\n }\n let readValue;\n if (valuePathRef) {\n readValue = args => {\n let valuePath = valuePathRef.value();\n if (valuePath && args.length > 0) {\n args[0] = (0, _metal.get)(args[0], valuePath);\n }\n return args;\n };\n }\n if (mergeArgs && readValue) {\n return args => {\n return readValue(mergeArgs(args));\n };\n } else {\n return mergeArgs || readValue || NOOP;\n }\n }\n function makeDynamicClosureAction(context, targetRef, actionRef, processArgs, debugKey) {\n // We don't allow undefined/null values, so this creates a throw-away action to trigger the assertions\n if (_env.DEBUG) {\n makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey);\n }\n return (...args) => {\n return makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey)(...args);\n };\n }\n function makeClosureAction(context, target, action, processArgs, debugKey) {\n let self;\n let fn;\n (0, _debug.assert)(`Action passed is null or undefined in (action) from ${target}.`, action !== undefined && action !== null);\n if (typeof action[_references.INVOKE] === 'function') {\n self = action;\n fn = action[_references.INVOKE];\n } else {\n let typeofAction = typeof action;\n if (typeofAction === 'string') {\n self = target;\n fn = target.actions && target.actions[action];\n (0, _debug.assert)(`An action named '${action}' was not found in ${target}`, fn);\n } else if (typeofAction === 'function') {\n self = context;\n fn = action;\n } else {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`An action could not be made for \\`${debugKey || action}\\` in ${target}. Please confirm that you are using either a quoted action name (i.e. \\`(action '${debugKey || 'myAction'}')\\`) or a function available in ${target}.`, false);\n }\n }\n return (...args) => {\n let payload = { target: self, args, label: '@glimmer/closure-action' };\n return (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n return (0, _runloop.join)(self, fn, ...processArgs(args));\n });\n };\n }\n});","enifed(\"@ember/-internals/glimmer/lib/helpers/component\", [], function () {\n \"use strict\";\n /**\n @module ember\n */\n /**\n The `{{component}}` helper lets you add instances of `Component` to a\n template. See [Component](/api/ember/release/classes/Component) for\n additional information on how a `Component` functions.\n `{{component}}`'s primary use is for cases where you want to dynamically\n change which type of component is rendered as the state of your application\n changes. This helper has three modes: inline, block, and nested.\n \n ### Inline Form\n \n Given the following template:\n \n ```app/application.hbs\n {{component infographicComponentName}}\n ```\n \n And the following application code:\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { computed } from '@ember/object';\n \n export default Controller.extend({\n infographicComponentName: computed('isMarketOpen', {\n get() {\n if (this.get('isMarketOpen')) {\n return 'live-updating-chart';\n } else {\n return 'market-close-summary';\n }\n }\n })\n });\n ```\n \n The `live-updating-chart` component will be appended when `isMarketOpen` is\n `true`, and the `market-close-summary` component will be appended when\n `isMarketOpen` is `false`. If the value changes while the app is running,\n the component will be automatically swapped out accordingly.\n Note: You should not use this helper when you are consistently rendering the same\n component. In that case, use standard component syntax, for example:\n \n ```app/templates/application.hbs\n {{live-updating-chart}}\n ```\n \n ### Block Form\n \n Using the block form of this helper is similar to using the block form\n of a component. Given the following application template:\n \n ```app/templates/application.hbs\n {{#component infographicComponentName}}\n Last update: {{lastUpdateTimestamp}}\n {{/component}}\n ```\n \n The following controller code:\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { computed } from '@ember/object';\n \n export default Controller.extend({\n lastUpdateTimestamp: computed(function() {\n return new Date();\n }),\n \n infographicComponentName: computed('isMarketOpen', {\n get() {\n if (this.get('isMarketOpen')) {\n return 'live-updating-chart';\n } else {\n return 'market-close-summary';\n }\n }\n })\n });\n ```\n \n And the following component template:\n \n ```app/templates/components/live-updating-chart.hbs\n {{! chart }}\n {{yield}}\n ```\n \n The `Last Update: {{lastUpdateTimestamp}}` will be rendered in place of the `{{yield}}`.\n \n ### Nested Usage\n \n The `component` helper can be used to package a component path with initial attrs.\n The included attrs can then be merged during the final invocation.\n For example, given a `person-form` component with the following template:\n \n ```app/templates/components/person-form.hbs\n {{yield (hash\n nameInput=(component \"my-input-component\" value=model.name placeholder=\"First Name\")\n )}}\n ```\n \n When yielding the component via the `hash` helper, the component is invoked directly.\n See the following snippet:\n \n ```\n {{#person-form as |form|}}\n {{form.nameInput placeholder=\"Username\"}}\n {{/person-form}}\n ```\n \n Which outputs an input whose value is already bound to `model.name` and `placeholder`\n is \"Username\".\n \n When yielding the component without the hash helper use the `component` helper.\n For example, below is a `full-name` component template:\n \n ```handlebars\n {{yield (component \"my-input-component\" value=model.name placeholder=\"Name\")}}\n ```\n \n ```\n {{#full-name as |field|}}\n {{component field placeholder=\"Full name\"}}\n {{/full-name}}\n ```\n \n @method component\n @since 1.11.0\n @for Ember.Templates.helpers\n @public\n */\n});","enifed('@ember/-internals/glimmer/lib/helpers/concat', ['exports', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(concat, args.capture());\n };\n\n const isEmpty = value => {\n return value === null || value === undefined || typeof value.toString !== 'function';\n };\n const normalizeTextValue = value => {\n if (isEmpty(value)) {\n return '';\n }\n return String(value);\n };\n /**\n @module ember\n */\n /**\n Concatenates the given arguments into a string.\n \n Example:\n \n ```handlebars\n {{some-component name=(concat firstName \" \" lastName)}}\n \n {{! would pass name=\" \" to the component}}\n ```\n \n @public\n @method concat\n @for Ember.Templates.helpers\n @since 1.13.0\n */\n function concat({ positional }) {\n return positional.value().map(normalizeTextValue).join('');\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/each-in', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isEachIn = isEachIn;\n\n exports.default = function (_vm, args) {\n return new EachInReference(args.positional.at(0));\n };\n\n /**\n The `{{#each}}` helper loops over elements in a collection. It is an extension\n of the base Handlebars `{{#each}}` helper.\n The default behavior of `{{#each}}` is to yield its inner block once for every\n item in an array passing the item as the first block parameter.\n \n ```javascript\n var developers = [{ name: 'Yehuda' },{ name: 'Tom' }, { name: 'Paul' }];\n ```\n \n ```handlebars\n {{#each developers key=\"name\" as |person|}}\n {{person.name}}\n {{! `this` is whatever it was outside the #each }}\n {{/each}}\n ```\n \n The same rules apply to arrays of primitives.\n \n ```javascript\n var developerNames = ['Yehuda', 'Tom', 'Paul']\n ```\n \n ```handlebars\n {{#each developerNames key=\"@index\" as |name|}}\n {{name}}\n {{/each}}\n ```\n \n During iteration, the index of each item in the array is provided as a second block parameter.\n \n ```handlebars\n
      \n {{#each people as |person index|}}\n
    • Hello, {{person.name}}! You're number {{index}} in line
    • \n {{/each}}\n
    \n ```\n \n ### Specifying Keys\n \n The `key` option is used to tell Ember how to determine if the array being\n iterated over with `{{#each}}` has changed between renders. By helping Ember\n detect that some elements in the array are the same, DOM elements can be\n re-used, significantly improving rendering speed.\n \n For example, here's the `{{#each}}` helper with its `key` set to `id`:\n \n ```handlebars\n {{#each model key=\"id\" as |item|}}\n {{/each}}\n ```\n \n When this `{{#each}}` re-renders, Ember will match up the previously rendered\n items (and reorder the generated DOM elements) based on each item's `id`\n property.\n By default the item's own reference is used.\n \n ### {{else}} condition\n \n `{{#each}}` can have a matching `{{else}}`. The contents of this block will render\n if the collection is empty.\n \n ```handlebars\n {{#each developers as |person|}}\n {{person.name}}\n {{else}}\n

    Sorry, nobody is available for this task.

    \n {{/each}}\n ```\n \n @method each\n @for Ember.Templates.helpers\n @public\n */\n /**\n The `{{each-in}}` helper loops over properties on an object.\n \n For example, given a `user` object that looks like:\n \n ```javascript\n {\n \"name\": \"Shelly Sails\",\n \"age\": 42\n }\n ```\n \n This template would display all properties on the `user`\n object in a list:\n \n ```handlebars\n
      \n {{#each-in user as |key value|}}\n
    • {{key}}: {{value}}
    • \n {{/each-in}}\n
    \n ```\n \n Outputting their name and age.\n \n @method each-in\n @for Ember.Templates.helpers\n @public\n @since 2.1.0\n */\n const EACH_IN_REFERENCE = (0, _utils.symbol)('EACH_IN'); /**\n @module ember\n */\n\n class EachInReference {\n constructor(inner) {\n this.inner = inner;\n this.tag = inner.tag;\n this[EACH_IN_REFERENCE] = true;\n }\n value() {\n return this.inner.value();\n }\n get(key) {\n return this.inner.get(key);\n }\n }\n function isEachIn(ref) {\n return ref !== null && typeof ref === 'object' && ref[EACH_IN_REFERENCE];\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/get', ['exports', '@ember/-internals/metal', '@glimmer/reference', '@glimmer/runtime', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _metal, _reference, _runtime, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return GetHelperReference.create(args.positional.at(0), args.positional.at(1));\n };\n\n function referenceFromPath(source, path) {\n let innerReference;\n if (path === undefined || path === null || path === '') {\n innerReference = _runtime.NULL_REFERENCE;\n } else if (typeof path === 'string' && path.indexOf('.') > -1) {\n innerReference = (0, _references.referenceFromParts)(source, path.split('.'));\n } else {\n innerReference = source.get(path);\n }\n return innerReference;\n }\n /**\n @module ember\n */\n /**\n Dynamically look up a property on an object. The second argument to `{{get}}`\n should have a string value, although it can be bound.\n \n For example, these two usages are equivalent:\n \n ```handlebars\n {{person.height}}\n {{get person \"height\"}}\n ```\n \n If there were several facts about a person, the `{{get}}` helper can dynamically\n pick one:\n \n ```handlebars\n {{get person factName}}\n ```\n \n For a more complex example, this template would allow the user to switch\n between showing the user's height and weight with a click:\n \n ```handlebars\n {{get person factName}}\n \n \n ```\n \n The `{{get}}` helper can also respect mutable values itself. For example:\n \n ```handlebars\n {{input value=(mut (get person factName)) type=\"text\"}}\n \n \n ```\n \n Would allow the user to swap what fact is being displayed, and also edit\n that fact via a two-way mutable binding.\n \n @public\n @method get\n @for Ember.Templates.helpers\n @since 2.1.0\n */\n\n class GetHelperReference extends _references.CachedReference {\n static create(sourceReference, pathReference) {\n if ((0, _reference.isConst)(pathReference)) {\n let path = pathReference.value();\n return referenceFromPath(sourceReference, path);\n } else {\n return new GetHelperReference(sourceReference, pathReference);\n }\n }\n constructor(sourceReference, pathReference) {\n super();\n this.sourceReference = sourceReference;\n this.pathReference = pathReference;\n this.lastPath = null;\n this.innerReference = _runtime.NULL_REFERENCE;\n let innerTag = this.innerTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([sourceReference.tag, pathReference.tag, innerTag]);\n }\n compute() {\n let { lastPath, innerReference, innerTag } = this;\n let path = this.pathReference.value();\n if (path !== lastPath) {\n innerReference = referenceFromPath(this.sourceReference, path);\n innerTag.inner.update(innerReference.tag);\n this.innerReference = innerReference;\n this.lastPath = path;\n }\n return innerReference.value();\n }\n [_references.UPDATE](value) {\n (0, _metal.set)(this.sourceReference.value(), this.pathReference.value(), value);\n }\n }\n});","enifed(\"@ember/-internals/glimmer/lib/helpers/hash\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return args.named.capture();\n };\n});","enifed('@ember/-internals/glimmer/lib/helpers/if-unless', ['exports', '@ember/debug', '@glimmer/reference', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _debug, _reference, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.inlineIf = inlineIf;\n exports.inlineUnless = inlineUnless;\n\n class ConditionalHelperReference extends _references.CachedReference {\n static create(_condRef, truthyRef, falsyRef) {\n let condRef = _references.ConditionalReference.create(_condRef);\n if ((0, _reference.isConst)(condRef)) {\n return condRef.value() ? truthyRef : falsyRef;\n } else {\n return new ConditionalHelperReference(condRef, truthyRef, falsyRef);\n }\n }\n constructor(cond, truthy, falsy) {\n super();\n this.branchTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([cond.tag, this.branchTag]);\n this.cond = cond;\n this.truthy = truthy;\n this.falsy = falsy;\n }\n compute() {\n let branch = this.cond.value() ? this.truthy : this.falsy;\n this.branchTag.inner.update(branch.tag);\n return branch.value();\n }\n }\n /**\n The `if` helper allows you to conditionally render one of two branches,\n depending on the \"truthiness\" of a property.\n For example the following values are all falsey: `false`, `undefined`, `null`, `\"\"`, `0`, `NaN` or an empty array.\n \n This helper has two forms, block and inline.\n \n ## Block form\n \n You can use the block form of `if` to conditionally render a section of the template.\n \n To use it, pass the conditional value to the `if` helper,\n using the block form to wrap the section of template you want to conditionally render.\n Like so:\n \n ```handlebars\n {{! will not render if foo is falsey}}\n {{#if foo}}\n Welcome to the {{foo.bar}}\n {{/if}}\n ```\n \n You can also specify a template to show if the property is falsey by using\n the `else` helper.\n \n ```handlebars\n {{! is it raining outside?}}\n {{#if isRaining}}\n Yes, grab an umbrella!\n {{else}}\n No, it's lovely outside!\n {{/if}}\n ```\n \n You are also able to combine `else` and `if` helpers to create more complex\n conditional logic.\n \n ```handlebars\n {{#if isMorning}}\n Good morning\n {{else if isAfternoon}}\n Good afternoon\n {{else}}\n Good night\n {{/if}}\n ```\n \n ## Inline form\n \n The inline `if` helper conditionally renders a single property or string.\n \n In this form, the `if` helper receives three arguments, the conditional value,\n the value to render when truthy, and the value to render when falsey.\n \n For example, if `useLongGreeting` is truthy, the following:\n \n ```handlebars\n {{if useLongGreeting \"Hello\" \"Hi\"}} Alex\n ```\n \n Will render:\n \n ```html\n Hello Alex\n ```\n \n ### Nested `if`\n \n You can use the `if` helper inside another helper as a nested helper:\n \n ```handlebars\n {{some-component height=(if isBig \"100\" \"10\")}}\n ```\n \n One detail to keep in mind is that both branches of the `if` helper will be evaluated,\n so if you have `{{if condition \"foo\" (expensive-operation \"bar\")`,\n `expensive-operation` will always calculate.\n \n @method if\n @for Ember.Templates.helpers\n @public\n */\n /**\n @module ember\n */\n function inlineIf(_vm, { positional }) {\n (0, _debug.assert)('The inline form of the `if` helper expects two or three arguments, e.g. ' + '`{{if trialExpired \"Expired\" expiryDate}}`.', positional.length === 3 || positional.length === 2);\n return ConditionalHelperReference.create(positional.at(0), positional.at(1), positional.at(2));\n }\n /**\n The inline `unless` helper conditionally renders a single property or string.\n This helper acts like a ternary operator. If the first property is falsy,\n the second argument will be displayed, otherwise, the third argument will be\n displayed\n \n ```handlebars\n {{unless useLongGreeting \"Hi\" \"Hello\"}} Ben\n ```\n \n You can use the `unless` helper inside another helper as a subexpression.\n \n ```handlebars\n {{some-component height=(unless isBig \"10\" \"100\")}}\n ```\n \n @method unless\n @for Ember.Templates.helpers\n @public\n */\n function inlineUnless(_vm, { positional }) {\n (0, _debug.assert)('The inline form of the `unless` helper expects two or three arguments, e.g. ' + '`{{unless isFirstLogin \"Welcome back!\"}}`.', positional.length === 3 || positional.length === 2);\n return ConditionalHelperReference.create(positional.at(0), positional.at(2), positional.at(1));\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/loc', ['exports', '@ember/string', '@ember/-internals/glimmer/lib/helper'], function (exports, _string, _helper) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = (0, _helper.helper)(function (params) {\n return _string.loc.apply(null, params);\n });\n});","enifed('@ember/-internals/glimmer/lib/helpers/log', ['exports', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(log, args.capture());\n };\n\n /**\n @module ember\n */\n /**\n `log` allows you to output the value of variables in the current rendering\n context. `log` also accepts primitive types such as strings or numbers.\n \n ```handlebars\n {{log \"myVariable:\" myVariable }}\n ```\n \n @method log\n @for Ember.Templates.helpers\n @param {Array} params\n @public\n */\n function log({ positional }) {\n /* eslint-disable no-console */\n console.log(...positional.value());\n /* eslint-enable no-console */\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/mut', ['exports', '@ember/-internals/utils', '@ember/debug', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _utils, _debug, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isMut = isMut;\n exports.unMut = unMut;\n\n exports.default = function (_vm, args) {\n let rawRef = args.positional.at(0);\n if (isMut(rawRef)) {\n return rawRef;\n }\n // TODO: Improve this error message. This covers at least two distinct\n // cases:\n //\n // 1. (mut \"not a path\") – passing a literal, result from a helper\n // invocation, etc\n //\n // 2. (mut receivedValue) – passing a value received from the caller\n // that was originally derived from a literal, result from a helper\n // invocation, etc\n //\n // This message is alright for the first case, but could be quite\n // confusing for the second case.\n (0, _debug.assert)('You can only pass a path to mut', rawRef[_references.UPDATE]);\n let wrappedRef = Object.create(rawRef);\n wrappedRef[SOURCE] = rawRef;\n wrappedRef[_references.INVOKE] = rawRef[_references.UPDATE];\n wrappedRef[MUT_REFERENCE] = true;\n return wrappedRef;\n };\n\n /**\n The `mut` helper lets you __clearly specify__ that a child `Component` can update the\n (mutable) value passed to it, which will __change the value of the parent component__.\n \n To specify that a parameter is mutable, when invoking the child `Component`:\n \n ```handlebars\n {{my-child childClickCount=(mut totalClicks)}}\n ```\n \n The child `Component` can then modify the parent's value just by modifying its own\n property:\n \n ```javascript\n // my-child.js\n export default Component.extend({\n click() {\n this.incrementProperty('childClickCount');\n }\n });\n ```\n \n Note that for curly components (`{{my-component}}`) the bindings are already mutable,\n making the `mut` unnecessary.\n \n Additionally, the `mut` helper can be combined with the `action` helper to\n mutate a value. For example:\n \n ```handlebars\n {{my-child childClickCount=totalClicks click-count-change=(action (mut totalClicks))}}\n ```\n \n The child `Component` would invoke the action with the new click value:\n \n ```javascript\n // my-child.js\n export default Component.extend({\n click() {\n this.get('click-count-change')(this.get('childClickCount') + 1);\n }\n });\n ```\n \n The `mut` helper changes the `totalClicks` value to what was provided as the action argument.\n \n The `mut` helper, when used with `action`, will return a function that\n sets the value passed to `mut` to its first argument. This works like any other\n closure action and interacts with the other features `action` provides.\n As an example, we can create a button that increments a value passing the value\n directly to the `action`:\n \n ```handlebars\n {{! inc helper is not provided by Ember }}\n \n ```\n \n You can also use the `value` option:\n \n ```handlebars\n \n ```\n \n @method mut\n @param {Object} [attr] the \"two-way\" attribute that can be modified.\n @for Ember.Templates.helpers\n @public\n */\n const MUT_REFERENCE = (0, _utils.symbol)('MUT'); /**\n @module ember\n */\n\n const SOURCE = (0, _utils.symbol)('SOURCE');\n function isMut(ref) {\n return ref && ref[MUT_REFERENCE];\n }\n function unMut(ref) {\n return ref[SOURCE] || ref;\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/query-param', ['exports', '@ember/-internals/routing', '@ember/debug', '@ember/polyfills', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _routing, _debug, _polyfills, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(queryParams, args.capture());\n };\n\n /**\n This is a helper to be used in conjunction with the link-to helper.\n It will supply url query parameters to the target route.\n \n Example\n \n ```handlebars\n {{#link-to 'posts' (query-params direction=\"asc\")}}Sort{{/link-to}}\n ```\n \n @method query-params\n @for Ember.Templates.helpers\n @param {Object} hash takes a hash of query parameters\n @return {Object} A `QueryParams` object for `{{link-to}}`\n @public\n */\n /**\n @module ember\n */\n function queryParams({ positional, named }) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(\"The `query-params` helper only accepts hash parameters, e.g. (query-params queryParamPropertyName='foo') as opposed to just (query-params 'foo')\", positional.value().length === 0);\n return new _routing.QueryParams((0, _polyfills.assign)({}, named.value()));\n }\n});","enifed('@ember/-internals/glimmer/lib/helpers/readonly', ['exports', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/helpers/mut'], function (exports, _references, _mut) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n let ref = (0, _mut.unMut)(args.positional.at(0));\n return new _references.ReadonlyReference(ref);\n };\n});","enifed('@ember/-internals/glimmer/lib/helpers/unbound', ['exports', '@ember/debug', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _debug, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n exports.default = function (_vm, args) {\n (0, _debug.assert)('unbound helper cannot be called with multiple params or hash params', args.positional.length === 1 && args.named.length === 0);\n return _references.UnboundReference.create(args.positional.at(0).value());\n };\n});","enifed('@ember/-internals/glimmer/lib/modifiers/action', ['exports', '@ember/-internals/utils', '@ember/-internals/views', '@ember/debug', '@ember/instrumentation', '@ember/runloop', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _utils, _views, _debug, _instrumentation, _runloop, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ActionState = exports.ActionHelper = undefined;\n\n const MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];\n const POINTER_EVENT_TYPE_REGEX = /^click|mouse|touch/;\n function isAllowedEvent(event, allowedKeys) {\n if (allowedKeys === null || allowedKeys === undefined) {\n if (POINTER_EVENT_TYPE_REGEX.test(event.type)) {\n return (0, _views.isSimpleClick)(event);\n } else {\n allowedKeys = '';\n }\n }\n if (allowedKeys.indexOf('any') >= 0) {\n return true;\n }\n for (let i = 0; i < MODIFIERS.length; i++) {\n if (event[MODIFIERS[i] + 'Key'] && allowedKeys.indexOf(MODIFIERS[i]) === -1) {\n return false;\n }\n }\n return true;\n }\n let ActionHelper = exports.ActionHelper = {\n // registeredActions is re-exported for compatibility with older plugins\n // that were using this undocumented API.\n registeredActions: _views.ActionManager.registeredActions,\n registerAction(actionState) {\n let { actionId } = actionState;\n _views.ActionManager.registeredActions[actionId] = actionState;\n return actionId;\n },\n unregisterAction(actionState) {\n let { actionId } = actionState;\n delete _views.ActionManager.registeredActions[actionId];\n }\n };\n class ActionState {\n constructor(element, actionId, actionName, actionArgs, namedArgs, positionalArgs, implicitTarget, dom, tag) {\n this.element = element;\n this.actionId = actionId;\n this.actionName = actionName;\n this.actionArgs = actionArgs;\n this.namedArgs = namedArgs;\n this.positional = positionalArgs;\n this.implicitTarget = implicitTarget;\n this.dom = dom;\n this.eventName = this.getEventName();\n this.tag = tag;\n }\n getEventName() {\n return this.namedArgs.get('on').value() || 'click';\n }\n getActionArgs() {\n let result = new Array(this.actionArgs.length);\n for (let i = 0; i < this.actionArgs.length; i++) {\n result[i] = this.actionArgs[i].value();\n }\n return result;\n }\n getTarget() {\n let { implicitTarget, namedArgs } = this;\n let target;\n if (namedArgs.has('target')) {\n target = namedArgs.get('target').value();\n } else {\n target = implicitTarget.value();\n }\n return target;\n }\n handler(event) {\n let { actionName, namedArgs } = this;\n let bubbles = namedArgs.get('bubbles');\n let preventDefault = namedArgs.get('preventDefault');\n let allowedKeys = namedArgs.get('allowedKeys');\n let target = this.getTarget();\n let shouldBubble = bubbles.value() !== false;\n if (!isAllowedEvent(event, allowedKeys.value())) {\n return true;\n }\n if (preventDefault.value() !== false) {\n event.preventDefault();\n }\n if (!shouldBubble) {\n event.stopPropagation();\n }\n (0, _runloop.join)(() => {\n let args = this.getActionArgs();\n let payload = {\n args,\n target,\n name: null\n };\n if (typeof actionName[_references.INVOKE] === 'function') {\n (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n actionName[_references.INVOKE].apply(actionName, args);\n });\n return;\n }\n if (typeof actionName === 'function') {\n (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n actionName.apply(target, args);\n });\n return;\n }\n payload.name = actionName;\n if (target.send) {\n (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n target.send.apply(target, [actionName, ...args]);\n });\n } else {\n (0, _debug.assert)(`The action '${actionName}' did not exist on ${target}`, typeof target[actionName] === 'function');\n (0, _instrumentation.flaggedInstrument)('interaction.ember-action', payload, () => {\n target[actionName].apply(target, args);\n });\n }\n });\n return shouldBubble;\n }\n destroy() {\n ActionHelper.unregisterAction(this);\n }\n }\n exports.ActionState = ActionState;\n // implements ModifierManager\n class ActionModifierManager {\n create(element, _state, args, _dynamicScope, dom) {\n let { named, positional, tag } = args.capture();\n let implicitTarget;\n let actionName;\n let actionNameRef;\n if (positional.length > 1) {\n implicitTarget = positional.at(0);\n actionNameRef = positional.at(1);\n if (actionNameRef[_references.INVOKE]) {\n actionName = actionNameRef;\n } else {\n let actionLabel = actionNameRef._propertyKey;\n actionName = actionNameRef.value();\n (0, _debug.assert)('You specified a quoteless path, `' + actionLabel + '`, 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 \"' + actionLabel + '\"}}).', typeof actionName === 'string' || typeof actionName === 'function');\n }\n }\n let actionArgs = [];\n // The first two arguments are (1) `this` and (2) the action name.\n // Everything else is a param.\n for (let i = 2; i < positional.length; i++) {\n actionArgs.push(positional.at(i));\n }\n let actionId = (0, _utils.uuid)();\n return new ActionState(element, actionId, actionName, actionArgs, named, positional, implicitTarget, dom, tag);\n }\n install(actionState) {\n let { dom, element, actionId } = actionState;\n ActionHelper.registerAction(actionState);\n dom.setAttribute(element, 'data-ember-action', '');\n dom.setAttribute(element, `data-ember-action-${actionId}`, actionId);\n }\n update(actionState) {\n let { positional } = actionState;\n let actionNameRef = positional.at(1);\n if (!actionNameRef[_references.INVOKE]) {\n actionState.actionName = actionNameRef.value();\n }\n actionState.eventName = actionState.getEventName();\n }\n getTag(actionState) {\n return actionState.tag;\n }\n getDestructor(modifier) {\n return modifier;\n }\n }\n exports.default = ActionModifierManager;\n});","enifed('@ember/-internals/glimmer/lib/protocol-for-url', ['exports', 'node-module', '@ember/-internals/browser-environment'], function (exports, _nodeModule, _browserEnvironment) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = installProtocolForURL;\n\n let nodeURL; /* globals module, URL */\n\n let parsingNode;\n function installProtocolForURL(environment) {\n let protocol;\n if (_browserEnvironment.hasDOM) {\n protocol = browserProtocolForURL.call(environment, 'foobar:baz');\n }\n // Test to see if our DOM implementation parses\n // and normalizes URLs.\n if (protocol === 'foobar:') {\n // Swap in the method that doesn't do this test now that\n // we know it works.\n environment.protocolForURL = browserProtocolForURL;\n } else if (typeof URL === 'object') {\n // URL globally provided, likely from FastBoot's sandbox\n nodeURL = URL;\n environment.protocolForURL = nodeProtocolForURL;\n } else if (typeof _nodeModule.require === 'function') {\n // Otherwise, we need to fall back to our own URL parsing.\n // Global `require` is shadowed by Ember's loader so we have to use the fully\n // qualified `module.require`.\n // tslint:disable-next-line:no-require-imports\n nodeURL = (0, _nodeModule.require)('url');\n environment.protocolForURL = nodeProtocolForURL;\n } else {\n throw new Error('Could not find valid URL parsing mechanism for URL Sanitization');\n }\n }\n function browserProtocolForURL(url) {\n if (!parsingNode) {\n parsingNode = document.createElement('a');\n }\n parsingNode.href = url;\n return parsingNode.protocol;\n }\n function nodeProtocolForURL(url) {\n let protocol = null;\n if (typeof url === 'string') {\n protocol = nodeURL.parse(url).protocol;\n }\n return protocol === null ? ':' : protocol;\n }\n});","enifed('@ember/-internals/glimmer/lib/renderer', ['exports', '@ember/-internals/metal', '@ember/-internals/views', '@ember/debug', '@ember/runloop', '@glimmer/reference', '@glimmer/runtime', 'rsvp', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/component-managers/outlet', '@ember/-internals/glimmer/lib/component-managers/root', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _metal, _views, _debug, _runloop, _reference, _runtime, _rsvp, _component, _outlet, _root, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.InteractiveRenderer = exports.InertRenderer = exports.Renderer = exports.DynamicScope = undefined;\n exports._resetRenderers = _resetRenderers;\n exports.renderSettled = renderSettled;\n class DynamicScope {\n constructor(view, outletState) {\n this.view = view;\n this.outletState = outletState;\n }\n child() {\n return new DynamicScope(this.view, this.outletState);\n }\n get(key) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`Using \\`-get-dynamic-scope\\` is only supported for \\`outletState\\` (you used \\`${key}\\`).`, key === 'outletState');\n return this.outletState;\n }\n set(key, value) {\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`Using \\`-with-dynamic-scope\\` is only supported for \\`outletState\\` (you used \\`${key}\\`).`, key === 'outletState');\n this.outletState = value;\n return value;\n }\n }\n exports.DynamicScope = DynamicScope;\n class RootState {\n constructor(root, env, template, self, parentElement, dynamicScope, builder) {\n (0, _debug.assert)(`You cannot render \\`${self.value()}\\` without a template.`, template !== undefined);\n this.id = (0, _views.getViewId)(root);\n this.env = env;\n this.root = root;\n this.result = undefined;\n this.shouldReflush = false;\n this.destroyed = false;\n let options = this.options = {\n alwaysRevalidate: false\n };\n this.render = () => {\n let layout = template.asLayout();\n let handle = layout.compile();\n let iterator = (0, _runtime.renderMain)(layout['compiler'].program, env, self, dynamicScope, builder(env, { element: parentElement, nextSibling: null }), handle);\n let iteratorResult;\n do {\n iteratorResult = iterator.next();\n } while (!iteratorResult.done);\n let result = this.result = iteratorResult.value;\n // override .render function after initial render\n this.render = () => result.rerender(options);\n };\n }\n isFor(possibleRoot) {\n return this.root === possibleRoot;\n }\n destroy() {\n let { result, env } = this;\n this.destroyed = true;\n this.env = undefined;\n this.root = null;\n this.result = undefined;\n this.render = undefined;\n if (result) {\n /*\n Handles these scenarios:\n * When roots are removed during standard rendering process, a transaction exists already\n `.begin()` / `.commit()` are not needed.\n * When roots are being destroyed manually (`component.append(); component.destroy() case), no\n transaction exists already.\n * When roots are being destroyed during `Renderer#destroy`, no transaction exists\n */\n let needsTransaction = !env.inTransaction;\n if (needsTransaction) {\n env.begin();\n }\n try {\n result.destroy();\n } finally {\n if (needsTransaction) {\n env.commit();\n }\n }\n }\n }\n }\n const renderers = [];\n function _resetRenderers() {\n renderers.length = 0;\n }\n (0, _metal.setHasViews)(() => renderers.length > 0);\n function register(renderer) {\n (0, _debug.assert)('Cannot register the same renderer twice', renderers.indexOf(renderer) === -1);\n renderers.push(renderer);\n }\n function deregister(renderer) {\n let index = renderers.indexOf(renderer);\n (0, _debug.assert)('Cannot deregister unknown unregistered renderer', index !== -1);\n renderers.splice(index, 1);\n }\n function loopBegin() {\n for (let i = 0; i < renderers.length; i++) {\n renderers[i]._scheduleRevalidate();\n }\n }\n function K() {\n /* noop */\n }\n let renderSettledDeferred = null;\n /*\n Returns a promise which will resolve when rendering has settled. Settled in\n this context is defined as when all of the tags in use are \"current\" (e.g.\n `renderers.every(r => r._isValid())`). When this is checked at the _end_ of\n the run loop, this essentially guarantees that all rendering is completed.\n \n @method renderSettled\n @returns {Promise} a promise which fulfills when rendering has settled\n */\n function renderSettled() {\n if (renderSettledDeferred === null) {\n renderSettledDeferred = _rsvp.default.defer();\n // if there is no current runloop, the promise created above will not have\n // a chance to resolve (because its resolved in backburner's \"end\" event)\n if (!(0, _runloop.getCurrentRunLoop)()) {\n // ensure a runloop has been kicked off\n _runloop.backburner.schedule('actions', null, K);\n }\n }\n return renderSettledDeferred.promise;\n }\n function resolveRenderPromise() {\n if (renderSettledDeferred !== null) {\n let resolve = renderSettledDeferred.resolve;\n renderSettledDeferred = null;\n _runloop.backburner.join(null, resolve);\n }\n }\n let loops = 0;\n function loopEnd() {\n for (let i = 0; i < renderers.length; i++) {\n if (!renderers[i]._isValid()) {\n if (loops > 10) {\n loops = 0;\n // TODO: do something better\n renderers[i].destroy();\n throw new Error('infinite rendering invalidation detected');\n }\n loops++;\n return _runloop.backburner.join(null, K);\n }\n }\n loops = 0;\n resolveRenderPromise();\n }\n _runloop.backburner.on('begin', loopBegin);\n _runloop.backburner.on('end', loopEnd);\n class Renderer {\n constructor(env, rootTemplate, _viewRegistry = _views.fallbackViewRegistry, destinedForDOM = false, builder = _runtime.clientBuilder) {\n this._env = env;\n this._rootTemplate = rootTemplate;\n this._viewRegistry = _viewRegistry;\n this._destinedForDOM = destinedForDOM;\n this._destroyed = false;\n this._roots = [];\n this._lastRevision = -1;\n this._isRenderingRoots = false;\n this._removedRoots = [];\n this._builder = builder;\n }\n // renderer HOOKS\n appendOutletView(view, target) {\n let definition = (0, _outlet.createRootOutlet)(view);\n this._appendDefinition(view, (0, _runtime.curry)(definition), target);\n }\n appendTo(view, target) {\n let definition = new _root.RootComponentDefinition(view);\n this._appendDefinition(view, (0, _runtime.curry)(definition), target);\n }\n _appendDefinition(root, definition, target) {\n let self = new _references.UnboundReference(definition);\n let dynamicScope = new DynamicScope(null, _runtime.UNDEFINED_REFERENCE);\n let rootState = new RootState(root, this._env, this._rootTemplate, self, target, dynamicScope, this._builder);\n this._renderRoot(rootState);\n }\n rerender() {\n this._scheduleRevalidate();\n }\n register(view) {\n let id = (0, _views.getViewId)(view);\n (0, _debug.assert)('Attempted to register a view with an id already in use: ' + id, !this._viewRegistry[id]);\n this._viewRegistry[id] = view;\n }\n unregister(view) {\n delete this._viewRegistry[(0, _views.getViewId)(view)];\n }\n remove(view) {\n view._transitionTo('destroying');\n this.cleanupRootFor(view);\n (0, _views.setViewElement)(view, null);\n if (this._destinedForDOM) {\n view.trigger('didDestroyElement');\n }\n if (!view.isDestroying) {\n view.destroy();\n }\n }\n cleanupRootFor(view) {\n // no need to cleanup roots if we have already been destroyed\n if (this._destroyed) {\n return;\n }\n let roots = this._roots;\n // traverse in reverse so we can remove items\n // without mucking up the index\n let i = this._roots.length;\n while (i--) {\n let root = roots[i];\n if (root.isFor(view)) {\n root.destroy();\n roots.splice(i, 1);\n }\n }\n }\n destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._clearAllRoots();\n }\n getBounds(view) {\n let bounds = view[_component.BOUNDS];\n let parentElement = bounds.parentElement();\n let firstNode = bounds.firstNode();\n let lastNode = bounds.lastNode();\n return { parentElement, firstNode, lastNode };\n }\n createElement(tagName) {\n return this._env.getAppendOperations().createElement(tagName);\n }\n _renderRoot(root) {\n let { _roots: roots } = this;\n roots.push(root);\n if (roots.length === 1) {\n register(this);\n }\n this._renderRootsTransaction();\n }\n _renderRoots() {\n let { _roots: roots, _env: env, _removedRoots: removedRoots } = this;\n let globalShouldReflush;\n let initialRootsLength;\n do {\n env.begin();\n try {\n // ensure that for the first iteration of the loop\n // each root is processed\n initialRootsLength = roots.length;\n globalShouldReflush = false;\n for (let i = 0; i < roots.length; i++) {\n let root = roots[i];\n if (root.destroyed) {\n // add to the list of roots to be removed\n // they will be removed from `this._roots` later\n removedRoots.push(root);\n // skip over roots that have been marked as destroyed\n continue;\n }\n let { shouldReflush } = root;\n // when processing non-initial reflush loops,\n // do not process more roots than needed\n if (i >= initialRootsLength && !shouldReflush) {\n continue;\n }\n root.options.alwaysRevalidate = shouldReflush;\n // track shouldReflush based on this roots render result\n shouldReflush = root.shouldReflush = (0, _metal.runInTransaction)(root, 'render');\n // globalShouldReflush should be `true` if *any* of\n // the roots need to reflush\n globalShouldReflush = globalShouldReflush || shouldReflush;\n }\n this._lastRevision = _reference.CURRENT_TAG.value();\n } finally {\n env.commit();\n }\n } while (globalShouldReflush || roots.length > initialRootsLength);\n // remove any roots that were destroyed during this transaction\n while (removedRoots.length) {\n let root = removedRoots.pop();\n let rootIndex = roots.indexOf(root);\n roots.splice(rootIndex, 1);\n }\n if (this._roots.length === 0) {\n deregister(this);\n }\n }\n _renderRootsTransaction() {\n if (this._isRenderingRoots) {\n // currently rendering roots, a new root was added and will\n // be processed by the existing _renderRoots invocation\n return;\n }\n // used to prevent calling _renderRoots again (see above)\n // while we are actively rendering roots\n this._isRenderingRoots = true;\n let completedWithoutError = false;\n try {\n this._renderRoots();\n completedWithoutError = true;\n } finally {\n if (!completedWithoutError) {\n this._lastRevision = _reference.CURRENT_TAG.value();\n if (this._env.inTransaction === true) {\n this._env.commit();\n }\n }\n this._isRenderingRoots = false;\n }\n }\n _clearAllRoots() {\n let roots = this._roots;\n for (let i = 0; i < roots.length; i++) {\n let root = roots[i];\n root.destroy();\n }\n this._removedRoots.length = 0;\n this._roots = [];\n // if roots were present before destroying\n // deregister this renderer instance\n if (roots.length) {\n deregister(this);\n }\n }\n _scheduleRevalidate() {\n _runloop.backburner.scheduleOnce('render', this, this._revalidate);\n }\n _isValid() {\n return this._destroyed || this._roots.length === 0 || _reference.CURRENT_TAG.validate(this._lastRevision);\n }\n _revalidate() {\n if (this._isValid()) {\n return;\n }\n this._renderRootsTransaction();\n }\n }\n exports.Renderer = Renderer;\n class InertRenderer extends Renderer {\n static create({ env, rootTemplate, _viewRegistry, builder }) {\n return new this(env, rootTemplate, _viewRegistry, false, builder);\n }\n getElement(_view) {\n throw new Error('Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).');\n }\n }\n exports.InertRenderer = InertRenderer;\n class InteractiveRenderer extends Renderer {\n static create({ env, rootTemplate, _viewRegistry, builder }) {\n return new this(env, rootTemplate, _viewRegistry, true, builder);\n }\n getElement(view) {\n return (0, _views.getViewElement)(view);\n }\n }\n exports.InteractiveRenderer = InteractiveRenderer;\n});","enifed('@ember/-internals/glimmer/lib/resolver', ['exports', '@ember/-internals/container', '@ember/-internals/environment', '@ember/-internals/owner', '@ember/-internals/views', '@ember/canary-features', '@ember/debug', '@ember/instrumentation', '@glimmer/opcode-compiler', '@glimmer/runtime', '@ember/-internals/glimmer/lib/compile-time-lookup', '@ember/-internals/glimmer/lib/component-managers/curly', '@ember/-internals/glimmer/lib/component-managers/custom', '@ember/-internals/glimmer/lib/component-managers/template-only', '@ember/-internals/glimmer/lib/helper', '@ember/-internals/glimmer/lib/helpers/-assert-implicit-component-helper-argument', '@ember/-internals/glimmer/lib/helpers/-class', '@ember/-internals/glimmer/lib/helpers/-html-safe', '@ember/-internals/glimmer/lib/helpers/-input-type', '@ember/-internals/glimmer/lib/helpers/-normalize-class', '@ember/-internals/glimmer/lib/helpers/action', '@ember/-internals/glimmer/lib/helpers/concat', '@ember/-internals/glimmer/lib/helpers/each-in', '@ember/-internals/glimmer/lib/helpers/get', '@ember/-internals/glimmer/lib/helpers/hash', '@ember/-internals/glimmer/lib/helpers/if-unless', '@ember/-internals/glimmer/lib/helpers/log', '@ember/-internals/glimmer/lib/helpers/mut', '@ember/-internals/glimmer/lib/helpers/query-param', '@ember/-internals/glimmer/lib/helpers/readonly', '@ember/-internals/glimmer/lib/helpers/unbound', '@ember/-internals/glimmer/lib/modifiers/action', '@ember/-internals/glimmer/lib/syntax', '@ember/-internals/glimmer/lib/syntax/mount', '@ember/-internals/glimmer/lib/syntax/outlet', '@ember/-internals/glimmer/lib/utils/custom-component-manager', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _container, _environment, _owner, _views, _canaryFeatures, _debug, _instrumentation, _opcodeCompiler, _runtime, _compileTimeLookup, _curly, _custom, _templateOnly, _helper, _assertImplicitComponentHelperArgument, _class, _htmlSafe, _inputType, _normalizeClass, _action, _concat, _eachIn, _get, _hash, _ifUnless, _log, _mut, _queryParam, _readonly, _unbound, _action2, _syntax, _mount, _outlet, _customComponentManager, _references) {\n 'use strict';\n\n exports.__esModule = true;\n\n function instrumentationPayload(name) {\n return { object: `component:${name}` };\n }\n function makeOptions(moduleName, namespace) {\n return {\n source: moduleName !== undefined ? `template:${moduleName}` : undefined,\n namespace\n };\n }\n const BUILTINS_HELPERS = {\n if: _ifUnless.inlineIf,\n action: _action.default,\n concat: _concat.default,\n get: _get.default,\n hash: _hash.default,\n log: _log.default,\n mut: _mut.default,\n 'query-params': _queryParam.default,\n readonly: _readonly.default,\n unbound: _unbound.default,\n unless: _ifUnless.inlineUnless,\n '-class': _class.default,\n '-each-in': _eachIn.default,\n '-input-type': _inputType.default,\n '-normalize-class': _normalizeClass.default,\n '-html-safe': _htmlSafe.default,\n '-get-dynamic-var': _runtime.getDynamicVar,\n '-mount': _mount.mountHelper,\n '-outlet': _outlet.outletHelper,\n '-assert-implicit-component-helper-argument': _assertImplicitComponentHelperArgument.default\n };\n const BUILTIN_MODIFIERS = {\n action: { manager: new _action2.default(), state: null }\n };\n class RuntimeResolver {\n constructor() {\n this.handles = [undefined];\n this.objToHandle = new WeakMap();\n this.builtInHelpers = BUILTINS_HELPERS;\n this.builtInModifiers = BUILTIN_MODIFIERS;\n // supports directly imported late bound layouts on component.prototype.layout\n this.templateCache = new Map();\n this.componentDefinitionCache = new Map();\n this.customManagerCache = new Map();\n this.templateCacheHits = 0;\n this.templateCacheMisses = 0;\n this.componentDefinitionCount = 0;\n this.helperDefinitionCount = 0;\n let macros = new _opcodeCompiler.Macros();\n (0, _syntax.populateMacros)(macros);\n this.compiler = new _opcodeCompiler.LazyCompiler(new _compileTimeLookup.default(this), this, macros);\n }\n /*** IRuntimeResolver ***/\n /**\n * public componentDefHandleCount = 0;\n * Called while executing Append Op.PushDynamicComponentManager if string\n */\n lookupComponentDefinition(name, meta) {\n (0, _debug.assert)('You cannot use `textarea` as a component name.', name !== 'textarea');\n (0, _debug.assert)('You cannot use `input` as a component name.', name !== 'input');\n let handle = this.lookupComponentHandle(name, meta);\n if (handle === null) {\n (0, _debug.assert)(`Could not find component named \"${name}\" (no component or template with that name was found)`);\n return null;\n }\n return this.resolve(handle);\n }\n lookupComponentHandle(name, meta) {\n let nextHandle = this.handles.length;\n let handle = this.handle(this._lookupComponentDefinition(name, meta));\n if (nextHandle === handle) {\n this.componentDefinitionCount++;\n }\n return handle;\n }\n /**\n * Called by RuntimeConstants to lookup unresolved handles.\n */\n resolve(handle) {\n return this.handles[handle];\n }\n // End IRuntimeResolver\n /**\n * Called by CompileTimeLookup compiling Unknown or Helper OpCode\n */\n lookupHelper(name, meta) {\n let nextHandle = this.handles.length;\n let helper = this._lookupHelper(name, meta);\n if (helper !== null) {\n let handle = this.handle(helper);\n if (nextHandle === handle) {\n this.helperDefinitionCount++;\n }\n return handle;\n }\n return null;\n }\n /**\n * Called by CompileTimeLookup compiling the\n */\n lookupModifier(name, _meta) {\n return this.handle(this._lookupModifier(name));\n }\n /**\n * Called by CompileTimeLookup to lookup partial\n */\n lookupPartial(name, meta) {\n let partial = this._lookupPartial(name, meta);\n return this.handle(partial);\n }\n // end CompileTimeLookup\n /**\n * Creates a template with injections from a directly imported template factory.\n * @param templateFactory the directly imported template factory.\n * @param owner the owner the template instance would belong to if resolved\n */\n createTemplate(factory, owner) {\n let cache = this.templateCache.get(owner);\n if (cache === undefined) {\n cache = new Map();\n this.templateCache.set(owner, cache);\n }\n let template = cache.get(factory);\n if (template === undefined) {\n const { compiler } = this;\n const injections = { compiler };\n (0, _owner.setOwner)(injections, owner);\n template = factory.create(injections);\n cache.set(factory, template);\n this.templateCacheMisses++;\n } else {\n this.templateCacheHits++;\n }\n return template;\n }\n // needed for lazy compile time lookup\n handle(obj) {\n if (obj === undefined || obj === null) {\n return null;\n }\n let handle = this.objToHandle.get(obj);\n if (handle === undefined) {\n handle = this.handles.push(obj) - 1;\n this.objToHandle.set(obj, handle);\n }\n return handle;\n }\n _lookupHelper(_name, meta) {\n const helper = this.builtInHelpers[_name];\n if (helper !== undefined) {\n return helper;\n }\n const { owner, moduleName } = meta;\n let name = _name;\n let namespace = undefined;\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n const parsed = this._parseNameForNamespace(_name);\n name = parsed.name;\n namespace = parsed.namespace;\n }\n const options = makeOptions(moduleName, namespace);\n const factory = owner.factoryFor(`helper:${name}`, options) || owner.factoryFor(`helper:${name}`);\n if (!(0, _helper.isHelperFactory)(factory)) {\n return null;\n }\n return (vm, args) => {\n const helper = factory.create();\n if ((0, _helper.isSimpleHelper)(helper)) {\n return new _references.SimpleHelperReference(helper.compute, args.capture());\n }\n vm.newDestroyable(helper);\n return _references.ClassBasedHelperReference.create(helper, args.capture());\n };\n }\n _lookupPartial(name, meta) {\n const template = (0, _views.lookupPartial)(name, meta.owner);\n if (template) {\n return new _opcodeCompiler.PartialDefinition(name, template);\n } else {\n throw new Error(`${name} is not a partial`);\n }\n }\n _lookupModifier(name) {\n return this.builtInModifiers[name];\n }\n _parseNameForNamespace(_name) {\n let name = _name;\n let namespace = undefined;\n let namespaceDelimiterOffset = _name.indexOf('::');\n if (namespaceDelimiterOffset !== -1) {\n name = _name.slice(namespaceDelimiterOffset + 2);\n namespace = _name.slice(0, namespaceDelimiterOffset);\n }\n return { name, namespace };\n }\n _lookupComponentDefinition(_name, meta) {\n let name = _name;\n let namespace = undefined;\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n const parsed = this._parseNameForNamespace(_name);\n name = parsed.name;\n namespace = parsed.namespace;\n }\n let { layout, component } = (0, _views.lookupComponent)(meta.owner, name, makeOptions(meta.moduleName, namespace));\n let key = component === undefined ? layout : component;\n if (key === undefined) {\n return null;\n }\n let cachedComponentDefinition = this.componentDefinitionCache.get(key);\n if (cachedComponentDefinition !== undefined) {\n return cachedComponentDefinition;\n }\n let finalizer = (0, _instrumentation._instrumentStart)('render.getComponentDefinition', instrumentationPayload, name);\n if (layout && !component && _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n let definition = new _templateOnly.TemplateOnlyComponentDefinition(layout);\n finalizer();\n this.componentDefinitionCache.set(key, definition);\n return definition;\n }\n if (_canaryFeatures.GLIMMER_CUSTOM_COMPONENT_MANAGER && component && component.class) {\n let managerId = (0, _customComponentManager.getComponentManager)(component.class);\n if (managerId) {\n let manager = this._lookupComponentManager(meta.owner, managerId);\n (0, _debug.assert)(`Could not find custom component manager '${managerId}' which was specified by ${component.class}`, !!manager);\n let definition = new _custom.CustomManagerDefinition(name, component, manager, layout || meta.owner.lookup(_container.privatize`template:components/-default`));\n finalizer();\n this.componentDefinitionCache.set(key, definition);\n return definition;\n }\n }\n let definition = layout || component ? new _curly.CurlyComponentDefinition(name, component || meta.owner.factoryFor(_container.privatize`component:-default`), null, layout // TODO fix type\n ) : null;\n finalizer();\n this.componentDefinitionCache.set(key, definition);\n return definition;\n }\n _lookupComponentManager(owner, managerId) {\n if (this.customManagerCache.has(managerId)) {\n return this.customManagerCache.get(managerId);\n }\n let delegate = owner.lookup(`component-manager:${managerId}`);\n this.customManagerCache.set(managerId, delegate);\n return delegate;\n }\n }\n exports.default = RuntimeResolver;\n});","enifed('@ember/-internals/glimmer/lib/setup-registry', ['exports', '@ember/-internals/browser-environment', '@ember/-internals/container', '@ember/-internals/environment', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/components/checkbox', '@ember/-internals/glimmer/lib/components/link-to', '@ember/-internals/glimmer/lib/components/text_area', '@ember/-internals/glimmer/lib/components/text_field', '@ember/-internals/glimmer/lib/dom', '@ember/-internals/glimmer/lib/environment', '@ember/-internals/glimmer/lib/helpers/loc', '@ember/-internals/glimmer/lib/renderer', '@ember/-internals/glimmer/lib/template-compiler', '@ember/-internals/glimmer/lib/templates/component', '@ember/-internals/glimmer/lib/templates/outlet', '@ember/-internals/glimmer/lib/templates/root', '@ember/-internals/glimmer/lib/views/outlet'], function (exports, _browserEnvironment, _container, _environment, _component, _checkbox, _linkTo, _text_area, _text_field, _dom, _environment2, _loc, _renderer, _templateCompiler, _component2, _outlet, _root, _outlet2) {\n 'use strict';\n\n exports.__esModule = true;\n exports.setupApplicationRegistry = setupApplicationRegistry;\n exports.setupEngineRegistry = setupEngineRegistry;\n function setupApplicationRegistry(registry) {\n registry.injection('service:-glimmer-environment', 'appendOperations', 'service:-dom-tree-construction');\n registry.injection('renderer', 'env', 'service:-glimmer-environment');\n // because we are using injections we can't use instantiate false\n // we need to use bind() to copy the function so factory for\n // association won't leak\n registry.register('service:-dom-builder', {\n create({ bootOptions }) {\n let { _renderMode } = bootOptions;\n switch (_renderMode) {\n case 'serialize':\n return _dom.serializeBuilder.bind(null);\n case 'rehydrate':\n return _dom.rehydrationBuilder.bind(null);\n default:\n return _dom.clientBuilder.bind(null);\n }\n }\n });\n registry.injection('service:-dom-builder', 'bootOptions', '-environment:main');\n registry.injection('renderer', 'builder', 'service:-dom-builder');\n registry.register(_container.privatize`template:-root`, _root.default);\n registry.injection('renderer', 'rootTemplate', _container.privatize`template:-root`);\n registry.register('renderer:-dom', _renderer.InteractiveRenderer);\n registry.register('renderer:-inert', _renderer.InertRenderer);\n if (_browserEnvironment.hasDOM) {\n registry.injection('service:-glimmer-environment', 'updateOperations', 'service:-dom-changes');\n }\n registry.register('service:-dom-changes', {\n create({ document }) {\n return new _dom.DOMChanges(document);\n }\n });\n registry.register('service:-dom-tree-construction', {\n create({ document }) {\n let Implementation = _browserEnvironment.hasDOM ? _dom.DOMTreeConstruction : _dom.NodeDOMTreeConstruction;\n return new Implementation(document);\n }\n });\n }\n function setupEngineRegistry(registry) {\n registry.register('view:-outlet', _outlet2.default);\n registry.register('template:-outlet', _outlet.default);\n registry.injection('view:-outlet', 'template', 'template:-outlet');\n registry.injection('service:-dom-changes', 'document', 'service:-document');\n registry.injection('service:-dom-tree-construction', 'document', 'service:-document');\n registry.register(_container.privatize`template:components/-default`, _component2.default);\n registry.register('service:-glimmer-environment', _environment2.default);\n registry.register(_container.privatize`template-compiler:main`, _templateCompiler.default);\n registry.injection('template', 'compiler', _container.privatize`template-compiler:main`);\n registry.optionsForType('helper', { instantiate: false });\n registry.register('helper:loc', _loc.default);\n registry.register('component:-text-field', _text_field.default);\n registry.register('component:-text-area', _text_area.default);\n registry.register('component:-checkbox', _checkbox.default);\n registry.register('component:link-to', _linkTo.default);\n if (!_environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n registry.register(_container.privatize`component:-default`, _component.default);\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/syntax', ['exports', '@ember/canary-features', '@ember/debug', '@ember/-internals/glimmer/lib/syntax/-text-area', '@ember/-internals/glimmer/lib/syntax/input', '@ember/-internals/glimmer/lib/syntax/let', '@ember/-internals/glimmer/lib/syntax/mount', '@ember/-internals/glimmer/lib/syntax/outlet', '@ember/-internals/glimmer/lib/syntax/utils', '@ember/-internals/glimmer/lib/utils/bindings'], function (exports, _canaryFeatures, _debug, _textArea, _input, _let, _mount, _outlet, _utils, _bindings) {\n 'use strict';\n\n exports.__esModule = true;\n exports.experimentalMacros = undefined;\n exports.registerMacros = registerMacros;\n exports.populateMacros = populateMacros;\n\n function refineInlineSyntax(name, params, hash, builder) {\n (0, _debug.assert)(`You attempted to overwrite the built-in helper \"${name}\" which is not allowed. Please rename the helper.`, !(builder.compiler['resolver']['resolver']['builtInHelpers'][name] && builder.referrer.owner.hasRegistration(`helper:${name}`)));\n if (name.indexOf('-') === -1) {\n return false;\n }\n let handle = builder.compiler['resolver'].lookupComponentDefinition(name, builder.referrer);\n if (handle !== null) {\n builder.component.static(handle, [params === null ? [] : params, (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n return false;\n }\n function refineBlockSyntax(name, params, hash, template, inverse, builder) {\n if (name.indexOf('-') === -1) {\n return false;\n }\n let handle = builder.compiler['resolver'].lookupComponentDefinition(name, builder.referrer);\n if (handle !== null) {\n (0, _bindings.wrapComponentClassAttribute)(hash);\n builder.component.static(handle, [params, (0, _utils.hashToArgs)(hash), template, inverse]);\n return true;\n }\n (0, _debug.assert)(`A component or helper named \"${name}\" could not be found`, builder.referrer.owner.hasRegistration(`helper:${name}`));\n (0, _debug.assert)(`Helpers may not be used in the block form, for example {{#${name}}}{{/${name}}}. Please use a component, or alternatively use the helper in combination with a built-in Ember helper, for example {{#if (${name})}}{{/if}}.`, !(() => {\n const resolver = builder.compiler['resolver']['resolver'];\n const { owner, moduleName } = builder.referrer;\n if (name === 'component' || resolver['builtInHelpers'][name]) {\n return true;\n }\n let options = { source: `template:${moduleName}` };\n return owner.hasRegistration(`helper:${name}`, options) || owner.hasRegistration(`helper:${name}`);\n })());\n return false;\n }\n const experimentalMacros = exports.experimentalMacros = [];\n // This is a private API to allow for experimental macros\n // to be created in user space. Registering a macro should\n // should be done in an initializer.\n function registerMacros(macro) {\n experimentalMacros.push(macro);\n }\n function populateMacros(macros) {\n let { inlines, blocks } = macros;\n inlines.add('outlet', _outlet.outletMacro);\n inlines.add('mount', _mount.mountMacro);\n inlines.add('input', _input.inputMacro);\n inlines.add('textarea', _textArea.textAreaMacro);\n inlines.addMissing(refineInlineSyntax);\n if (_canaryFeatures.EMBER_TEMPLATE_BLOCK_LET_HELPER === true) {\n blocks.add('let', _let.blockLetMacro);\n }\n blocks.addMissing(refineBlockSyntax);\n for (let i = 0; i < experimentalMacros.length; i++) {\n let macro = experimentalMacros[i];\n macro(blocks, inlines);\n }\n return { blocks, inlines };\n }\n});","enifed('@ember/-internals/glimmer/lib/syntax/-text-area', ['exports', '@ember/-internals/glimmer/lib/utils/bindings', '@ember/-internals/glimmer/lib/syntax/utils'], function (exports, _bindings, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.textAreaMacro = textAreaMacro;\n function textAreaMacro(_name, params, hash, builder) {\n let definition = builder.compiler['resolver'].lookupComponentDefinition('-text-area', builder.referrer);\n (0, _bindings.wrapComponentClassAttribute)(hash);\n builder.component.static(definition, [params || [], (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n});","enifed('@ember/-internals/glimmer/lib/syntax/input', ['exports', '@ember/debug', '@ember/-internals/glimmer/lib/utils/bindings', '@ember/-internals/glimmer/lib/syntax/utils'], function (exports, _debug, _bindings, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.inputMacro = inputMacro;\n\n function buildSyntax(type, params, hash, builder) {\n let definition = builder.compiler['resolver'].lookupComponentDefinition(type, builder.referrer);\n builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n /**\n The `{{input}}` helper lets you create an HTML `` component.\n It causes an `TextField` component to be rendered. For more info,\n see the [TextField](/api/ember/release/classes/TextField) docs and\n the [templates guide](https://guides.emberjs.com/release/templates/input-helpers/).\n \n ```handlebars\n {{input value=\"987\"}}\n ```\n \n renders as:\n \n ```HTML\n \n ```\n \n ### Text field\n \n If no `type` option is specified, a default of type 'text' is used.\n Many of the standard HTML attributes may be passed to this helper.\n \n \n \n \n \n \n \n \n \n \n \n
    `readonly``required``autofocus`
    `value``placeholder``disabled`
    `size``tabindex``maxlength`
    `name``min``max`
    `pattern``accept``autocomplete`
    `autosave``formaction``formenctype`
    `formmethod``formnovalidate``formtarget`
    `height``inputmode``multiple`
    `step``width``form`
    `selectionDirection``spellcheck` 
    \n When set to a quoted string, these values will be directly applied to the HTML\n element. When left unquoted, these values will be bound to a property on the\n template's current rendering context (most typically a controller instance).\n A very common use of this helper is to bind the `value` of an input to an Object's attribute:\n \n ```handlebars\n Search:\n {{input value=searchWord}}\n ```\n \n In this example, the initial value in the `` will be set to the value of `searchWord`.\n If the user changes the text, the value of `searchWord` will also be updated.\n \n ### Actions\n \n The helper can send multiple actions based on user events.\n The action property defines the action which is sent when\n the user presses the return key.\n \n ```handlebars\n {{input action=\"submit\"}}\n ```\n \n The helper allows some user events to send actions.\n \n * `enter`\n * `insert-newline`\n * `escape-press`\n * `focus-in`\n * `focus-out`\n * `key-press`\n * `key-up`\n \n For example, if you desire an action to be sent when the input is blurred,\n you only need to setup the action name to the event name property.\n \n ```handlebars\n {{input focus-out=\"alertMessage\"}}\n ```\n See more about [Text Support Actions](/api/ember/release/classes/TextField)\n \n ### Extending `TextField`\n \n Internally, `{{input type=\"text\"}}` creates an instance of `TextField`, passing\n arguments from the helper to `TextField`'s `create` method. You can extend the\n capabilities of text inputs in your applications by reopening this class. For example,\n if you are building a Bootstrap project where `data-*` attributes are used, you\n can add one to the `TextField`'s `attributeBindings` property:\n \n ```javascript\n import TextField from '@ember/component/text-field';\n TextField.reopen({\n attributeBindings: ['data-error']\n });\n ```\n \n Keep in mind when writing `TextField` subclasses that `TextField`\n itself extends `Component`. Expect isolated component semantics, not\n legacy 1.x view semantics (like `controller` being present).\n See more about [Ember components](/api/ember/release/classes/Component)\n \n ### Checkbox\n \n Checkboxes are special forms of the `{{input}}` helper. To create a ``:\n \n ```handlebars\n Emberize Everything:\n {{input type=\"checkbox\" name=\"isEmberized\" checked=isEmberized}}\n ```\n \n This will bind checked state of this checkbox to the value of `isEmberized` -- if either one changes,\n it will be reflected in the other.\n \n The following HTML attributes can be set via the helper:\n \n * `checked`\n * `disabled`\n * `tabindex`\n * `indeterminate`\n * `name`\n * `autofocus`\n * `form`\n \n ### Extending `Checkbox`\n \n Internally, `{{input type=\"checkbox\"}}` creates an instance of `Checkbox`, passing\n arguments from the helper to `Checkbox`'s `create` method. You can extend the\n capablilties of checkbox inputs in your applications by reopening this class. For example,\n if you wanted to add a css class to all checkboxes in your application:\n \n ```javascript\n import Checkbox from '@ember/component/checkbox';\n \n Checkbox.reopen({\n classNames: ['my-app-checkbox']\n });\n ```\n \n @method input\n @for Ember.Templates.helpers\n @param {Hash} options\n @public\n */\n function inputMacro(_name, params, hash, builder) {\n if (params === null) {\n params = [];\n }\n if (hash !== null) {\n let keys = hash[0];\n let values = hash[1];\n let typeIndex = keys.indexOf('type');\n if (typeIndex > -1) {\n let typeArg = values[typeIndex];\n if (Array.isArray(typeArg)) {\n // there is an AST plugin that converts this to an expression\n // it really should just compile in the component call too.\n let inputTypeExpr = params[0];\n builder.dynamicComponent(inputTypeExpr, null, params.slice(1), hash, true, null, null);\n return true;\n }\n if (typeArg === 'checkbox') {\n (0, _debug.assert)(\"{{input type='checkbox'}} does not support setting `value=someBooleanValue`; \" + 'you must use `checked=someBooleanValue` instead.', keys.indexOf('value') === -1);\n (0, _bindings.wrapComponentClassAttribute)(hash);\n return buildSyntax('-checkbox', params, hash, builder);\n }\n }\n }\n return buildSyntax('-text-field', params, hash, builder);\n }\n});","enifed(\"@ember/-internals/glimmer/lib/syntax/let\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.blockLetMacro = blockLetMacro;\n /**\n @module ember\n */\n /**\n The `let` helper receives one or more positional arguments and yields\n them out as block params.\n \n This allows the developer to introduce shorter names for certain computations\n in the template.\n \n This is especially useful if you are passing properties to a component\n that receives a lot of options and you want to clean up the invocation.\n \n For the following example, the template receives a `post` object with\n `content` and `title` properties.\n \n We are going to call the `my-post` component, passing a title which is\n the title of the post suffixed with the name of the blog, the content\n of the post, and a series of options defined in-place.\n \n ```handlebars\n {{#let\n (concat post.title ' | The Ember.js Blog')\n post.content\n (hash\n theme=\"high-contrast\"\n enableComments=true\n )\n as |title content options|\n }}\n {{my-post title=title content=content options=options}}\n {{/let}}\n ```\n \n @method let\n @for Ember.Templates.helpers\n @public\n */\n function blockLetMacro(params, _hash, template, _inverse, builder) {\n if (template !== null) {\n if (params !== null) {\n builder.compileParams(params);\n builder.invokeStaticBlock(template, params.length);\n } else {\n builder.invokeStatic(template);\n }\n }\n return true;\n }\n});","enifed('@ember/-internals/glimmer/lib/syntax/mount', ['exports', '@ember/canary-features', '@ember/debug', '@glimmer/runtime', '@glimmer/wire-format', '@ember/-internals/glimmer/lib/component-managers/mount'], function (exports, _canaryFeatures, _debug, _runtime, _wireFormat, _mount) {\n 'use strict';\n\n exports.__esModule = true;\n exports.mountHelper = mountHelper;\n exports.mountMacro = mountMacro;\n function mountHelper(vm, args) {\n let env = vm.env;\n let nameRef = args.positional.at(0);\n let modelRef = args.named.has('model') ? args.named.get('model') : undefined;\n return new DynamicEngineReference(nameRef, env, modelRef);\n }\n /**\n The `{{mount}}` helper lets you embed a routeless engine in a template.\n Mounting an engine will cause an instance to be booted and its `application`\n template to be rendered.\n \n For example, the following template mounts the `ember-chat` engine:\n \n ```handlebars\n {{! application.hbs }}\n {{mount \"ember-chat\"}}\n ```\n \n Additionally, you can also pass in a `model` argument that will be\n set as the engines model. This can be an existing object:\n \n ```\n
    \n {{mount 'admin' model=userSettings}}\n
    \n ```\n \n Or an inline `hash`, and you can even pass components:\n \n ```\n
    \n

    Application template!

    \n {{mount 'admin' model=(hash\n title='Secret Admin'\n signInButton=(component 'sign-in-button')\n )}}\n
    \n ```\n \n @method mount\n @param {String} name Name of the engine to mount.\n @param {Object} [model] Object that will be set as\n the model of the engine.\n @for Ember.Templates.helpers\n @category ember-application-engines\n @public\n */\n function mountMacro(_name, params, hash, builder) {\n if (_canaryFeatures.EMBER_ENGINES_MOUNT_PARAMS) {\n (0, _debug.assert)('You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}.', params.length === 1);\n } else {\n (0, _debug.assert)('You can only pass a single argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}.', params.length === 1 && hash === null);\n }\n let expr = [_wireFormat.Ops.Helper, '-mount', params || [], hash];\n builder.dynamicComponent(expr, null, [], null, false, null, null);\n return true;\n }\n class DynamicEngineReference {\n constructor(nameRef, env, modelRef) {\n this.tag = nameRef.tag;\n this.nameRef = nameRef;\n this.modelRef = modelRef;\n this.env = env;\n this._lastName = null;\n this._lastDef = null;\n }\n value() {\n let { env, nameRef, modelRef } = this;\n let name = nameRef.value();\n if (typeof name === 'string') {\n if (this._lastName === name) {\n return this._lastDef;\n }\n (0, _debug.assert)(`You used \\`{{mount '${name}'}}\\`, but the engine '${name}' can not be found.`, env.owner.hasRegistration(`engine:${name}`));\n if (!env.owner.hasRegistration(`engine:${name}`)) {\n return null;\n }\n this._lastName = name;\n this._lastDef = (0, _runtime.curry)(new _mount.MountDefinition(name, modelRef));\n return this._lastDef;\n } else {\n (0, _debug.assert)(`Invalid engine name '${name}' specified, engine name must be either a string, null or undefined.`, name === null || name === undefined);\n this._lastDef = null;\n this._lastName = null;\n return null;\n }\n }\n get() {\n return _runtime.UNDEFINED_REFERENCE;\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/syntax/outlet', ['exports', '@glimmer/reference', '@glimmer/runtime', '@glimmer/wire-format', '@ember/-internals/glimmer/lib/component-managers/outlet', '@ember/-internals/glimmer/lib/utils/outlet'], function (exports, _reference, _runtime, _wireFormat, _outlet, _outlet2) {\n 'use strict';\n\n exports.__esModule = true;\n exports.outletHelper = outletHelper;\n exports.outletMacro = outletMacro;\n\n /**\n The `{{outlet}}` helper lets you specify where a child route will render in\n your template. An important use of the `{{outlet}}` helper is in your\n application's `application.hbs` file:\n \n ```handlebars\n {{! app/templates/application.hbs }}\n \n {{my-header}}\n
    \n \n {{outlet}}\n
    \n \n {{my-footer}}\n ```\n \n You may also specify a name for the `{{outlet}}`, which is useful when using more than one\n `{{outlet}}` in a template:\n \n ```handlebars\n {{outlet \"menu\"}}\n {{outlet \"sidebar\"}}\n {{outlet \"main\"}}\n ```\n \n Your routes can then render into a specific one of these `outlet`s by specifying the `outlet`\n attribute in your `renderTemplate` function:\n \n ```app/routes/menu.js\n import Route from '@ember/routing/route';\n \n export default Route.extend({\n renderTemplate() {\n this.render({ outlet: 'menu' });\n }\n });\n ```\n \n See the [routing guide](https://guides.emberjs.com/release/routing/rendering-a-template/) for more\n information on how your `route` interacts with the `{{outlet}}` helper.\n Note: Your content __will not render__ if there isn't an `{{outlet}}` for it.\n \n @method outlet\n @param {String} [name]\n @for Ember.Templates.helpers\n @public\n */\n function outletHelper(vm, args) {\n let scope = vm.dynamicScope();\n let nameRef;\n if (args.positional.length === 0) {\n nameRef = new _reference.ConstReference('main');\n } else {\n nameRef = args.positional.at(0);\n }\n return new OutletComponentReference(new _outlet2.OutletReference(scope.outletState, nameRef));\n }\n function outletMacro(_name, params, hash, builder) {\n let expr = [_wireFormat.Ops.Helper, '-outlet', params || [], hash];\n builder.dynamicComponent(expr, null, [], null, false, null, null);\n return true;\n }\n class OutletComponentReference {\n constructor(outletRef) {\n this.outletRef = outletRef;\n this.definition = null;\n this.lastState = null;\n // The router always dirties the root state.\n this.tag = outletRef.tag;\n }\n value() {\n let state = stateFor(this.outletRef);\n if (validate(state, this.lastState)) {\n return this.definition;\n }\n this.lastState = state;\n let definition = null;\n if (state !== null) {\n definition = (0, _runtime.curry)(new _outlet.OutletComponentDefinition(state));\n }\n return this.definition = definition;\n }\n get(_key) {\n return _runtime.UNDEFINED_REFERENCE;\n }\n }\n function stateFor(ref) {\n let outlet = ref.value();\n if (outlet === undefined) return null;\n let render = outlet.render;\n if (render === undefined) return null;\n let template = render.template;\n if (template === undefined) return null;\n return {\n ref,\n name: render.name,\n outlet: render.outlet,\n template,\n controller: render.controller\n };\n }\n function validate(state, lastState) {\n if (state === null) {\n return lastState === null;\n }\n if (lastState === null) {\n return false;\n }\n return state.template === lastState.template && state.controller === lastState.controller;\n }\n});","enifed(\"@ember/-internals/glimmer/lib/syntax/utils\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.hashToArgs = hashToArgs;\n function hashToArgs(hash) {\n if (hash === null) return null;\n let names = hash[0].map(key => `@${key}`);\n return [names, hash[1]];\n }\n});","enifed('@ember/-internals/glimmer/lib/template-compiler', ['exports', '@ember/-internals/glimmer/lib/resolver'], function (exports, _resolver) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = {\n create() {\n return new _resolver.default().compiler;\n }\n };\n});","enifed('@ember/-internals/glimmer/lib/template', ['exports', '@ember/-internals/owner', '@glimmer/opcode-compiler'], function (exports, _owner, _opcodeCompiler) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = template;\n function template(json) {\n return new FactoryWrapper((0, _opcodeCompiler.templateFactory)(json));\n }\n class FactoryWrapper {\n constructor(factory) {\n this.factory = factory;\n this.id = factory.id;\n this.meta = factory.meta;\n }\n create(injections) {\n const owner = (0, _owner.getOwner)(injections);\n return this.factory.create(injections.compiler, { owner });\n }\n }\n});","enifed(\"@ember/-internals/glimmer/lib/template_registry\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.setTemplates = setTemplates;\n exports.getTemplates = getTemplates;\n exports.getTemplate = getTemplate;\n exports.hasTemplate = hasTemplate;\n exports.setTemplate = setTemplate;\n let TEMPLATES = {};\n function setTemplates(templates) {\n TEMPLATES = templates;\n }\n function getTemplates() {\n return TEMPLATES;\n }\n function getTemplate(name) {\n if (TEMPLATES.hasOwnProperty(name)) {\n return TEMPLATES[name];\n }\n }\n function hasTemplate(name) {\n return TEMPLATES.hasOwnProperty(name);\n }\n function setTemplate(name, template) {\n return TEMPLATES[name] = template;\n }\n});","enifed(\"@ember/-internals/glimmer/lib/templates/component\", [\"exports\", \"@ember/-internals/glimmer/lib/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = (0, _template.default)({ \"id\": \"chfQcH83\", \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[14,1]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/component.hbs\" } });\n});","enifed(\"@ember/-internals/glimmer/lib/templates/empty\", [\"exports\", \"@ember/-internals/glimmer/lib/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = (0, _template.default)({ \"id\": \"hvtsz7RF\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/empty.hbs\" } });\n});","enifed(\"@ember/-internals/glimmer/lib/templates/link-to\", [\"exports\", \"@ember/-internals/glimmer/lib/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = (0, _template.default)({ \"id\": \"r9g6x1y/\", \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[4,\\\"if\\\",[[23,[\\\"linkTitle\\\"]]],null,{\\\"statements\\\":[[1,[21,\\\"linkTitle\\\"],false]],\\\"parameters\\\":[]},{\\\"statements\\\":[[14,1]],\\\"parameters\\\":[]}]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/link-to.hbs\" } });\n});","enifed(\"@ember/-internals/glimmer/lib/templates/outlet\", [\"exports\", \"@ember/-internals/glimmer/lib/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = (0, _template.default)({ \"id\": \"gK7R0/52\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[21,\\\"outlet\\\"],false]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/outlet.hbs\" } });\n});","enifed(\"@ember/-internals/glimmer/lib/templates/root\", [\"exports\", \"@ember/-internals/glimmer/lib/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = (0, _template.default)({ \"id\": \"HlDcU23A\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[27,\\\"component\\\",[[22,0,[]]],null],false]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/@ember/-internals/glimmer/lib/templates/root.hbs\" } });\n});","enifed('@ember/-internals/glimmer/lib/utils/bindings', ['exports', '@ember/-internals/metal', '@ember/debug', '@ember/string', '@glimmer/reference', '@glimmer/runtime', '@glimmer/wire-format', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/utils/references', '@ember/-internals/glimmer/lib/utils/string'], function (exports, _metal, _debug, _string, _reference, _runtime, _wireFormat, _component, _references, _string2) {\n 'use strict';\n\n exports.__esModule = true;\n exports.SimpleClassNameBindingReference = exports.ClassNameBinding = exports.IsVisibleBinding = exports.AttributeBinding = undefined;\n exports.referenceForKey = referenceForKey;\n exports.wrapComponentClassAttribute = wrapComponentClassAttribute;\n function referenceForKey(component, key) {\n return component[_component.ROOT_REF].get(key);\n }\n function referenceForParts(component, parts) {\n let isAttrs = parts[0] === 'attrs';\n // TODO deprecate this\n if (isAttrs) {\n parts.shift();\n if (parts.length === 1) {\n return referenceForKey(component, parts[0]);\n }\n }\n return (0, _references.referenceFromParts)(component[_component.ROOT_REF], parts);\n }\n // TODO we should probably do this transform at build time\n function wrapComponentClassAttribute(hash) {\n if (hash === null) {\n return;\n }\n let [keys, values] = hash;\n let index = keys === null ? -1 : keys.indexOf('class');\n if (index !== -1) {\n let value = values[index];\n if (!Array.isArray(value)) {\n return;\n }\n let [type] = value;\n if (type === _wireFormat.Ops.Get || type === _wireFormat.Ops.MaybeLocal) {\n let path = value[value.length - 1];\n let propName = path[path.length - 1];\n values[index] = [_wireFormat.Ops.Helper, '-class', [value, propName], null];\n }\n }\n }\n const AttributeBinding = exports.AttributeBinding = {\n parse(microsyntax) {\n let colonIndex = microsyntax.indexOf(':');\n if (colonIndex === -1) {\n (0, _debug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', microsyntax !== 'class');\n return [microsyntax, microsyntax, true];\n } else {\n let prop = microsyntax.substring(0, colonIndex);\n let attribute = microsyntax.substring(colonIndex + 1);\n (0, _debug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', attribute !== 'class');\n return [prop, attribute, false];\n }\n },\n install(_element, component, parsed, operations) {\n let [prop, attribute, isSimple] = parsed;\n if (attribute === 'id') {\n let elementId = (0, _metal.get)(component, prop);\n if (elementId === undefined || elementId === null) {\n elementId = component.elementId;\n }\n elementId = _runtime.PrimitiveReference.create(elementId);\n operations.setAttribute('id', elementId, true, null);\n // operations.addStaticAttribute(element, 'id', elementId);\n return;\n }\n let isPath = prop.indexOf('.') > -1;\n let reference = isPath ? referenceForParts(component, prop.split('.')) : referenceForKey(component, prop);\n (0, _debug.assert)(`Illegal attributeBinding: '${prop}' is not a valid attribute name.`, !(isSimple && isPath));\n if (attribute === 'style') {\n reference = new StyleBindingReference(reference, referenceForKey(component, 'isVisible'));\n }\n operations.setAttribute(attribute, reference, false, null);\n // operations.addDynamicAttribute(element, attribute, reference, false);\n }\n };\n const DISPLAY_NONE = 'display: none;';\n const SAFE_DISPLAY_NONE = (0, _string2.htmlSafe)(DISPLAY_NONE);\n class StyleBindingReference extends _reference.CachedReference {\n constructor(inner, isVisible) {\n super();\n this.inner = inner;\n this.isVisible = isVisible;\n this.tag = (0, _reference.combine)([inner.tag, isVisible.tag]);\n }\n compute() {\n let value = this.inner.value();\n let isVisible = this.isVisible.value();\n if (isVisible !== false) {\n return value;\n } else if (!value) {\n return SAFE_DISPLAY_NONE;\n } else {\n let style = value + ' ' + DISPLAY_NONE;\n return (0, _string2.isHTMLSafe)(value) ? (0, _string2.htmlSafe)(style) : style;\n }\n }\n }\n const IsVisibleBinding = exports.IsVisibleBinding = {\n install(_element, component, operations) {\n operations.setAttribute('style', (0, _reference.map)(referenceForKey(component, 'isVisible'), this.mapStyleValue), false, null);\n // // the upstream type for addDynamicAttribute's `value` argument\n // // appears to be incorrect. It is currently a Reference, I\n // // think it should be a Reference.\n // operations.addDynamicAttribute(element, 'style', ref as any as Reference, false);\n },\n mapStyleValue(isVisible) {\n return isVisible === false ? SAFE_DISPLAY_NONE : null;\n }\n };\n const ClassNameBinding = exports.ClassNameBinding = {\n install(_element, component, microsyntax, operations) {\n let [prop, truthy, falsy] = microsyntax.split(':');\n let isStatic = prop === '';\n if (isStatic) {\n operations.setAttribute('class', _runtime.PrimitiveReference.create(truthy), true, null);\n } else {\n let isPath = prop.indexOf('.') > -1;\n let parts = isPath ? prop.split('.') : [];\n let value = isPath ? referenceForParts(component, parts) : referenceForKey(component, prop);\n let ref;\n if (truthy === undefined) {\n ref = new SimpleClassNameBindingReference(value, isPath ? parts[parts.length - 1] : prop);\n } else {\n ref = new ColonClassNameBindingReference(value, truthy, falsy);\n }\n operations.setAttribute('class', ref, false, null);\n // // the upstream type for addDynamicAttribute's `value` argument\n // // appears to be incorrect. It is currently a Reference, I\n // // think it should be a Reference.\n // operations.addDynamicAttribute(element, 'class', ref as any as Reference, false);\n }\n }\n };\n class SimpleClassNameBindingReference extends _reference.CachedReference {\n constructor(inner, path) {\n super();\n this.inner = inner;\n this.path = path;\n this.tag = inner.tag;\n this.inner = inner;\n this.path = path;\n this.dasherizedPath = null;\n }\n compute() {\n let value = this.inner.value();\n if (value === true) {\n let { path, dasherizedPath } = this;\n return dasherizedPath || (this.dasherizedPath = (0, _string.dasherize)(path));\n } else if (value || value === 0) {\n return String(value);\n } else {\n return null;\n }\n }\n }\n exports.SimpleClassNameBindingReference = SimpleClassNameBindingReference;\n class ColonClassNameBindingReference extends _reference.CachedReference {\n constructor(inner, truthy = null, falsy = null) {\n super();\n this.inner = inner;\n this.truthy = truthy;\n this.falsy = falsy;\n this.tag = inner.tag;\n }\n compute() {\n let { inner, truthy, falsy } = this;\n return inner.value() ? truthy : falsy;\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/curly-component-state-bucket', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n // tslint:disable-next-line:no-empty\n function NOOP() {}\n /**\n @module ember\n */\n /**\n Represents the internal state of the component.\n \n @class ComponentStateBucket\n @private\n */\n class ComponentStateBucket {\n constructor(environment, component, args, finalizer, hasWrappedElement) {\n this.environment = environment;\n this.component = component;\n this.args = args;\n this.finalizer = finalizer;\n this.hasWrappedElement = hasWrappedElement;\n this.classRef = null;\n this.classRef = null;\n this.argsRevision = args === null ? 0 : args.tag.value();\n }\n destroy() {\n let { component, environment } = this;\n if (environment.isInteractive) {\n component.trigger('willDestroyElement');\n component.trigger('willClearRender');\n }\n environment.destroyedComponents.push(component);\n }\n finalize() {\n let { finalizer } = this;\n finalizer();\n this.finalizer = NOOP;\n }\n }\n exports.default = ComponentStateBucket;\n});","enifed('@ember/-internals/glimmer/lib/utils/custom-component-manager', ['exports', '@ember/canary-features'], function (exports, _canaryFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.setComponentManager = setComponentManager;\n exports.getComponentManager = getComponentManager;\n\n const getPrototypeOf = Object.getPrototypeOf;\n const MANAGERS = new WeakMap();\n function setComponentManager(managerId, obj) {\n MANAGERS.set(obj, managerId);\n return obj;\n }\n function getComponentManager(obj) {\n if (!_canaryFeatures.GLIMMER_CUSTOM_COMPONENT_MANAGER) {\n return;\n }\n let pointer = obj;\n while (pointer !== undefined && pointer !== null) {\n if (MANAGERS.has(pointer)) {\n return MANAGERS.get(pointer);\n }\n pointer = getPrototypeOf(pointer);\n }\n return;\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/debug-stack', ['exports', '@glimmer/env'], function (exports, _env) {\n 'use strict';\n\n exports.__esModule = true;\n\n let DebugStack; // @ts-check\n\n if (_env.DEBUG) {\n class Element {\n constructor(name) {\n this.name = name;\n }\n }\n class TemplateElement extends Element {}\n class EngineElement extends Element {}\n // tslint:disable-next-line:no-shadowed-variable\n DebugStack = class DebugStack {\n constructor() {\n this._stack = [];\n }\n push(name) {\n this._stack.push(new TemplateElement(name));\n }\n pushEngine(name) {\n this._stack.push(new EngineElement(name));\n }\n pop() {\n let element = this._stack.pop();\n if (element) {\n return element.name;\n }\n }\n peek() {\n let template = this._currentTemplate();\n let engine = this._currentEngine();\n if (engine) {\n return `\"${template}\" (in \"${engine}\")`;\n } else if (template) {\n return `\"${template}\"`;\n }\n }\n _currentTemplate() {\n return this._getCurrentByType(TemplateElement);\n }\n _currentEngine() {\n return this._getCurrentByType(EngineElement);\n }\n _getCurrentByType(type) {\n for (let i = this._stack.length; i >= 0; i--) {\n let element = this._stack[i];\n if (element instanceof type) {\n return element.name;\n }\n }\n }\n };\n }\n exports.default = DebugStack;\n});","enifed('@ember/-internals/glimmer/lib/utils/iterable', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/utils', '@ember/debug', '@glimmer/reference', '@ember/-internals/glimmer/lib/helpers/each-in', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _metal, _runtime, _utils, _debug, _reference, _eachIn, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = iterableFor;\n\n const ITERATOR_KEY_GUID = 'be277757-bbbe-4620-9fcb-213ef433cca2';\n function iterableFor(ref, keyPath) {\n if ((0, _eachIn.isEachIn)(ref)) {\n return new EachInIterable(ref, keyPath || '@key');\n } else {\n return new EachIterable(ref, keyPath || '@identity');\n }\n }\n class BoundedIterator {\n constructor(length, keyFor) {\n this.length = length;\n this.keyFor = keyFor;\n this.position = 0;\n }\n isEmpty() {\n return false;\n }\n memoFor(position) {\n return position;\n }\n next() {\n let { length, keyFor, position } = this;\n if (position >= length) {\n return null;\n }\n let value = this.valueFor(position);\n let memo = this.memoFor(position);\n let key = keyFor(value, memo, position);\n this.position++;\n return { key, value, memo };\n }\n }\n class ArrayIterator extends BoundedIterator {\n constructor(array, length, keyFor) {\n super(length, keyFor);\n this.array = array;\n }\n static from(array, keyFor) {\n let { length } = array;\n if (length === 0) {\n return EMPTY_ITERATOR;\n } else {\n return new this(array, length, keyFor);\n }\n }\n static fromForEachable(object, keyFor) {\n let array = [];\n object.forEach(item => array.push(item));\n return this.from(array, keyFor);\n }\n valueFor(position) {\n return this.array[position];\n }\n }\n class EmberArrayIterator extends BoundedIterator {\n constructor(array, length, keyFor) {\n super(length, keyFor);\n this.array = array;\n }\n static from(array, keyFor) {\n let { length } = array;\n if (length === 0) {\n return EMPTY_ITERATOR;\n } else {\n return new this(array, length, keyFor);\n }\n }\n valueFor(position) {\n return (0, _metal.objectAt)(this.array, position);\n }\n }\n class ObjectIterator extends BoundedIterator {\n constructor(keys, values, length, keyFor) {\n super(length, keyFor);\n this.keys = keys;\n this.values = values;\n }\n static fromIndexable(obj, keyFor) {\n let keys = Object.keys(obj);\n let values = [];\n let { length } = keys;\n for (let i = 0; i < length; i++) {\n values.push((0, _metal.get)(obj, keys[i]));\n }\n if (length === 0) {\n return EMPTY_ITERATOR;\n } else {\n return new this(keys, values, length, keyFor);\n }\n }\n static fromForEachable(obj, keyFor) {\n let keys = [];\n let values = [];\n let length = 0;\n let isMapLike = false;\n obj.forEach((value, key) => {\n isMapLike = isMapLike || arguments.length >= 2;\n if (isMapLike) {\n keys.push(key);\n }\n values.push(value);\n length++;\n });\n if (length === 0) {\n return EMPTY_ITERATOR;\n } else if (isMapLike) {\n return new this(keys, values, length, keyFor);\n } else {\n return new ArrayIterator(values, length, keyFor);\n }\n }\n valueFor(position) {\n return this.values[position];\n }\n memoFor(position) {\n return this.keys[position];\n }\n }\n class NativeIterator {\n constructor(iterable, result, keyFor) {\n this.iterable = iterable;\n this.result = result;\n this.keyFor = keyFor;\n this.position = 0;\n }\n static from(iterable, keyFor) {\n let iterator = iterable[Symbol.iterator]();\n let result = iterator.next();\n let { value, done } = result;\n if (done) {\n return EMPTY_ITERATOR;\n } else if (Array.isArray(value) && value.length === 2) {\n return new this(iterator, result, keyFor);\n } else {\n return new ArrayLikeNativeIterator(iterator, result, keyFor);\n }\n }\n isEmpty() {\n return false;\n }\n next() {\n let { iterable, result, position, keyFor } = this;\n if (result.done) {\n return null;\n }\n let value = this.valueFor(result, position);\n let memo = this.memoFor(result, position);\n let key = keyFor(value, memo, position);\n this.position++;\n this.result = iterable.next();\n return { key, value, memo };\n }\n }\n class ArrayLikeNativeIterator extends NativeIterator {\n valueFor(result) {\n return result.value;\n }\n memoFor(_result, position) {\n return position;\n }\n }\n class MapLikeNativeIterator extends NativeIterator {\n valueFor(result) {\n return result.value[1];\n }\n memoFor(result) {\n return result.value[0];\n }\n }\n const EMPTY_ITERATOR = {\n isEmpty() {\n return true;\n },\n next() {\n (0, _debug.assert)('Cannot call next() on an empty iterator');\n return null;\n }\n };\n class EachInIterable {\n constructor(ref, keyPath) {\n this.ref = ref;\n this.keyPath = keyPath;\n this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([ref.tag, this.valueTag]);\n }\n iterate() {\n let { ref, valueTag } = this;\n let iterable = ref.value();\n let tag = (0, _metal.tagFor)(iterable);\n if ((0, _utils.isProxy)(iterable)) {\n // this is because the each-in doesn't actually get(proxy, 'key') but bypasses it\n // and the proxy's tag is lazy updated on access\n iterable = (0, _runtime._contentFor)(iterable);\n }\n valueTag.inner.update(tag);\n if (!isIndexable(iterable)) {\n return EMPTY_ITERATOR;\n }\n if (Array.isArray(iterable) || (0, _runtime.isEmberArray)(iterable)) {\n return ObjectIterator.fromIndexable(iterable, this.keyFor(true));\n } else if (_utils.HAS_NATIVE_SYMBOL && isNativeIterable(iterable)) {\n return MapLikeNativeIterator.from(iterable, this.keyFor());\n } else if (hasForEach(iterable)) {\n return ObjectIterator.fromForEachable(iterable, this.keyFor());\n } else {\n return ObjectIterator.fromIndexable(iterable, this.keyFor(true));\n }\n }\n valueReferenceFor(item) {\n return new _references.UpdatableReference(item.value);\n }\n updateValueReference(ref, item) {\n ref.update(item.value);\n }\n memoReferenceFor(item) {\n return new _references.UpdatableReference(item.memo);\n }\n updateMemoReference(ref, item) {\n ref.update(item.memo);\n }\n keyFor(hasUniqueKeys = false) {\n let { keyPath } = this;\n switch (keyPath) {\n case '@key':\n return hasUniqueKeys ? ObjectKey : Unique(MapKey);\n case '@index':\n return Index;\n case '@identity':\n return Unique(Identity);\n default:\n (0, _debug.assert)(`Invalid key: ${keyPath}`, keyPath[0] !== '@');\n return Unique(KeyPath(keyPath));\n }\n }\n }\n class EachIterable {\n constructor(ref, keyPath) {\n this.ref = ref;\n this.keyPath = keyPath;\n this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([ref.tag, this.valueTag]);\n }\n iterate() {\n let { ref, valueTag } = this;\n let iterable = ref.value();\n valueTag.inner.update((0, _metal.tagForProperty)(iterable, '[]'));\n if (iterable === null || typeof iterable !== 'object') {\n return EMPTY_ITERATOR;\n }\n let keyFor = this.keyFor();\n if (Array.isArray(iterable)) {\n return ArrayIterator.from(iterable, keyFor);\n } else if ((0, _runtime.isEmberArray)(iterable)) {\n return EmberArrayIterator.from(iterable, keyFor);\n } else if (_utils.HAS_NATIVE_SYMBOL && isNativeIterable(iterable)) {\n return ArrayLikeNativeIterator.from(iterable, keyFor);\n } else if (hasForEach(iterable)) {\n return ArrayIterator.fromForEachable(iterable, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n }\n valueReferenceFor(item) {\n return new _references.UpdatableReference(item.value);\n }\n updateValueReference(ref, item) {\n ref.update(item.value);\n }\n memoReferenceFor(item) {\n return new _references.UpdatableReference(item.memo);\n }\n updateMemoReference(ref, item) {\n ref.update(item.memo);\n }\n keyFor() {\n let { keyPath } = this;\n switch (keyPath) {\n case '@index':\n return Index;\n case '@identity':\n return Unique(Identity);\n default:\n (0, _debug.assert)(`Invalid key: ${keyPath}`, keyPath[0] !== '@');\n return Unique(KeyPath(keyPath));\n }\n }\n }\n function hasForEach(value) {\n return typeof value['forEach'] === 'function';\n }\n function isNativeIterable(value) {\n return typeof value[Symbol.iterator] === 'function';\n }\n function isIndexable(value) {\n return value !== null && (typeof value === 'object' || typeof value === 'function');\n }\n // Position in an array is guarenteed to be unique\n function Index(_value, _memo, position) {\n return String(position);\n }\n // Object.keys(...) is guarenteed to be strings and unique\n function ObjectKey(_value, memo) {\n return memo;\n }\n // Map keys can be any objects\n function MapKey(_value, memo) {\n return Identity(memo);\n }\n function Identity(value) {\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n return String(value);\n default:\n return (0, _utils.guidFor)(value);\n }\n }\n function KeyPath(keyPath) {\n return value => String((0, _metal.get)(value, keyPath));\n }\n function Unique(func) {\n let seen = {};\n return (value, memo, position) => {\n let key = func(value, memo, position);\n let count = seen[key];\n if (count === undefined) {\n seen[key] = 0;\n return key;\n } else {\n seen[key] = ++count;\n return `${key}${ITERATOR_KEY_GUID}${count}`;\n }\n };\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/outlet', ['exports', '@glimmer/reference'], function (exports, _reference) {\n 'use strict';\n\n exports.__esModule = true;\n exports.OutletReference = exports.RootOutletReference = undefined;\n\n /**\n * Represents the root outlet.\n */\n class RootOutletReference {\n constructor(outletState) {\n this.outletState = outletState;\n this.tag = _reference.DirtyableTag.create();\n }\n get(key) {\n return new PathReference(this, key);\n }\n value() {\n return this.outletState;\n }\n update(state) {\n this.outletState.outlets.main = state;\n this.tag.inner.dirty();\n }\n }\n exports.RootOutletReference = RootOutletReference;\n /**\n * Represents the connected outlet.\n */\n class OutletReference {\n constructor(parentStateRef, outletNameRef) {\n this.parentStateRef = parentStateRef;\n this.outletNameRef = outletNameRef;\n this.tag = (0, _reference.combine)([parentStateRef.tag, outletNameRef.tag]);\n }\n value() {\n let outletState = this.parentStateRef.value();\n let outlets = outletState === undefined ? undefined : outletState.outlets;\n return outlets === undefined ? undefined : outlets[this.outletNameRef.value()];\n }\n get(key) {\n return new PathReference(this, key);\n }\n }\n exports.OutletReference = OutletReference;\n /**\n * Outlet state is dirtied from root.\n * This just using the parent tag for dirtiness.\n */\n class PathReference {\n constructor(parent, key) {\n this.parent = parent;\n this.key = key;\n this.tag = parent.tag;\n }\n get(key) {\n return new PathReference(this, key);\n }\n value() {\n let parent = this.parent.value();\n return parent && parent[this.key];\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/process-args', ['exports', '@ember/-internals/utils', '@ember/-internals/views', '@ember/-internals/glimmer/lib/component', '@ember/-internals/glimmer/lib/utils/references'], function (exports, _utils, _views, _component, _references) {\n 'use strict';\n\n exports.__esModule = true;\n exports.processComponentArgs = processComponentArgs;\n\n // ComponentArgs takes EvaluatedNamedArgs and converts them into the\n // inputs needed by CurlyComponents (attrs and props, with mutable\n // cells, etc).\n function processComponentArgs(namedArgs) {\n let keys = namedArgs.names;\n let attrs = namedArgs.value();\n let props = Object.create(null);\n let args = Object.create(null);\n props[_component.ARGS] = args;\n for (let i = 0; i < keys.length; i++) {\n let name = keys[i];\n let ref = namedArgs.get(name);\n let value = attrs[name];\n if (typeof value === 'function' && value[_references.ACTION]) {\n attrs[name] = value;\n } else if (ref[_references.UPDATE]) {\n attrs[name] = new MutableCell(ref, value);\n }\n args[name] = ref;\n props[name] = value;\n }\n props.attrs = attrs;\n return props;\n }\n const REF = (0, _utils.symbol)('REF');\n class MutableCell {\n constructor(ref, value) {\n this[_views.MUTABLE_CELL] = true;\n this[REF] = ref;\n this.value = value;\n }\n update(val) {\n this[REF][_references.UPDATE](val);\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/references', ['exports', '@ember/-internals/metal', '@ember/-internals/utils', '@glimmer/env', '@glimmer/reference', '@glimmer/runtime', '@ember/-internals/glimmer/lib/helper', '@ember/-internals/glimmer/lib/utils/to-bool'], function (exports, _metal, _utils, _env, _reference, _runtime, _helper, _toBool) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ReadonlyReference = exports.UnboundReference = exports.InternalHelperReference = exports.ClassBasedHelperReference = exports.SimpleHelperReference = exports.ConditionalReference = exports.UpdatableReference = exports.NestedPropertyReference = exports.RootPropertyReference = exports.PropertyReference = exports.RootReference = exports.CachedReference = exports.ACTION = exports.INVOKE = exports.UPDATE = undefined;\n exports.referenceFromParts = referenceFromParts;\n exports.valueToRef = valueToRef;\n const UPDATE = exports.UPDATE = (0, _utils.symbol)('UPDATE');\n const INVOKE = exports.INVOKE = (0, _utils.symbol)('INVOKE');\n const ACTION = exports.ACTION = (0, _utils.symbol)('ACTION');\n let maybeFreeze;\n if (_env.DEBUG) {\n // gaurding this in a DEBUG gaurd (as well as all invocations)\n // so that it is properly stripped during the minification's\n // dead code elimination\n maybeFreeze = obj => {\n // re-freezing an already frozen object introduces a significant\n // performance penalty on Chrome (tested through 59).\n //\n // See: https://bugs.chromium.org/p/v8/issues/detail?id=6450\n if (!Object.isFrozen(obj)) {\n Object.freeze(obj);\n }\n };\n }\n class EmberPathReference {\n get(key) {\n return PropertyReference.create(this, key);\n }\n }\n class CachedReference extends EmberPathReference {\n constructor() {\n super();\n this._lastRevision = null;\n this._lastValue = null;\n }\n value() {\n let { tag, _lastRevision, _lastValue } = this;\n if (_lastRevision === null || !tag.validate(_lastRevision)) {\n _lastValue = this._lastValue = this.compute();\n this._lastRevision = tag.value();\n }\n return _lastValue;\n }\n }\n exports.CachedReference = CachedReference;\n class RootReference extends _reference.ConstReference {\n constructor(value) {\n super(value);\n this.children = Object.create(null);\n }\n get(propertyKey) {\n let ref = this.children[propertyKey];\n if (ref === undefined) {\n ref = this.children[propertyKey] = new RootPropertyReference(this.inner, propertyKey);\n }\n return ref;\n }\n }\n exports.RootReference = RootReference;\n let TwoWayFlushDetectionTag;\n if (_env.DEBUG) {\n TwoWayFlushDetectionTag = class {\n static create(tag, key, ref) {\n return new _reference.TagWrapper(tag.type, new TwoWayFlushDetectionTag(tag, key, ref));\n }\n constructor(tag, key, ref) {\n this.tag = tag;\n this.parent = null;\n this.key = key;\n this.ref = ref;\n }\n value() {\n return this.tag.value();\n }\n validate(ticket) {\n let { parent, key } = this;\n let isValid = this.tag.validate(ticket);\n if (isValid && parent) {\n (0, _metal.didRender)(parent, key, this.ref);\n }\n return isValid;\n }\n didCompute(parent) {\n this.parent = parent;\n (0, _metal.didRender)(parent, this.key, this.ref);\n }\n };\n }\n class PropertyReference extends CachedReference {\n static create(parentReference, propertyKey) {\n if ((0, _reference.isConst)(parentReference)) {\n return new RootPropertyReference(parentReference.value(), propertyKey);\n } else {\n return new NestedPropertyReference(parentReference, propertyKey);\n }\n }\n get(key) {\n return new NestedPropertyReference(this, key);\n }\n }\n exports.PropertyReference = PropertyReference;\n class RootPropertyReference extends PropertyReference {\n constructor(parentValue, propertyKey) {\n super();\n this._parentValue = parentValue;\n this._propertyKey = propertyKey;\n if (_env.DEBUG) {\n this.tag = TwoWayFlushDetectionTag.create((0, _metal.tagForProperty)(parentValue, propertyKey), propertyKey, this);\n } else {\n this.tag = (0, _metal.tagForProperty)(parentValue, propertyKey);\n }\n if (_env.DEBUG) {\n (0, _metal.watchKey)(parentValue, propertyKey);\n }\n }\n compute() {\n let { _parentValue, _propertyKey } = this;\n if (_env.DEBUG) {\n this.tag.inner.didCompute(_parentValue);\n }\n return (0, _metal.get)(_parentValue, _propertyKey);\n }\n [UPDATE](value) {\n (0, _metal.set)(this._parentValue, this._propertyKey, value);\n }\n }\n exports.RootPropertyReference = RootPropertyReference;\n class NestedPropertyReference extends PropertyReference {\n constructor(parentReference, propertyKey) {\n super();\n let parentReferenceTag = parentReference.tag;\n let parentObjectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this._parentReference = parentReference;\n this._parentObjectTag = parentObjectTag;\n this._propertyKey = propertyKey;\n if (_env.DEBUG) {\n let tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);\n this.tag = TwoWayFlushDetectionTag.create(tag, propertyKey, this);\n } else {\n this.tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);\n }\n }\n compute() {\n let { _parentReference, _parentObjectTag, _propertyKey } = this;\n let parentValue = _parentReference.value();\n _parentObjectTag.inner.update((0, _metal.tagForProperty)(parentValue, _propertyKey));\n let parentValueType = typeof parentValue;\n if (parentValueType === 'string' && _propertyKey === 'length') {\n return parentValue.length;\n }\n if (parentValueType === 'object' && parentValue !== null || parentValueType === 'function') {\n if (_env.DEBUG) {\n (0, _metal.watchKey)(parentValue, _propertyKey);\n }\n if (_env.DEBUG) {\n this.tag.inner.didCompute(parentValue);\n }\n return (0, _metal.get)(parentValue, _propertyKey);\n } else {\n return undefined;\n }\n }\n [UPDATE](value) {\n let parent = this._parentReference.value();\n (0, _metal.set)(parent, this._propertyKey, value);\n }\n }\n exports.NestedPropertyReference = NestedPropertyReference;\n class UpdatableReference extends EmberPathReference {\n constructor(value) {\n super();\n this.tag = _reference.DirtyableTag.create();\n this._value = value;\n }\n value() {\n return this._value;\n }\n update(value) {\n let { _value } = this;\n if (value !== _value) {\n this.tag.inner.dirty();\n this._value = value;\n }\n }\n }\n exports.UpdatableReference = UpdatableReference;\n class ConditionalReference extends _runtime.ConditionalReference {\n static create(reference) {\n if ((0, _reference.isConst)(reference)) {\n let value = reference.value();\n if ((0, _utils.isProxy)(value)) {\n return new RootPropertyReference(value, 'isTruthy');\n } else {\n return _runtime.PrimitiveReference.create((0, _toBool.default)(value));\n }\n }\n return new ConditionalReference(reference);\n }\n constructor(reference) {\n super(reference);\n this.objectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([reference.tag, this.objectTag]);\n }\n toBool(predicate) {\n if ((0, _utils.isProxy)(predicate)) {\n this.objectTag.inner.update((0, _metal.tagForProperty)(predicate, 'isTruthy'));\n return (0, _metal.get)(predicate, 'isTruthy');\n } else {\n this.objectTag.inner.update((0, _metal.tagFor)(predicate));\n return (0, _toBool.default)(predicate);\n }\n }\n }\n exports.ConditionalReference = ConditionalReference;\n class SimpleHelperReference extends CachedReference {\n static create(helper, args) {\n if ((0, _reference.isConst)(args)) {\n let { positional, named } = args;\n let positionalValue = positional.value();\n let namedValue = named.value();\n if (_env.DEBUG) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n let result = helper(positionalValue, namedValue);\n return valueToRef(result);\n } else {\n return new SimpleHelperReference(helper, args);\n }\n }\n constructor(helper, args) {\n super();\n this.tag = args.tag;\n this.helper = helper;\n this.args = args;\n }\n compute() {\n let { helper, args: { positional, named } } = this;\n let positionalValue = positional.value();\n let namedValue = named.value();\n if (_env.DEBUG) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n return helper(positionalValue, namedValue);\n }\n }\n exports.SimpleHelperReference = SimpleHelperReference;\n class ClassBasedHelperReference extends CachedReference {\n static create(instance, args) {\n return new ClassBasedHelperReference(instance, args);\n }\n constructor(instance, args) {\n super();\n this.tag = (0, _reference.combine)([instance[_helper.RECOMPUTE_TAG], args.tag]);\n this.instance = instance;\n this.args = args;\n }\n compute() {\n let { instance, args: { positional, named } } = this;\n let positionalValue = positional.value();\n let namedValue = named.value();\n if (_env.DEBUG) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n return instance.compute(positionalValue, namedValue);\n }\n }\n exports.ClassBasedHelperReference = ClassBasedHelperReference;\n class InternalHelperReference extends CachedReference {\n constructor(helper, args) {\n super();\n this.tag = args.tag;\n this.helper = helper;\n this.args = args;\n }\n compute() {\n let { helper, args } = this;\n return helper(args);\n }\n }\n exports.InternalHelperReference = InternalHelperReference;\n class UnboundReference extends _reference.ConstReference {\n static create(value) {\n return valueToRef(value, false);\n }\n get(key) {\n return valueToRef((0, _metal.get)(this.inner, key), false);\n }\n }\n exports.UnboundReference = UnboundReference;\n class ReadonlyReference extends CachedReference {\n constructor(inner) {\n super();\n this.inner = inner;\n }\n get tag() {\n return this.inner.tag;\n }\n get [INVOKE]() {\n return this.inner[INVOKE];\n }\n compute() {\n return this.inner.value();\n }\n get(key) {\n return this.inner.get(key);\n }\n }\n exports.ReadonlyReference = ReadonlyReference;\n function referenceFromParts(root, parts) {\n let reference = root;\n for (let i = 0; i < parts.length; i++) {\n reference = reference.get(parts[i]);\n }\n return reference;\n }\n function valueToRef(value, bound = true) {\n if (value !== null && typeof value === 'object') {\n // root of interop with ember objects\n return bound ? new RootReference(value) : new UnboundReference(value);\n }\n // ember doesn't do observing with functions\n if (typeof value === 'function') {\n return new UnboundReference(value);\n }\n return _runtime.PrimitiveReference.create(value);\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/serialization-first-node-helpers', ['exports', '@glimmer/util'], function (exports, _util) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'isSerializationFirstNode', {\n enumerable: true,\n get: function () {\n return _util.isSerializationFirstNode;\n }\n });\n});","enifed('@ember/-internals/glimmer/lib/utils/string', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.escapeExpression = escapeExpression;\n exports.htmlSafe = htmlSafe;\n exports.isHTMLSafe = isHTMLSafe;\n /**\n @module @ember/string\n */\n class SafeString {\n constructor(string) {\n this.string = string;\n }\n toString() {\n return `${this.string}`;\n }\n toHTML() {\n return this.toString();\n }\n }\n exports.SafeString = SafeString;\n const escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n };\n const possible = /[&<>\"'`=]/;\n const badChars = /[&<>\"'`=]/g;\n function escapeChar(chr) {\n return escape[chr];\n }\n function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string === null || string === undefined) {\n return '';\n } else if (!string) {\n return string + '';\n }\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n }\n /**\n Mark a string as safe for unescaped output with Ember templates. If you\n return HTML from a helper, use this function to\n ensure Ember's rendering layer does not escape the HTML.\n \n ```javascript\n import { htmlSafe } from '@ember/string';\n \n htmlSafe('
    someString
    ')\n ```\n \n @method htmlSafe\n @for @ember/template\n @static\n @return {Handlebars.SafeString} A string that will not be HTML escaped by Handlebars.\n @public\n */\n function htmlSafe(str) {\n if (str === null || str === undefined) {\n str = '';\n } else if (typeof str !== 'string') {\n str = '' + str;\n }\n return new SafeString(str);\n }\n /**\n Detects if a string was decorated using `htmlSafe`.\n \n ```javascript\n import { htmlSafe, isHTMLSafe } from '@ember/string';\n \n var plainString = 'plain string',\n safeString = htmlSafe('
    someValue
    ');\n \n isHTMLSafe(plainString); // false\n isHTMLSafe(safeString); // true\n ```\n \n @method isHTMLSafe\n @for @ember/template\n @static\n @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise.\n @public\n */\n function isHTMLSafe(str) {\n return str !== null && typeof str === 'object' && typeof str.toHTML === 'function';\n }\n});","enifed('@ember/-internals/glimmer/lib/utils/to-bool', ['exports', '@ember/-internals/runtime'], function (exports, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = toBool;\n function toBool(predicate) {\n if ((0, _runtime.isArray)(predicate)) {\n return predicate.length !== 0;\n } else {\n return !!predicate;\n }\n }\n});","enifed('@ember/-internals/glimmer/lib/views/outlet', ['exports', '@ember/-internals/owner', '@ember/polyfills', '@ember/runloop', '@ember/-internals/glimmer/lib/utils/outlet'], function (exports, _owner, _polyfills, _runloop, _outlet) {\n 'use strict';\n\n exports.__esModule = true;\n\n const TOP_LEVEL_NAME = '-top-level';\n const TOP_LEVEL_OUTLET = 'main';\n class OutletView {\n constructor(_environment, renderer, owner, template) {\n this._environment = _environment;\n this.renderer = renderer;\n this.owner = owner;\n this.template = template;\n let ref = this.ref = new _outlet.RootOutletReference({\n outlets: { main: undefined },\n render: {\n owner: owner,\n into: undefined,\n outlet: TOP_LEVEL_OUTLET,\n name: TOP_LEVEL_NAME,\n controller: undefined,\n template\n }\n });\n this.state = {\n ref,\n name: TOP_LEVEL_NAME,\n outlet: TOP_LEVEL_OUTLET,\n template,\n controller: undefined\n };\n }\n static extend(injections) {\n return class extends OutletView {\n static create(options) {\n if (options) {\n return super.create((0, _polyfills.assign)({}, injections, options));\n } else {\n return super.create(injections);\n }\n }\n };\n }\n static reopenClass(injections) {\n (0, _polyfills.assign)(this, injections);\n }\n static create(options) {\n let { _environment, renderer, template } = options;\n let owner = options[_owner.OWNER];\n return new OutletView(_environment, renderer, owner, template);\n }\n appendTo(selector) {\n let target;\n if (this._environment.hasDOM) {\n target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n } else {\n target = selector;\n }\n (0, _runloop.schedule)('render', this.renderer, 'appendOutletView', this, target);\n }\n rerender() {\n /**/\n }\n setOutletState(state) {\n this.ref.update(state);\n }\n destroy() {\n /**/\n }\n }\n exports.default = OutletView;\n});","enifed('@ember/-internals/glimmer/tests/integration/application/actions-test', ['@ember/controller', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/debug'], function (_controller, _testCase, _helpers, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n (0, _testCase.moduleFor)('Application test: actions', class extends _testCase.ApplicationTest {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super(...arguments);\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test actions in top level template application template target application controller'](assert) {\n assert.expect(1);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(true, 'controller received action properly');\n }\n }\n }));\n\n this.addTemplate('application', '');\n\n return this.visit('/').then(() => {\n this.runTask(() => this.$('#handle-it').click());\n });\n }\n\n ['@test actions in nested outlet template target their controller'](assert) {\n assert.expect(1);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(false, 'application controller should not have received action!');\n }\n }\n }));\n\n this.add('controller:index', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(true, 'controller received action properly');\n }\n }\n }));\n\n this.addTemplate('index', '');\n\n return this.visit('/').then(() => {\n this.runTask(() => this.$('#handle-it').click());\n });\n }\n });\n\n (0, _testCase.moduleFor)('Rendering test: non-interactive actions', class extends _testCase.RenderingTest {\n getBootOptions() {\n return { isInteractive: false };\n }\n\n [`@test doesn't attatch actions`](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n fire() {\n assert.ok(false);\n }\n }\n }),\n template: ``\n });\n\n this.render('{{foo-bar tagName=\"\"}}');\n\n this.assertHTML('');\n\n this.$('button').click();\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/engine-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/glimmer', '@ember/engine', '@ember/-internals/routing', '@ember/runloop'], function (_testCase, _abstractTestCase, _helpers, _controller, _runtime, _glimmer, _engine, _routing, _runloop) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Application test: engine rendering', class extends _testCase.ApplicationTest {\n get routerOptions() {\n return {\n location: 'none',\n setupRouter() {\n this._super(...arguments);\n let getRoute = this._routerMicrolib.getRoute;\n this._enginePromises = Object.create(null);\n this._resolvedEngines = Object.create(null);\n\n this._routerMicrolib.getRoute = name => {\n let engineInfo = this._engineInfoByRoute[name];\n if (!engineInfo) {\n return getRoute(name);\n }\n\n let engineName = engineInfo.name;\n if (this._resolvedEngines[engineName]) {\n return getRoute(name);\n }\n\n let enginePromise = this._enginePromises[engineName];\n\n if (!enginePromise) {\n enginePromise = new _runtime.RSVP.Promise(resolve => {\n setTimeout(() => {\n this._resolvedEngines[engineName] = true;\n\n resolve();\n }, 1);\n });\n this._enginePromises[engineName] = enginePromise;\n }\n\n return enginePromise.then(() => getRoute(name));\n };\n }\n };\n }\n\n setupAppAndRoutableEngine(hooks = []) {\n let self = this;\n\n this.addTemplate('application', 'Application{{outlet}}');\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {\n this.route('post', function () {\n this.route('comments');\n this.route('likes');\n });\n this.route('category', { path: 'category/:id' });\n this.route('author', { path: 'author/:id' });\n });\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('controller:application', _controller.default.extend({\n queryParams: ['lang'],\n lang: ''\n }));\n this.register('controller:category', _controller.default.extend({\n queryParams: ['type']\n }));\n this.register('controller:authorKtrl', _controller.default.extend({\n queryParams: ['official']\n }));\n this.register('template:application', (0, _helpers.compile)('Engine{{lang}}{{outlet}}'));\n this.register('route:application', _routing.Route.extend({\n model() {\n hooks.push('engine - application');\n }\n }));\n this.register('route:author', _routing.Route.extend({\n controllerName: 'authorKtrl'\n }));\n\n if (self._additionalEngineRegistrations) {\n self._additionalEngineRegistrations.call(this);\n }\n }\n }));\n }\n\n setupAppAndRoutelessEngine(hooks) {\n this.setupRoutelessEngine(hooks);\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('Engine'));\n this.register('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n setupAppAndRoutableEngineWithPartial(hooks) {\n this.addTemplate('application', 'Application{{outlet}}');\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:foo', (0, _helpers.compile)('foo partial'));\n this.register('template:application', (0, _helpers.compile)('Engine{{outlet}} {{partial \"foo\"}}'));\n this.register('route:application', _routing.Route.extend({\n model() {\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n setupRoutelessEngine(hooks) {\n this.addTemplate('application', 'Application{{mount \"chat-engine\"}}');\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n }\n\n setupAppAndRoutlessEngineWithPartial(hooks) {\n this.setupRoutelessEngine(hooks);\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:foo', (0, _helpers.compile)('foo partial'));\n this.register('template:application', (0, _helpers.compile)('Engine {{partial \"foo\"}}'));\n this.register('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n additionalEngineRegistrations(callback) {\n this._additionalEngineRegistrations = callback;\n }\n\n setupEngineWithAttrs() {\n this.addTemplate('application', 'Application{{mount \"chat-engine\"}}');\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:components/foo-bar', (0, _helpers.compile)(`{{partial \"troll\"}}`));\n this.register('template:troll', (0, _helpers.compile)('{{attrs.wat}}'));\n this.register('controller:application', _controller.default.extend({\n contextType: 'Engine'\n }));\n this.register('template:application', (0, _helpers.compile)('Engine {{foo-bar wat=contextType}}'));\n }\n }));\n }\n\n stringsEndWith(str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n }\n\n ['@test attrs in an engine']() {\n this.setupEngineWithAttrs([]);\n\n return this.visit('/').then(() => {\n this.assertText('ApplicationEngine Engine');\n });\n }\n\n ['@test sharing a template between engine and application has separate refinements']() {\n this.assert.expect(1);\n\n let sharedTemplate = (0, _helpers.compile)(_abstractTestCase.strip`\n

    {{contextType}}

    \n {{ambiguous-curlies}}\n\n {{outlet}}\n `);\n\n this.add('template:application', sharedTemplate);\n this.add('controller:application', _controller.default.extend({\n contextType: 'Application',\n 'ambiguous-curlies': 'Controller Data!'\n }));\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n\n this.register('controller:application', _controller.default.extend({\n contextType: 'Engine'\n }));\n this.register('template:application', sharedTemplate);\n this.register('template:components/ambiguous-curlies', (0, _helpers.compile)(_abstractTestCase.strip`\n

    Component!

    \n `));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationController Data!EngineComponent!');\n });\n }\n\n ['@test sharing a layout between engine and application has separate refinements']() {\n this.assert.expect(1);\n\n let sharedLayout = (0, _helpers.compile)(_abstractTestCase.strip`\n {{ambiguous-curlies}}\n `);\n\n let sharedComponent = _glimmer.Component.extend({\n layout: sharedLayout\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n

    Application

    \n {{my-component ambiguous-curlies=\"Local Data!\"}}\n {{outlet}}\n `);\n\n this.add('component:my-component', sharedComponent);\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)(_abstractTestCase.strip`\n

    Engine

    \n {{my-component}}\n {{outlet}}\n `));\n this.register('component:my-component', sharedComponent);\n this.register('template:components/ambiguous-curlies', (0, _helpers.compile)(_abstractTestCase.strip`\n

    Component!

    \n `));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationLocal Data!EngineComponent!');\n });\n }\n\n ['@test visit() with `shouldRender: true` returns a promise that resolves when application and engine templates have rendered'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected model hooks were fired');\n });\n }\n\n ['@test visit() with `shouldRender: false` returns a promise that resolves without rendering'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/blog', { shouldRender: false }).then(() => {\n assert.strictEqual(document.getElementById('qunit-fixture').children.length, 0, `there are no elements in the qunit-fixture element`);\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected model hooks were fired');\n });\n }\n\n ['@test visit() with `shouldRender: true` returns a promise that resolves when application and routeless engine templates have rendered'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutelessEngine(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test visit() with partials in routable engine'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngineWithPartial(hooks);\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine foo partial');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test visit() with partials in non-routable engine'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutlessEngineWithPartial(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine foo partial');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test deactivate should be called on Engine Routes before destruction'](assert) {\n assert.expect(3);\n\n this.setupAppAndRoutableEngine();\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('Engine{{outlet}}'));\n this.register('route:application', _routing.Route.extend({\n deactivate() {\n assert.notOk(this.isDestroyed, 'Route is not destroyed');\n assert.notOk(this.isDestroying, 'Route is not being destroyed');\n }\n }));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationEngine');\n });\n }\n\n ['@test engine should lookup and use correct controller']() {\n this.setupAppAndRoutableEngine();\n\n return this.visit('/blog?lang=English').then(() => {\n this.assertText('ApplicationEngineEnglish');\n });\n }\n\n ['@test error substate route works for the application route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:application_error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:application_error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationError! Oh, noes!');\n });\n }\n\n ['@test error route works for the application route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test error substate route works for a child route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:post_error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:post_error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test error route works for a child route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:post.error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:post.error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post.comments', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post.comments');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test loading substate route works for the application route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:application_loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:application_loading', (0, _helpers.compile)('Loading'));\n this.register('template:post', (0, _helpers.compile)('Post'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n let transition = this.transitionTo('blog.post');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEnginePost');\n done();\n });\n });\n\n return transition;\n });\n }\n\n ['@test loading route works for the application route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:loading', (0, _helpers.compile)('Loading'));\n this.register('template:post', (0, _helpers.compile)('Post'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n let transition = this.transitionTo('blog.post');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEnginePost');\n done();\n });\n });\n\n return transition;\n });\n }\n\n ['@test loading substate route works for a child route of an Engine'](assert) {\n assert.expect(3);\n\n let resolveLoading;\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:post', (0, _helpers.compile)('{{outlet}}'));\n this.register('template:post.comments', (0, _helpers.compile)('Comments'));\n this.register('template:post.likes_loading', (0, _helpers.compile)('Loading'));\n this.register('template:post.likes', (0, _helpers.compile)('Likes'));\n this.register('route:post.likes', _routing.Route.extend({\n model() {\n return new _runtime.RSVP.Promise(resolve => {\n resolveLoading = resolve;\n });\n }\n }));\n });\n\n return this.visit('/blog/post/comments').then(() => {\n this.assertText('ApplicationEngineComments');\n let transition = this.transitionTo('blog.post.likes');\n\n this.runTaskNext().then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading();\n });\n\n return transition.then(() => this.runTaskNext()).then(() => this.assertText('ApplicationEngineLikes'));\n });\n }\n\n ['@test loading route works for a child route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:post', (0, _helpers.compile)('{{outlet}}'));\n this.register('template:post.comments', (0, _helpers.compile)('Comments'));\n this.register('route:post.loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:post.loading', (0, _helpers.compile)('Loading'));\n this.register('template:post.likes', (0, _helpers.compile)('Likes'));\n this.register('route:post.likes', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/blog/post/comments').then(() => {\n this.assertText('ApplicationEngineComments');\n let transition = this.transitionTo('blog.post.likes');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEngineLikes');\n done();\n });\n });\n\n return transition;\n });\n }\n\n [\"@test query params don't have stickiness by default between model\"](assert) {\n assert.expect(1);\n let tmpl = '{{#link-to \"blog.category\" 1337}}Category 1337{{/link-to}}';\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:category', (0, _helpers.compile)(tmpl));\n });\n\n return this.visit('/blog/category/1?type=news').then(() => {\n let suffix = '/blog/category/1337';\n let href = this.element.querySelector('a').href;\n\n // check if link ends with the suffix\n assert.ok(this.stringsEndWith(href, suffix));\n });\n }\n\n ['@test query params in customized controllerName have stickiness by default between model'](assert) {\n assert.expect(2);\n let tmpl = '{{#link-to \"blog.author\" 1337 class=\"author-1337\"}}Author 1337{{/link-to}}{{#link-to \"blog.author\" 1 class=\"author-1\"}}Author 1{{/link-to}}';\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:author', (0, _helpers.compile)(tmpl));\n });\n\n return this.visit('/blog/author/1?official=true').then(() => {\n let suffix1 = '/blog/author/1?official=true';\n let href1 = this.element.querySelector('.author-1').href;\n let suffix1337 = '/blog/author/1337';\n let href1337 = this.element.querySelector('.author-1337').href;\n\n // check if link ends with the suffix\n assert.ok(this.stringsEndWith(href1, suffix1), `${href1} ends with ${suffix1}`);\n assert.ok(this.stringsEndWith(href1337, suffix1337), `${href1337} ends with ${suffix1337}`);\n });\n }\n\n ['@test visit() routable engine which errors on init'](assert) {\n assert.expect(1);\n\n let hooks = [];\n\n this.additionalEngineRegistrations(function () {\n this.register('route:application', _routing.Route.extend({\n init() {\n throw new Error('Whoops! Something went wrong...');\n }\n }));\n });\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n return this.visit('/blog');\n }).catch(error => {\n assert.equal(error.message, 'Whoops! Something went wrong...');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/hot-reload-test', ['@ember/-internals/environment', '@ember/service', '@ember/-internals/glimmer', '@glimmer/util', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_environment, _service, _glimmer, _util, _testCase, _abstractTestCase) {\n 'use strict';\n\n // This simuates what the template hot-reloading would do in development mode\n // to avoid regressions\n\n (0, _testCase.moduleFor)('Appliation test: template hot reloading', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n this._APPLICATION_TEMPLATE_WRAPPER = _environment.ENV._APPLICATION_TEMPLATE_WRAPPER;\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;\n\n let didCreateReloader = reloader => {\n this.reloader = reloader;\n };\n\n this.add('service:reloader', _service.default.extend({\n init() {\n this._super(...arguments);\n this.revisions = {};\n this.callbacks = [];\n\n didCreateReloader(this);\n },\n\n onReload(callback) {\n this.callbacks.push(callback);\n },\n\n revisionFor(name) {\n return this.revisions[name];\n },\n\n invalidate(name) {\n let revision = this.revisions[name];\n\n if (revision === undefined) {\n revision = 0;\n }\n\n this.revisions[name] = ++revision;\n\n this.callbacks.forEach(callback => callback());\n }\n }));\n\n this.add('helper:hot-reload', _glimmer.Helper.extend({\n reloader: (0, _service.inject)(),\n\n init() {\n this._super(...arguments);\n this.reloader.onReload(() => this.recompute());\n },\n\n compute([name]) {\n let revision = this.reloader.revisionFor(name);\n\n if (revision === undefined) {\n return name;\n } else {\n return `${name}--hot-reload-${revision}`;\n }\n }\n }));\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = this._APPLICATION_TEMPLATE_WRAPPER;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n hotReload(name, template) {\n let reloader = (0, _util.expect)(this.reloader);\n let revision = (reloader.revisionFor(name) || 0) + 1;\n let ComponentClass = this.applicationInstance.resolveRegistration(`component:${name}`) || null;\n\n this.addComponent(`${name}--hot-reload-${revision}`, {\n ComponentClass,\n template\n });\n\n reloader.invalidate(name);\n }\n\n ['@test hot reloading template-only components']() {\n this.addTemplate('application', _abstractTestCase.strip`\n [{{component (hot-reload \"x-foo\") name=\"first\"}}]\n [{{component (hot-reload \"x-foo\") name=\"second\"}}]\n [{{component (hot-reload \"x-bar\")}}]\n `);\n\n this.addComponent('x-foo', {\n ComponentClass: null,\n template: 'x-foo: {{@name}}'\n });\n\n this.addComponent('x-bar', {\n ComponentClass: null,\n template: 'x-bar'\n });\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first]\n [x-foo: second]\n [x-bar]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', '

    {{@name}}

    ');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

    first

    ]\n [

    second

    ]\n [x-bar]\n `);\n\n this.runTask(() => {\n this.hotReload('x-bar', '

    wow

    ');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

    first

    ]\n [

    second

    ]\n [

    wow

    ]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo {{@name}}');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo first]\n [x-foo second]\n [

    wow

    ]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo: {{@name}}');\n this.hotReload('x-bar', 'x-bar');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first]\n [x-foo: second]\n [x-bar]\n `);\n });\n }\n\n ['@test hot reloading class-based components']() {\n this.addTemplate('application', _abstractTestCase.strip`\n [{{component (hot-reload \"x-foo\") name=\"first\"}}]\n [{{component (hot-reload \"x-foo\") name=\"second\"}}]\n [{{component (hot-reload \"x-bar\")}}]\n `);\n\n let id = 0;\n\n this.addComponent('x-foo', {\n ComponentClass: _glimmer.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n this.set('id', id++);\n }\n }),\n template: 'x-foo: {{@name}} ({{this.id}})'\n });\n\n this.addComponent('x-bar', {\n ComponentClass: _glimmer.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n this.set('id', id++);\n }\n }),\n template: 'x-bar ({{this.id}})'\n });\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first (0)]\n [x-foo: second (1)]\n [x-bar (2)]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', '

    {{@name}} ({{this.id}})

    ');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

    first (3)

    ]\n [

    second (4)

    ]\n [x-bar (2)]\n `);\n\n this.runTask(() => {\n this.hotReload('x-bar', '

    wow ({{this.id}})

    ');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

    first (3)

    ]\n [

    second (4)

    ]\n [

    wow (5)

    ]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo {{@name}} ({{this.id}})');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo first (6)]\n [x-foo second (7)]\n [

    wow (5)

    ]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo: {{@name}} ({{this.id}})');\n this.hotReload('x-bar', 'x-bar ({{this.id}})');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first (8)]\n [x-foo: second (9)]\n [x-bar (10)]\n `);\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/rendering-test', ['@ember/-internals/environment', '@ember/controller', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/routing', '@ember/-internals/glimmer'], function (_environment, _controller, _testCase, _abstractTestCase, _routing, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Application test: rendering', class extends _testCase.ApplicationTest {\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 it can render the application template with a wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = true;\n\n this.addTemplate('application', 'Hello world!');\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.element, { content: 'Hello world!' });\n });\n }\n\n ['@test it can render the application template without a wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\n this.addTemplate('application', 'Hello world!');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello world!');\n });\n }\n\n ['@test it can access the model provided by the route']() {\n this.add('route:application', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('application', _abstractTestCase.strip`\n
      \n {{#each model as |item|}}\n
    • {{item}}
    • \n {{/each}}\n
    \n `);\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n
      \n
    • red
    • \n
    • yellow
    • \n
    • blue
    • \n
    \n `);\n });\n }\n\n ['@test it can render a nested route']() {\n this.router.map(function () {\n this.route('lists', function () {\n this.route('colors', function () {\n this.route('favorite');\n });\n });\n });\n\n // The \"favorite\" route will inherit the model\n this.add('route:lists.colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('lists.colors.favorite', _abstractTestCase.strip`\n
      \n {{#each model as |item|}}\n
    • {{item}}
    • \n {{/each}}\n
    \n `);\n\n return this.visit('/lists/colors/favorite').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n
      \n
    • red
    • \n
    • yellow
    • \n
    • blue
    • \n
    \n `);\n });\n }\n\n ['@test it can render into named outlets']() {\n this.router.map(function () {\n this.route('colors');\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n \n
    {{outlet}}
    \n `);\n\n this.addTemplate('nav', _abstractTestCase.strip`\n Ember\n `);\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('nav', {\n into: 'application',\n outlet: 'nav'\n });\n }\n }));\n\n this.add('route:colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('colors', _abstractTestCase.strip`\n
      \n {{#each model as |item|}}\n
    • {{item}}
    • \n {{/each}}\n
    \n `);\n\n return this.visit('/colors').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n
    \n
      \n
    • red
    • \n
    • yellow
    • \n
    • blue
    • \n
    \n
    \n `);\n });\n }\n\n ['@test it can render into named outlets']() {\n this.router.map(function () {\n this.route('colors');\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n \n
    {{outlet}}
    \n `);\n\n this.addTemplate('nav', _abstractTestCase.strip`\n Ember\n `);\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('nav', {\n into: 'application',\n outlet: 'nav'\n });\n }\n }));\n\n this.add('route:colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('colors', _abstractTestCase.strip`\n
      \n {{#each model as |item|}}\n
    • {{item}}
    • \n {{/each}}\n
    \n `);\n\n return this.visit('/colors').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n
    \n
      \n
    • red
    • \n
    • yellow
    • \n
    • blue
    • \n
    \n
    \n `);\n });\n }\n\n ['@test it should update the outlets when switching between routes']() {\n this.router.map(function () {\n this.route('a');\n this.route('b', function () {\n this.route('c');\n this.route('d');\n });\n });\n\n this.addTemplate('a', 'A{{outlet}}');\n this.addTemplate('b', 'B{{outlet}}');\n this.addTemplate('b.c', 'C');\n this.addTemplate('b.d', 'D');\n\n return this.visit('/b/c').then(() => {\n // this.assertComponentElement(this.firstChild, { content: 'BC' });\n this.assertText('BC');\n return this.visit('/a');\n }).then(() => {\n // this.assertComponentElement(this.firstChild, { content: 'A' });\n this.assertText('A');\n return this.visit('/b/d');\n }).then(() => {\n this.assertText('BD');\n // this.assertComponentElement(this.firstChild, { content: 'BD' });\n });\n }\n\n ['@test it should produce a stable DOM when the model changes']() {\n this.router.map(function () {\n this.route('color', { path: '/colors/:color' });\n });\n\n this.add('route:color', _routing.Route.extend({\n model(params) {\n return params.color;\n }\n }));\n\n this.addTemplate('color', 'color: {{model}}');\n\n return this.visit('/colors/red').then(() => {\n this.assertInnerHTML('color: red');\n this.takeSnapshot();\n return this.visit('/colors/green');\n }).then(() => {\n this.assertInnerHTML('color: green');\n this.assertInvariants();\n });\n }\n\n ['@test it should have the right controller in scope for the route template']() {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n });\n\n this.add('controller:a', _controller.default.extend({\n value: 'a'\n }));\n\n this.add('controller:b', _controller.default.extend({\n value: 'b'\n }));\n\n this.addTemplate('a', '{{value}}');\n this.addTemplate('b', '{{value}}');\n\n return this.visit('/a').then(() => {\n this.assertText('a');\n return this.visit('/b');\n }).then(() => this.assertText('b'));\n }\n\n ['@test it should update correctly when the controller changes']() {\n this.router.map(function () {\n this.route('color', { path: '/colors/:color' });\n });\n\n this.add('route:color', _routing.Route.extend({\n model(params) {\n return { color: params.color };\n },\n\n renderTemplate(controller, model) {\n this.render({ controller: model.color, model });\n }\n }));\n\n this.add('controller:red', _controller.default.extend({\n color: 'red'\n }));\n\n this.add('controller:green', _controller.default.extend({\n color: 'green'\n }));\n\n this.addTemplate('color', 'model color: {{model.color}}, controller color: {{color}}');\n\n return this.visit('/colors/red').then(() => {\n this.assertInnerHTML('model color: red, controller color: red');\n return this.visit('/colors/green');\n }).then(() => {\n this.assertInnerHTML('model color: green, controller color: green');\n });\n }\n\n ['@test it should produce a stable DOM when two routes render the same template']() {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n });\n\n this.add('route:a', _routing.Route.extend({\n model() {\n return 'A';\n },\n\n renderTemplate(controller, model) {\n this.render('common', { controller: 'common', model });\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n model() {\n return 'B';\n },\n\n renderTemplate(controller, model) {\n this.render('common', { controller: 'common', model });\n }\n }));\n\n this.add('controller:common', _controller.default.extend({\n prefix: 'common'\n }));\n\n this.addTemplate('common', '{{prefix}} {{model}}');\n\n return this.visit('/a').then(() => {\n this.assertInnerHTML('common A');\n this.takeSnapshot();\n return this.visit('/b');\n }).then(() => {\n this.assertInnerHTML('common B');\n this.assertInvariants();\n });\n }\n\n // Regression test, glimmer child outlets tried to assume the first element.\n // but the if put-args clobbered the args used by did-create-element.\n // I wish there was a way to assert that the OutletComponentManager did not\n // receive a didCreateElement.\n ['@test a child outlet is always a fragment']() {\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', '{{#if true}}1{{/if}}
    2
    ');\n return this.visit('/').then(() => {\n this.assertInnerHTML('1
    2
    ');\n });\n }\n\n ['@test it allows a transition during route activate']() {\n this.router.map(function () {\n this.route('a');\n });\n\n this.add('route:index', _routing.Route.extend({\n activate() {\n this.transitionTo('a');\n }\n }));\n\n this.addTemplate('a', 'Hello from A!');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello from A!');\n });\n }\n\n ['@test it emits a useful backtracking re-render assertion message']() {\n this.router.map(function () {\n this.route('routeWithError');\n });\n\n this.add('route:routeWithError', _routing.Route.extend({\n model() {\n return { name: 'Alex' };\n }\n }));\n\n this.addTemplate('routeWithError', 'Hi {{model.name}} {{x-foo person=model}}');\n\n this.addComponent('x-foo', {\n ComponentClass: _glimmer.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person.name', 'Ben');\n }\n }),\n template: 'Hi {{person.name}} from component'\n });\n\n let expectedBacktrackingMessage = /modified \"model\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"template:my-app\\/templates\\/routeWithError.hbs\" and modified in \"component:x-foo\"/;\n\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/routeWithError');\n }, expectedBacktrackingMessage);\n });\n }\n\n ['@test route templates with {{{undefined}}} [GH#14924] [GH#16172]']() {\n this.router.map(function () {\n this.route('first');\n this.route('second');\n });\n\n this.addTemplate('first', 'first');\n this.addTemplate('second', '{{{undefined}}}second');\n\n return this.visit('/first').then(() => {\n this.assertText('first');\n return this.visit('/second');\n }).then(() => {\n this.assertText('second');\n return this.visit('/first');\n }).then(() => {\n this.assertText('first');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test', ['@ember/canary-features', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_canaryFeatures, _testCase, _metal, _helpers, _abstractTestCase, _testHelpers) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) {\n (0, _testCase.moduleFor)('AngleBracket Invocation', class extends _testCase.RenderingTest {\n '@test it can resolve to x-blah'() {\n this.registerComponent('x-blah', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can resolve to x-blah'() {\n this.registerComponent('x-blah', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can render a basic template only component'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can render a basic component with template and javascript'() {\n this.registerComponent('foo-bar', {\n template: 'FIZZ BAR {{local}}',\n ComponentClass: _helpers.Component.extend({ local: 'hey' })\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'FIZZ BAR hey' });\n }\n\n '@test it can render a single word component name'() {\n this.registerComponent('foo', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can not render a component name without initial capital letter'(assert) {\n this.registerComponent('div', {\n ComponentClass: _helpers.Component.extend({\n init() {\n assert.ok(false, 'should not have created component');\n }\n })\n });\n\n this.render('
    ');\n\n this.assertElement(this.firstChild, { tagName: 'div', content: '' });\n }\n\n '@test it can have a custom id and it is not bound'() {\n this.registerComponent('foo-bar', { template: '{{id}} {{elementId}}' });\n\n this.render('', {\n customId: 'bizz'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bar bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bizz'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n }\n\n '@test it can have a custom tagName'() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n '@test it can have a custom tagName from the invocation'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n '@test it can have custom classNames'() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n }\n\n '@test class property on components can be dynamic'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('', {\n fooBar: true\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n }\n\n '@test it can set custom classNames from the invocation'() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n \n \n \n `);\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n '@test it has an element'() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n '@test it has the right parentView and childViews'(assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n '@test it renders passed named arguments'() {\n this.registerComponent('foo-bar', {\n template: '{{@foo}}'\n });\n\n this.render('', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n '@test it reflects named arguments as properties'() {\n this.registerComponent('foo-bar', {\n template: '{{foo}}'\n });\n\n this.render('', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n '@test it can render a basic component with a block'() {\n this.registerComponent('foo-bar', {\n template: '{{yield}} - In component'\n });\n\n this.render('hello');\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n }\n\n '@test it can yield internal and external properties positionally'() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n greeting: 'hello'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield greeting greetee.firstName}}'\n });\n\n this.render('{{name}} {{person.lastName}}, {{greeting}}', {\n person: {\n firstName: 'Joel',\n lastName: 'Kang'\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'Dora',\n lastName: 'the Explorer'\n }));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hello'\n });\n\n this.runTask(() => (0, _metal.set)(instance, 'greeting', 'hola'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hola'\n });\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'greeting', 'hello');\n (0, _metal.set)(this.context, 'person', {\n firstName: 'Joel',\n lastName: 'Kang'\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n }\n\n '@test positional parameters are not allowed'() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['first', 'second']\n }),\n template: '{{first}}{{second}}'\n });\n\n // this is somewhat silly as the browser \"corrects\" for these as\n // attribute names, but regardless the thing we care about here is that\n // they are **not** used as positional params\n this.render('');\n\n this.assertText('');\n }\n\n '@test can invoke curried components with capitalized block param names'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render(_abstractTestCase.strip`\n {{#with (component 'foo-bar') as |Other|}}\n \n {{/with}}\n `);\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can invoke curried components with named args'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.registerComponent('test-harness', { template: '<@foo />' });\n this.render(_abstractTestCase.strip`{{test-harness foo=(component 'foo-bar')}}`);\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can invoke curried components with a path'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.registerComponent('test-harness', { template: '' });\n this.render(_abstractTestCase.strip`{{test-harness foo=(component 'foo-bar')}}`);\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can not invoke curried components with an implicit `this` path'(assert) {\n assert.expect(0);\n this.registerComponent('foo-bar', {\n template: 'hello',\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n assert.ok(false, 'should not have instantiated');\n }\n })\n });\n this.registerComponent('test-harness', {\n template: ''\n });\n this.render(_abstractTestCase.strip`{{test-harness foo=(hash bar=(component 'foo-bar'))}}`);\n }\n\n '@test has-block'() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (has-block)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n \n `);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n '@test includes invocation specified attributes in root element (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend(),\n template: 'hello'\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test includes invocation specified attributes in `...attributes` slot in tagless component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
    hello
    '\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test merges attributes with `...attributes` in tagless component (\"splattributes\")'() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n instance = this;\n this._super(...arguments);\n this.localProp = 'qux';\n }\n }),\n template: '
    hello
    '\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n (0, _metal.set)(instance, 'localProp', 'QUZ');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'QUZ', 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n (0, _metal.set)(instance, 'localProp', 'qux');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test merges class attribute with `...attributes` in tagless component (\"splattributes\")'() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n instance = this;\n this._super(...arguments);\n this.localProp = 'qux';\n }\n }),\n template: '
    hello
    '\n });\n\n this.render('', { bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', undefined);\n (0, _metal.set)(instance, 'localProp', 'QUZ');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('QUZ') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', 'bar');\n (0, _metal.set)(instance, 'localProp', 'qux');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n }\n\n '@test merges class attribute with `...attributes` in yielded contextual component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '{{yield (hash baz=(component \"foo-bar/baz\"))}}'\n });\n this.registerComponent('foo-bar/baz', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
    hello
    '\n });\n\n this.render('');\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('default-class custom-class'), title: 'foo' },\n content: 'hello'\n });\n }\n\n '@test the attributes passed on invocation trump over the default ones on elements with `...attributes` in yielded contextual component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '{{yield (hash baz=(component \"foo-bar/baz\"))}}'\n });\n this.registerComponent('foo-bar/baz', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
    hello
    '\n });\n\n this.render('');\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'foo' },\n content: 'hello'\n });\n }\n\n '@test can include `...attributes` in multiple elements in tagless component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
    hello

    world

    '\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'FOO' },\n content: 'world'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/append-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_metal, _testCase, _helpers, _abstractTestCase) {\n 'use strict';\n\n class AbstractAppendTest extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.components = [];\n this.ids = [];\n }\n\n teardown() {\n this.component = null;\n\n this.components.forEach(component => {\n this.runTask(() => component.destroy());\n });\n\n this.ids.forEach(id => {\n let $element = document.getElementById(id);\n if ($element) {\n $element.parentNode.removeChild($element);\n }\n // this.assert.strictEqual($element.length, 0, `Should not leak element: #${id}`);\n });\n\n super.teardown();\n }\n\n /* abstract append(component): Element; */\n\n didAppend(component) {\n this.components.push(component);\n this.ids.push(component.elementId);\n }\n\n ['@test lifecycle hooks during component append'](assert) {\n let hooks = [];\n\n let oldRegisterComponent = this.registerComponent;\n let componentsByName = {};\n\n // TODO: refactor/combine with other life-cycle tests\n this.registerComponent = function (name, _options) {\n function pushHook(hookName) {\n hooks.push([name, hookName]);\n }\n\n let options = {\n ComponentClass: _options.ComponentClass.extend({\n init() {\n this._super(...arguments);\n if (name in componentsByName) {\n throw new TypeError('Component named: ` ' + name + ' ` already registered');\n }\n componentsByName[name] = this;\n pushHook('init');\n this.on('init', () => pushHook('on(init)'));\n },\n\n didReceiveAttrs() {\n pushHook('didReceiveAttrs');\n },\n\n willInsertElement() {\n pushHook('willInsertElement');\n },\n\n willRender() {\n pushHook('willRender');\n },\n\n didInsertElement() {\n pushHook('didInsertElement');\n },\n\n didRender() {\n pushHook('didRender');\n },\n\n didUpdateAttrs() {\n pushHook('didUpdateAttrs');\n },\n\n willUpdate() {\n pushHook('willUpdate');\n },\n\n didUpdate() {\n pushHook('didUpdate');\n },\n\n willDestroyElement() {\n pushHook('willDestroyElement');\n },\n\n willClearRender() {\n pushHook('willClearRender');\n },\n\n didDestroyElement() {\n pushHook('didDestroyElement');\n },\n\n willDestroy() {\n pushHook('willDestroy');\n this._super(...arguments);\n }\n }),\n template: _options.template\n };\n\n oldRegisterComponent.call(this, name, options);\n };\n\n this.registerComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-parent'\n }),\n\n template: '[parent: {{foo}}]{{#x-child bar=foo}}[yielded: {{foo}}]{{/x-child}}'\n });\n\n this.registerComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '[child: {{bar}}]{{yield}}'\n });\n\n let XParent;\n\n XParent = this.owner.factoryFor('component:x-parent');\n\n this.component = XParent.create({ foo: 'zomg' });\n\n assert.deepEqual(hooks, [['x-parent', 'init'], ['x-parent', 'on(init)']], 'creation of x-parent');\n\n hooks.length = 0;\n\n this.element = this.append(this.component);\n\n assert.deepEqual(hooks, [['x-parent', 'willInsertElement'], ['x-child', 'init'], ['x-child', 'on(init)'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willRender'], ['x-child', 'willInsertElement'], ['x-child', 'didInsertElement'], ['x-child', 'didRender'], ['x-parent', 'didInsertElement'], ['x-parent', 'didRender']], 'appending of x-parent');\n\n hooks.length = 0;\n\n this.runTask(() => componentsByName['x-parent'].rerender());\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'rerender x-parent');\n\n hooks.length = 0;\n\n this.runTask(() => componentsByName['x-child'].rerender());\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'rerender x-child');\n\n hooks.length = 0;\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'wow'));\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'didUpdateAttrs'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'set foo = wow');\n\n hooks.length = 0;\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'zomg'));\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'didUpdateAttrs'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'set foo = zomg');\n\n hooks.length = 0;\n\n this.runTask(() => this.component.destroy());\n\n assert.deepEqual(hooks, [['x-parent', 'willDestroyElement'], ['x-parent', 'willClearRender'], ['x-child', 'willDestroyElement'], ['x-child', 'willClearRender'], ['x-child', 'didDestroyElement'], ['x-parent', 'didDestroyElement'], ['x-parent', 'willDestroy'], ['x-child', 'willDestroy']], 'destroy');\n }\n\n ['@test appending, updating and destroying a single component'](assert) {\n let willDestroyCalled = 0;\n\n this.registerComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-parent',\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: '[parent: {{foo}}]{{#x-child bar=foo}}[yielded: {{foo}}]{{/x-child}}'\n });\n\n this.registerComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '[child: {{bar}}]{{yield}}'\n });\n\n let XParent;\n\n XParent = this.owner.factoryFor('component:x-parent');\n\n this.component = XParent.create({ foo: 'zomg' });\n\n assert.ok(!this.component.element, 'precond - should not have an element');\n\n this.element = this.append(this.component);\n\n let componentElement = this.component.element;\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'wow'));\n\n this.assertComponentElement(componentElement, {\n content: '[parent: wow][child: wow][yielded: wow]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'zomg'));\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => this.component.destroy());\n\n assert.ok(!this.component.element, 'It should not have an element');\n assert.ok(!componentElement.parentElement, 'The component element should be detached');\n\n this.assert.equal(willDestroyCalled, 1);\n }\n\n ['@test releasing a root component after it has been destroy'](assert) {\n let renderer = this.owner.lookup('renderer:-dom');\n\n this.registerComponent('x-component', {\n ComponentClass: _helpers.Component.extend()\n });\n\n this.component = this.owner.factoryFor('component:x-component').create();\n this.append(this.component);\n\n assert.equal(renderer._roots.length, 1, 'added a root component');\n\n this.runTask(() => this.component.destroy());\n\n assert.equal(renderer._roots.length, 0, 'released the root component');\n }\n\n ['@test appending, updating and destroying multiple components'](assert) {\n let willDestroyCalled = 0;\n\n this.registerComponent('x-first', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-first',\n\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: 'x-first {{foo}}!'\n });\n\n this.registerComponent('x-second', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-second',\n\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: 'x-second {{bar}}!'\n });\n\n let First, Second;\n\n First = this.owner.factoryFor('component:x-first');\n Second = this.owner.factoryFor('component:x-second');\n\n let first = First.create({ foo: 'foo' });\n let second = Second.create({ bar: 'bar' });\n\n this.assert.ok(!first.element, 'precond - should not have an element');\n this.assert.ok(!second.element, 'precond - should not have an element');\n\n let wrapper1, wrapper2;\n\n this.runTask(() => wrapper1 = this.append(first));\n this.runTask(() => wrapper2 = this.append(second));\n\n let componentElement1 = first.element;\n let componentElement2 = second.element;\n\n this.assertComponentElement(componentElement1, { content: 'x-first foo!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(first, 'foo', 'FOO'));\n\n this.assertComponentElement(componentElement1, { content: 'x-first FOO!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(second, 'bar', 'BAR'));\n\n this.assertComponentElement(componentElement1, { content: 'x-first FOO!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second BAR!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => {\n (0, _metal.set)(first, 'foo', 'foo');\n (0, _metal.set)(second, 'bar', 'bar');\n });\n\n this.assertComponentElement(componentElement1, { content: 'x-first foo!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => {\n first.destroy();\n second.destroy();\n });\n\n assert.ok(!first.element, 'The first component should not have an element');\n assert.ok(!second.element, 'The second component should not have an element');\n\n assert.ok(!componentElement1.parentElement, 'The first component element should be detached');\n assert.ok(!componentElement2.parentElement, 'The second component element should be detached');\n\n this.assert.equal(willDestroyCalled, 2);\n }\n\n ['@test can appendTo while rendering']() {\n let owner = this.owner;\n\n let append = component => {\n return this.append(component);\n };\n\n let element1, element2;\n this.registerComponent('first-component', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('component-one'),\n\n didInsertElement() {\n element1 = this.element;\n\n let SecondComponent = owner.factoryFor('component:second-component');\n\n append(SecondComponent.create());\n }\n })\n });\n\n this.registerComponent('second-component', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)(`component-two`),\n\n didInsertElement() {\n element2 = this.element;\n }\n })\n });\n\n let FirstComponent = this.owner.factoryFor('component:first-component');\n\n this.runTask(() => append(FirstComponent.create()));\n\n this.assertComponentElement(element1, { content: 'component-one' });\n this.assertComponentElement(element2, { content: 'component-two' });\n }\n\n ['@test can appendTo and remove while rendering'](assert) {\n let owner = this.owner;\n\n let append = component => {\n return this.append(component);\n };\n\n let element1, element2, element3, element4, component1, component2;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('foo-bar'),\n\n init() {\n this._super(...arguments);\n component1 = this;\n },\n\n didInsertElement() {\n element1 = this.element;\n\n let OtherRoot = owner.factoryFor('component:other-root');\n\n this._instance = OtherRoot.create({\n didInsertElement() {\n element2 = this.element;\n }\n });\n\n append(this._instance);\n },\n\n willDestroy() {\n this._instance.destroy();\n }\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('baz-qux'),\n\n init() {\n this._super(...arguments);\n component2 = this;\n },\n\n didInsertElement() {\n element3 = this.element;\n\n let OtherRoot = owner.factoryFor('component:other-root');\n\n this._instance = OtherRoot.create({\n didInsertElement() {\n element4 = this.element;\n }\n });\n\n append(this._instance);\n },\n\n willDestroy() {\n this._instance.destroy();\n }\n })\n });\n\n let instantiatedRoots = 0;\n let destroyedRoots = 0;\n this.registerComponent('other-root', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)(`fake-thing: {{counter}}`),\n init() {\n this._super(...arguments);\n this.counter = instantiatedRoots++;\n },\n willDestroy() {\n destroyedRoots++;\n this._super(...arguments);\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if showFooBar}}\n {{foo-bar}}\n {{else}}\n {{baz-qux}}\n {{/if}}\n `, { showFooBar: true });\n\n this.assertComponentElement(element1, {});\n this.assertComponentElement(element2, { content: 'fake-thing: 0' });\n assert.equal(instantiatedRoots, 1);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'showFooBar', false));\n\n assert.equal(instantiatedRoots, 2);\n assert.equal(destroyedRoots, 1);\n\n this.assertComponentElement(element3, {});\n this.assertComponentElement(element4, { content: 'fake-thing: 1' });\n\n this.runTask(() => {\n component1.destroy();\n component2.destroy();\n });\n\n assert.equal(instantiatedRoots, 2);\n assert.equal(destroyedRoots, 2);\n }\n }\n\n (0, _testCase.moduleFor)('append: no arguments (attaching to document.body)', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.append());\n this.didAppend(component);\n return document.body;\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: a selector', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.appendTo('#qunit-fixture'));\n this.didAppend(component);\n return document.getElementById('qunit-fixture');\n }\n\n ['@test raises an assertion when the target does not exist in the DOM'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/foo-bar'\n }),\n template: 'FOO BAR!'\n });\n\n let FooBar = this.owner.factoryFor('component:foo-bar');\n\n this.component = FooBar.create();\n\n assert.ok(!this.component.element, 'precond - should not have an element');\n\n this.runTask(() => {\n expectAssertion(() => {\n this.component.appendTo('#does-not-exist-in-dom');\n }, /You tried to append to \\(#does-not-exist-in-dom\\) but that isn't in the DOM/);\n });\n\n assert.ok(!this.component.element, 'component should not have an element');\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: an element', class extends AbstractAppendTest {\n append(component) {\n let element = document.getElementById('qunit-fixture');\n this.runTask(() => component.appendTo(element));\n this.didAppend(component);\n return element;\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: with multiple components', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.appendTo('#qunit-fixture'));\n this.didAppend(component);\n return document.getElementById('qunit-fixture');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/attribute-bindings-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal'], function (_testCase, _helpers, _abstractTestCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Attribute bindings integration', class extends _testCase.RenderingTest {\n ['@test it can have attribute bindings']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo:data-foo', 'bar:data-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo bar=bar}}', { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n ['@test it can have attribute bindings with attrs']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['attrs.foo:data-foo', 'attrs.baz.bar:data-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=model.foo baz=model.baz}}', {\n model: { foo: undefined, baz: { bar: 'bar' } }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.foo', 'foo');\n (0, _metal.set)(this.context, 'model.baz.bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: undefined,\n baz: { bar: 'bar' }\n }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n }\n\n ['@test it can have attribute bindings with a nested path']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo.bar:data-foo-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo}}', { foo: { bar: 'foo-bar' } });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo.bar', 'FOO-BAR'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'FOO-BAR' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo.bar', undefined));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: 'foo-bar' }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n }\n\n ['@test handles non-microsyntax attributeBindings']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['type']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar type=submit}}', {\n submit: 'submit'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', 'password'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', 'submit'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n }\n\n ['@test non-microsyntax attributeBindings cannot contain nested paths']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo.bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar foo=foo}}', { foo: { bar: 'foo-bar' } });\n }, /Illegal attributeBinding: 'foo.bar' is not a valid attribute name./);\n }\n\n ['@test normalizes attributeBindings for property names']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['tiTLe']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar tiTLe=name}}', {\n name: 'qux'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'qux' },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'qux'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'qux' },\n content: 'hello'\n });\n }\n\n ['@test normalizes attributeBindings for attribute names']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo:data-FOO']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo}}', {\n foo: 'qux'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'qux' },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'qux'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'qux' },\n content: 'hello'\n });\n }\n\n ['@test attributeBindings preserves case for mixed-case attributes']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'svg',\n attributeBindings: ['viewBox']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{foo-bar viewBox=foo}}', {\n foo: '0 0 100 100'\n });\n\n this.assert.equal(this.firstChild.getAttribute('viewBox'), '0 0 100 100', 'viewBox attribute');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', null));\n\n this.assert.ok(!this.firstChild.hasAttribute('viewBox'), 'viewBox attribute removed');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', '0 0 100 200'));\n\n this.assert.equal(this.firstChild.getAttribute('viewBox'), '0 0 100 200', 'viewBox attribute');\n }\n\n ['@test attributeBindings handles null/undefined']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['fizz', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar fizz=fizz bar=bar}}', {\n fizz: null,\n bar: undefined\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fizz', 'fizz');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { fizz: 'fizz', bar: 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fizz', null);\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n }\n\n ['@test attributeBindings handles number value']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['size']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar size=size}}', {\n size: 21\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'size', 0));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '0' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'size', 21));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n }\n\n ['@test handles internal and external changes']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['type'],\n type: 'password',\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(component, 'type', 'checkbox'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'checkbox' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(component, 'type', 'password'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n }\n\n ['@test can set attributeBindings on component with a different tagName']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'input',\n attributeBindings: ['type', 'isDisabled:disabled']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar type=type isDisabled=disabled}}', {\n type: 'password',\n disabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'type', 'checkbox');\n (0, _metal.set)(this.context, 'disabled', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'checkbox', disabled: '' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'type', 'password');\n (0, _metal.set)(this.context, 'disabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n }\n\n ['@test should allow namespaced attributes in micro syntax']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['xlinkHref:xlink:href']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar type=type xlinkHref=xlinkHref}}', {\n xlinkHref: '/foo.png'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'xlinkHref', '/lol.png'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/lol.png' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'xlinkHref', '/foo.png'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n }\n\n // This comes into play when using the {{#each}} helper. If the\n // passed array item is a String, it will be converted into a\n // String object instead of a normal string.\n ['@test should allow for String objects']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar foo=foo}}', {\n foo: function () {\n return this;\n }.call('bar')\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', function () {\n return this;\n }.call('baz')));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'baz' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', function () {\n return this;\n }.call('bar')));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n }\n\n ['@test can set id initially via attributeBindings ']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['specialSauce:id']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar specialSauce=sauce}}', {\n sauce: 'special-sauce'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'sauce', 'foo'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'sauce', 'special-sauce'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n }\n\n ['@test attributeBindings are overwritten']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['href'],\n href: 'a href'\n });\n\n let FizzBarComponent = FooBarComponent.extend({\n attributeBindings: ['newHref:href']\n });\n\n this.registerComponent('fizz-bar', { ComponentClass: FizzBarComponent });\n\n this.render('{{fizz-bar newHref=href}}', {\n href: 'dog.html'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'dog.html' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'dog.html' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'href', 'cat.html'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'cat.html' }\n });\n }\n\n ['@test it can set attribute bindings in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n let bindings = [];\n\n if (this.get('hasFoo')) {\n bindings.push('foo:data-foo');\n }\n\n if (this.get('hasBar')) {\n bindings.push('bar:data-bar');\n }\n\n this.attributeBindings = bindings;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar hasFoo=true foo=foo hasBar=false bar=bar}}\n {{foo-bar hasFoo=false foo=foo hasBar=true bar=bar}}\n {{foo-bar hasFoo=true foo=foo hasBar=true bar=bar}}\n {{foo-bar hasFoo=false foo=foo hasBar=false bar=bar}}\n `, { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 'BAR'));\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'BAR' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO', 'data-bar': 'BAR' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n }\n\n ['@test asserts if an attributeBinding is setup on class']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['class']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You cannot use class as an attributeBinding, use classNameBindings instead./i);\n }\n\n ['@test blacklists href bindings based on protocol']() {\n /* jshint scripturl:true */\n\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'a',\n attributeBindings: ['href']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar href=xss}}', {\n xss: \"javascript:alert('foo')\"\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: \"unsafe:javascript:alert('foo')\" }\n });\n }\n\n ['@test it can bind the role attribute (issue #14007)']() {\n let FooBarComponent = _helpers.Component.extend({ attributeBindings: ['role'] });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar role=role}}', { role: 'button' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'button' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'button' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'role', 'combobox'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'combobox' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'role', null));\n\n this.assertComponentElement(this.firstChild, { tagName: 'div' });\n }\n\n ['@test component with an `id` attribute binding of undefined']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['id'],\n\n id: undefined\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['somethingUndefined:id'],\n\n somethingUndefined: undefined\n })\n });\n this.render(`{{foo-bar}}{{baz-qux}}`);\n\n this.assertComponentElement(this.nthChild(0), { content: '' });\n this.assertComponentElement(this.nthChild(1), { content: '' });\n\n this.assert.ok(this.nthChild(0).id.match(/ember\\d+/), 'a valid `id` was used');\n this.assert.ok(this.nthChild(1).id.match(/ember\\d+/), 'a valid `id` was used');\n }\n\n ['@test component with an `id` attribute binding of null']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['id'],\n\n id: null\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['somethingNull:id'],\n\n somethingNull: null\n })\n });\n this.render(`{{foo-bar}}{{baz-qux}}`);\n\n this.assertComponentElement(this.nthChild(0), { content: '' });\n this.assertComponentElement(this.nthChild(1), { content: '' });\n\n this.assert.ok(this.nthChild(0).id.match(/ember\\d+/), 'a valid `id` was used');\n this.assert.ok(this.nthChild(1).id.match(/ember\\d+/), 'a valid `id` was used');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/attrs-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _helpers, _metal, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: attrs lookup', class extends _testCase.RenderingTest {\n ['@test it should be able to lookup attrs without `attrs.` - template access']() {\n this.registerComponent('foo-bar', { template: '{{first}}' });\n\n this.render(`{{foo-bar first=firstAttr}}`, {\n firstAttr: 'first attr'\n });\n\n this.assertText('first attr');\n\n this.runTask(() => this.rerender());\n\n this.assertText('first attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'second attr'));\n\n this.assertText('second attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'first attr'));\n\n this.assertText('first attr');\n }\n\n ['@test it should be able to lookup attrs without `attrs.` - component access'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{first}}'\n });\n\n this.render(`{{foo-bar first=firstAttr}}`, {\n firstAttr: 'first attr'\n });\n\n assert.equal(instance.get('first'), 'first attr');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('first'), 'first attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'second attr'));\n\n assert.equal(instance.get('first'), 'second attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'first attr'));\n\n this.assertText('first attr');\n }\n\n ['@test should be able to modify a provided attr into local state #11571 / #11559'](assert) {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n this.set('first', this.get('first').toUpperCase());\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{first}}'\n });\n\n this.render(`{{foo-bar first=\"first attr\"}}`);\n\n assert.equal(instance.get('first'), 'FIRST ATTR', 'component lookup uses local state');\n this.assertText('FIRST ATTR');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('first'), 'FIRST ATTR', 'component lookup uses local state during rerender');\n this.assertText('FIRST ATTR');\n\n // This is testing that passing string literals for use as initial values,\n // so there is no update step\n }\n\n ['@test should be able to access unspecified attr #12035'](assert) {\n let instance;\n let wootVal = 'yes';\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n assert.equal(this.get('woot'), wootVal, 'found attr in didReceiveAttrs');\n }\n });\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render(`{{foo-bar woot=woot}}`, {\n woot: wootVal\n });\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr after rerender');\n\n this.runTask(() => {\n wootVal = 'nope';\n (0, _metal.set)(this.context, 'woot', wootVal);\n });\n\n assert.equal(instance.get('woot'), 'nope', 'component found attr after attr change');\n\n this.runTask(() => {\n wootVal = 'yes';\n (0, _metal.set)(this.context, 'woot', wootVal);\n });\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr after reset');\n }\n\n ['@test getAttr() should return the same value as get()'](assert) {\n assert.expect(33);\n\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n let rootFirstPositional = this.get('firstPositional');\n let rootFirst = this.get('first');\n let rootSecond = this.get('second');\n let attrFirstPositional = this.getAttr('firstPositional');\n let attrFirst = this.getAttr('first');\n let attrSecond = this.getAttr('second');\n\n assert.equal(rootFirstPositional, attrFirstPositional, 'root property matches attrs value');\n assert.equal(rootFirst, attrFirst, 'root property matches attrs value');\n assert.equal(rootSecond, attrSecond, 'root property matches attrs value');\n }\n });\n\n FooBarComponent.reopenClass({\n positionalParams: ['firstPositional']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render(`{{foo-bar firstPositional first=first second=second}}`, {\n firstPositional: 'firstPositional',\n first: 'first',\n second: 'second'\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'third');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'second', 'fourth');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'fourth', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'firstPositional', 'fifth');\n });\n\n assert.equal(instance.get('firstPositional'), 'fifth', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'fourth', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'firstPositional', 'firstPositional');\n (0, _metal.set)(this.context, 'first', 'first');\n (0, _metal.set)(this.context, 'second', 'second');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n }\n\n ['@test bound computed properties can be overridden in extensions, set during init, and passed in as attrs']() {\n let FooClass = _helpers.Component.extend({\n attributeBindings: ['style'],\n style: (0, _metal.computed)('height', 'color', function () {\n let height = this.get('height');\n let color = this.get('color');\n return (0, _helpers.htmlSafe)(`height: ${height}px; background-color: ${color};`);\n }),\n color: 'red',\n height: 20\n });\n\n let BarClass = FooClass.extend({\n init() {\n this._super(...arguments);\n this.height = 150;\n },\n color: 'yellow'\n });\n\n this.registerComponent('x-foo', { ComponentClass: FooClass });\n this.registerComponent('x-bar', { ComponentClass: BarClass });\n\n this.render('{{x-foo}}{{x-bar}}{{x-bar color=\"green\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 20px; background-color: red;') }\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 150px; background-color: yellow;') }\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 150px; background-color: green;') }\n });\n\n this.assertStableRerender();\n\n // No U-R\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/class-bindings-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _helpers, _testHelpers, _metal, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('ClassNameBindings integration', class extends _testCase.RenderingTest {\n ['@test it can have class name bindings on the class definition']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo', 'isEnabled:enabled', 'isHappy:happy:sad']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo isEnabled=isEnabled isHappy=isHappy}}', {\n foo: 'foo',\n isEnabled: true,\n isHappy: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'isEnabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', undefined);\n (0, _metal.set)(this.context, 'isHappy', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'isEnabled', true);\n (0, _metal.set)(this.context, 'isHappy', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n }\n\n ['@test attrs in classNameBindings']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['attrs.joker:purple:green', 'attrs.batman.robin:black:red']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar joker=model.wat batman=model.super}}', {\n model: { wat: false, super: { robin: true } }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.wat', true);\n (0, _metal.set)(this.context, 'model.super.robin', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view purple red') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n wat: false,\n super: { robin: true }\n }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n }\n\n ['@test it can have class name bindings in the template']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classNameBindings=\"model.someInitiallyTrueProperty model.someInitiallyFalseProperty model.someInitiallyUndefinedProperty :static model.isBig:big model.isOpen:open:closed model.isUp::down model.bar:isTruthy:isFalsy\"}}', {\n model: {\n someInitiallyTrueProperty: true,\n someInitiallyFalseProperty: false,\n isBig: true,\n isOpen: false,\n isUp: true,\n bar: true\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.someInitiallyTrueProperty', false);\n (0, _metal.set)(this.context, 'model.someInitiallyFalseProperty', true);\n (0, _metal.set)(this.context, 'model.someInitiallyUndefinedProperty', true);\n (0, _metal.set)(this.context, 'model.isBig', false);\n (0, _metal.set)(this.context, 'model.isOpen', true);\n (0, _metal.set)(this.context, 'model.isUp', false);\n (0, _metal.set)(this.context, 'model.bar', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-false-property some-initially-undefined-property static open down isFalsy')\n },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n someInitiallyTrueProperty: true,\n someInitiallyFalseProperty: false,\n someInitiallyUndefinedProperty: undefined,\n isBig: true,\n isOpen: false,\n isUp: true,\n bar: true\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n }\n\n ['@test it can have class name bindings with nested paths']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo.bar', 'is.enabled:enabled', 'is.happy:happy:sad']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo is=is}}', {\n foo: { bar: 'foo-bar' },\n is: { enabled: true, happy: false }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo.bar', 'FOO-BAR');\n (0, _metal.set)(this.context, 'is.enabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo.bar', null);\n (0, _metal.set)(this.context, 'is.happy', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', null);\n (0, _metal.set)(this.context, 'is', null);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', { bar: 'foo-bar' });\n (0, _metal.set)(this.context, 'is', { enabled: true, happy: false });\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n }\n\n ['@test it should dasherize the path when the it resolves to true']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['fooBar', 'nested.fooBarBaz']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar fooBar=fooBar nested=nested}}', {\n fooBar: true,\n nested: { fooBarBaz: false }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', false);\n (0, _metal.set)(this.context, 'nested.fooBarBaz', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar-baz') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', 'FOO-BAR');\n (0, _metal.set)(this.context, 'nested.fooBarBaz', null);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'nested', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', true);\n (0, _metal.set)(this.context, 'nested', { fooBarBaz: false });\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n }\n\n ['@test const bindings can be set as attrs']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.render('{{foo-bar classNameBindings=\"foo:enabled:disabled\"}}', {\n foo: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view disabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n }\n\n ['@test :: class name syntax works with an empty true class']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['isEnabled::not-enabled']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar isEnabled=enabled}}', {\n enabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view not-enabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view not-enabled') },\n content: 'hello'\n });\n }\n\n ['@test uses all provided static class names (issue #11193)']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: [':class-one', ':class-two']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}', {\n enabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view class-one class-two') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view class-one class-two') },\n content: 'hello'\n });\n }\n\n ['@test Providing a binding with a space in it asserts']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: 'i:think:i am:so:clever'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must not have spaces in them/i);\n }\n\n ['@test it asserts that items must be strings']() {\n let FooBarComponent = _helpers.Component.extend({\n foo: 'foo',\n bar: 'bar',\n classNameBindings: ['foo',, 'bar'] // eslint-disable-line no-sparse-arrays\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must be non-empty strings/);\n }\n\n ['@test it asserts that items must be non-empty strings']() {\n let FooBarComponent = _helpers.Component.extend({\n foo: 'foo',\n bar: 'bar',\n classNameBindings: ['foo', '', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must be non-empty strings/);\n }\n\n ['@test it can set class name bindings in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo'],\n\n init() {\n this._super();\n\n let bindings = this.classNameBindings = this.classNameBindings.slice();\n\n if (this.get('bindIsEnabled')) {\n bindings.push('isEnabled:enabled');\n }\n\n if (this.get('bindIsHappy')) {\n bindings.push('isHappy:happy:sad');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar foo=foo bindIsEnabled=true isEnabled=isEnabled bindIsHappy=false isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=false isEnabled=isEnabled bindIsHappy=true isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=true isEnabled=isEnabled bindIsHappy=true isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=false isEnabled=isEnabled bindIsHappy=false isHappy=isHappy}}\n `, { foo: 'foo', isEnabled: true, isHappy: false });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'isEnabled', false);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', undefined);\n (0, _metal.set)(this.context, 'isHappy', true);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'isEnabled', true);\n (0, _metal.set)(this.context, 'isHappy', false);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n ['@test using a computed property for classNameBindings triggers an assertion']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: (0, _metal.computed)(function () {\n return ['isHappy:happy:sad'];\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /Only arrays are allowed/);\n }\n });\n\n (0, _testCase.moduleFor)('ClassBinding integration', class extends _testCase.RenderingTest {\n ['@test it should apply classBinding without condition always']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\":foo\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') }\n });\n }\n\n ['@test it should merge classBinding with class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"birdman:respeck\" class=\"myName\"}}', {\n birdman: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck myName ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck myName ember-view') }\n });\n }\n\n ['@test it should apply classBinding with only truthy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName:respeck\"}}', {\n myName: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck ember-view') }\n });\n }\n\n ['@test it should apply classBinding with only falsy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName::shade\"}}', {\n myName: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('shade ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('shade ember-view') }\n });\n }\n\n ['@test it should apply nothing when classBinding is falsy but only supplies truthy class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName:respeck\"}}', {\n myName: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n }\n\n ['@test it should apply nothing when classBinding is truthy but only supplies falsy class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName::shade\"}}', { myName: true });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n }\n\n ['@test it should apply classBinding with falsy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"swag:fresh:scrub\"}}', {\n swag: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('scrub ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('scrub ember-view') }\n });\n }\n\n ['@test it should apply classBinding with truthy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"swag:fresh:scrub\"}}', {\n swag: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fresh ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fresh ember-view') }\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/contextual-components-test', ['@ember/polyfills', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime'], function (_polyfills, _helpers, _abstractTestCase, _testCase, _metal, _runtime) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: contextual components', class extends _testCase.RenderingTest {\n ['@test renders with component helper']() {\n let expectedText = 'Hodi';\n\n this.registerComponent('-looked-up', {\n template: expectedText\n });\n\n this.render('{{component (component \"-looked-up\")}}');\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n }\n\n ['@test renders with component helper with invocation params, hash']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"-looked-up\") \"Hodari\" greeting=\"Hodi\"}}`);\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test GH#13742 keeps nested rest positional parameters if rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.greeting model.name)}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack'\n }\n });\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack');\n\n this.runTask(() => this.context.set('model.name', 'Matthew'));\n\n this.assertText('Good morning Matthew');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack' }));\n\n this.assertText('Gabon Zack');\n }\n\n // Take a look at this one. Seems to pass even when currying isn't implemented.\n ['@test overwrites nested rest positional parameters if rendered with positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.greeting model.name) model.name model.greeting}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack '\n }\n });\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack Zack Good morning ');\n\n this.runTask(() => this.context.set('model.name', 'Matthew '));\n\n this.assertText('Good morning Matthew Matthew Good morning ');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack ' }));\n\n this.assertText('Gabon Zack Zack Gabon ');\n }\n\n ['@test GH#13742 keeps nested rest positional parameters if nested and rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" model.greeting model.name))}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack'\n }\n });\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack');\n\n this.runTask(() => this.context.set('model.name', 'Matthew'));\n\n this.assertText('Good morning Matthew');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack' }));\n\n this.assertText('Gabon Zack');\n }\n\n ['@test overwrites nested rest positional parameters if nested with new pos params and rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" model.greeting model.name) model.name model.greeting)}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack '\n }\n });\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack Zack Good morning ');\n\n this.runTask(() => this.context.set('model.name', 'Matthew '));\n\n this.assertText('Good morning Matthew Matthew Good morning ');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack ' }));\n\n this.assertText('Gabon Zack Zack Gabon ');\n }\n\n ['@test renders with component helper with curried params, hash']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"-looked-up\" \"Hodari\" greeting=\"Hodi\")\n greeting=\"Hola\"}}`);\n\n this.assertText('Hola Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola Hodari');\n }\n\n ['@test updates when component path is bound']() {\n this.registerComponent('-mandarin', {\n template: 'ni hao'\n });\n\n this.registerComponent('-hindi', {\n template: 'Namaste'\n });\n\n this.render('{{component (component model.lookupComponent)}}', {\n model: {\n lookupComponent: '-mandarin'\n }\n });\n\n this.assertText('ni hao');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ni hao');\n\n this.runTask(() => this.context.set('model.lookupComponent', '-hindi'));\n\n this.assertText('Namaste');\n\n this.runTask(() => this.context.set('model', { lookupComponent: '-mandarin' }));\n\n this.assertText('ni hao');\n }\n\n ['@test updates when curried hash argument is bound']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}}'\n });\n\n this.render(`{{component (component \"-looked-up\" greeting=model.greeting)}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi');\n\n this.runTask(() => this.context.set('model.greeting', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi');\n }\n\n ['@test updates when curried hash arguments is bound in block form']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash comp=(component \"-looked-up\" greeting=model.greeting)) as |my|}}\n {{#my.comp}}{{/my.comp}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi');\n\n this.runTask(() => this.context.set('model.greeting', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi');\n }\n\n ['@test nested components do not overwrite positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" \"Sergio\" 29) \"Marvin\" 21) \"Hodari\"}}');\n\n this.assertText('Sergio 29');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio 29');\n }\n\n ['@test positional parameters are combined not clobbered']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" \"Hi\") \"Max\") 9}}');\n\n this.assertText('Hi Max 9');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hi Max 9');\n }\n\n ['@test nested components positional parameters override named parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component (component \"-looked-up\" \"Sergio\" 29) name=\"Marvin\" age=21)}}');\n }, 'You cannot specify both a positional param (at position 1) and the hash argument `age`.');\n\n this.assertText('Sergio 29');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio 29');\n }\n\n ['@test nested components with positional params at outer layer are override hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" \"Hola\" \"Dolores\" 33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 1) and the hash argument `name`.');\n\n this.assertText('Hola Dolores 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola Dolores 33');\n }\n\n ['@test nested components with positional params at middle layer partially override hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first \"Hej\" \"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `greeting`.');\n\n this.assertText('Hej Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hej Sigmundur 33');\n }\n\n ['@test nested components with positional params at invocation override earlier hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `greeting`.');\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.context.set('model.greeting', 'Kaixo'));\n\n this.assertText('Kaixo Sigmundur 33');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi Sigmundur 33');\n }\n\n ['@test nested components overwrite hash parameters']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.context.set('model.greeting', 'Kaixo'));\n\n this.assertText('Kaixo Sigmundur 33');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi Sigmundur 33');\n }\n\n ['@test bound outer named parameters get updated in the right scope']() {\n this.registerComponent('-inner-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['comp']\n }),\n template: '{{component comp \"Inner\"}}'\n });\n\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component \"-inner-component\" (component \"-looked-up\" model.outerName model.outerAge)}}', {\n model: {\n outerName: 'Outer',\n outerAge: 28\n }\n });\n\n this.assertText('Outer 28');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Outer 28');\n\n this.runTask(() => this.context.set('model.outerAge', 29));\n\n this.assertText('Outer 29');\n\n this.runTask(() => this.context.set('model.outerName', 'Not outer'));\n\n this.assertText('Not outer 29');\n\n this.runTask(() => {\n this.context.set('model', {\n outerName: 'Outer',\n outerAge: 28\n });\n });\n\n this.assertText('Outer 28');\n }\n\n ['@test bound outer hash parameters get updated in the right scope']() {\n this.registerComponent('-inner-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['comp']\n }),\n template: '{{component comp name=\"Inner\"}}'\n });\n\n this.registerComponent('-looked-up', {\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component \"-inner-component\" (component \"-looked-up\" name=model.outerName age=model.outerAge)}}', {\n model: {\n outerName: 'Outer',\n outerAge: 28\n }\n });\n\n this.assertText('Inner 28');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Inner 28');\n\n this.runTask(() => this.context.set('model.outerAge', 29));\n\n this.assertText('Inner 29');\n\n this.runTask(() => this.context.set('model.outerName', 'Not outer'));\n\n this.assertText('Inner 29');\n\n this.runTask(() => {\n this.context.set('model', {\n outerName: 'Outer',\n outerAge: 28\n });\n });\n\n this.assertText('Inner 28');\n }\n\n ['@test conflicting positional and hash parameters trigger a deprecation if in the same component context [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component \"-looked-up\" \"Hodari\" name=\"Sergio\") \"Hodari\" greeting=\"Hodi\"}}');\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n }\n\n ['@test conflicting positional and hash parameters does not raise an assertion if rerendered']() {\n // In some cases, rerendering with a positional param used to cause an\n // assertion. This test checks it does not.\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.name greeting=\"Hodi\")}}', {\n model: {\n name: 'Hodari'\n }\n });\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.context.set('model.name', 'Sergio'));\n\n this.assertText('Hodi Sergio');\n\n this.runTask(() => this.context.set('model', { name: 'Hodari' }));\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test conflicting positional and hash parameters trigger a deprecation [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component \"-looked-up\" \"Hodari\") name=\"Sergio\" greeting=\"Hodi\"}}');\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test component with dynamic component name resolving to undefined, then an existing component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: undefined,\n name: 'Alex'\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', undefined));\n\n this.assertText('');\n }\n\n ['@test component with dynamic component name resolving to a component, then undefined']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', undefined));\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test component with dynamic component name resolving to null, then an existing component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: null,\n name: 'Alex'\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', null));\n\n this.assertText('');\n }\n\n ['@test component with dynamic component name resolving to a component, then null']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', null));\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test raises an assertion when component path is not a component name (static)']() {\n expectAssertion(() => {\n this.render('{{component (component \"not-a-component\")}}');\n }, 'Could not find component named \"not-a-component\" (no component or template with that name was found)');\n }\n\n ['@test raises an assertion when component path is not a component name (dynamic)']() {\n expectAssertion(() => {\n this.render('{{component (component compName)}}', {\n compName: 'not-a-component'\n });\n }, 'Could not find component named \"not-a-component\" (no component or template with that name was found)');\n }\n\n ['@test renders with dot path']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: expectedText\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup}}\n {{/with}}`);\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and attr']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: '{{expectedText}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup expectedText=model.expectedText}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n\n this.runTask(() => this.context.set('model.expectedText', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and curried over attr']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: '{{expectedText}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\" expectedText=model.expectedText)) as |object|}}\n {{object.lookedup}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n\n this.runTask(() => this.context.set('model.expectedText', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and with rest positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{params}}'\n });\n\n let expectedText = 'Hodi';\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup model.expectedText \"Hola\"}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(`${expectedText},Hola`);\n\n this.runTask(() => this.rerender());\n\n this.assertText(`${expectedText},Hola`);\n\n this.runTask(() => this.context.set('model.expectedText', 'Kaixo'));\n\n this.assertText('Kaixo,Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(`${expectedText},Hola`);\n }\n\n ['@test renders with dot path and rest parameter does not leak'](assert) {\n // In the original implementation, positional parameters were not handled\n // correctly causing the first positional parameter to be the contextual\n // component itself.\n let value = false;\n\n this.registerComponent('my-component', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n value = this.getAttr('value');\n }\n }).reopenClass({\n positionalParams: ['value']\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash my-component=(component 'my-component' first)) as |c|}}\n {{c.my-component}}\n {{/with}}`, { first: 'first' });\n\n assert.equal(value, 'first', 'value is the expected parameter');\n }\n\n ['@test renders with dot path and updates attributes'](assert) {\n this.registerComponent('my-nested-component', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n this.set('myProp', this.getAttr('my-parent-attr'));\n }\n }),\n template: '{{myProp}}'\n });\n\n this.registerComponent('my-component', {\n template: '{{yield (hash my-nested-component=(component \"my-nested-component\" my-parent-attr=my-attr))}}'\n });\n\n this.registerComponent('my-action-component', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n changeValue() {\n this.incrementProperty('myProp');\n }\n }\n }),\n template: _abstractTestCase.strip`\n {{#my-component my-attr=myProp as |api|}}\n {{api.my-nested-component}}\n {{/my-component}}\n
    \n `\n });\n\n this.render('{{my-action-component myProp=model.myProp}}', {\n model: {\n myProp: 1\n }\n });\n\n assert.equal(this.$('#nested-prop').text(), '1');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#nested-prop').text(), '1');\n\n this.runTask(() => this.$('button').click());\n\n assert.equal(this.$('#nested-prop').text(), '2');\n\n this.runTask(() => this.$('button').click());\n\n assert.equal(this.$('#nested-prop').text(), '3');\n\n this.runTask(() => this.context.set('model', { myProp: 1 }));\n\n assert.equal(this.$('#nested-prop').text(), '1');\n }\n\n [\"@test adding parameters to a contextual component's instance does not add it to other instances\"]() {\n // If parameters and attributes are not handled correctly, setting a value\n // in an invokation can leak to others invocation.\n this.registerComponent('select-box', {\n template: '{{yield (hash option=(component \"select-box-option\"))}}'\n });\n\n this.registerComponent('select-box-option', {\n template: '{{label}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#select-box as |sb|}}\n {{sb.option label=\"Foo\"}}\n {{sb.option}}\n {{/select-box}}`);\n\n this.assertText('Foo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo');\n }\n\n ['@test parameters in a contextual component are mutable when value is a param'](assert) {\n // This checks that a `(mut)` is added to parameters and attributes to\n // contextual components when it is a param.\n\n this.registerComponent('change-button', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['val']\n }),\n template: _abstractTestCase.strip`\n `\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"change-button\" model.val2)}}\n {{model.val2}}`, {\n model: {\n val2: 8\n }\n });\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.$('.my-button').click());\n\n assert.equal(this.$('.value').text(), '10');\n\n this.runTask(() => this.context.set('model', { val2: 8 }));\n\n assert.equal(this.$('.value').text(), '8');\n }\n\n ['@test tagless blockless components render'](assert) {\n this.registerComponent('my-comp', {\n ComponentClass: _helpers.Component.extend({ tagName: '' })\n });\n\n this.render(`{{my-comp}}`);\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$().text(), '');\n }\n\n ['@test GH#13494 tagless blockless component with property binding'](assert) {\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n message: 'hello',\n actions: {\n change() {\n this.set('message', 'goodbye');\n }\n }\n }),\n template: _abstractTestCase.strip`\n message: {{message}}{{inner-component message=message}}\n `\n });\n\n setup.call(this, assert);\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.$('.my-button').click());\n\n assert.equal(this.$('.value').text(), '10');\n\n this.runTask(() => this.context.set('model', { val2: 8 }));\n\n assert.equal(this.$('.value').text(), '8');\n }\n };\n }\n }\n\n (0, _abstractTestCase.applyMixins)(ContextualComponentMutableParamsTest, new MutableParamTestGenerator([{\n title: 'param',\n setup() {\n this.render('{{component (component \"change-button\" model.val2)}}');\n }\n }, {\n title: 'nested param',\n setup() {\n this.registerComponent('my-comp', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['components']\n }),\n template: '{{component components.comp}}'\n });\n\n this.render('{{my-comp (hash comp=(component \"change-button\" model.val2))}}');\n }\n }, {\n title: 'hash value',\n setup() {\n this.registerComponent('my-comp', {\n template: '{{component component}}'\n });\n\n this.render('{{my-comp component=(component \"change-button\" val=model.val2)}}');\n }\n }, {\n title: 'nested hash value',\n setup() {\n this.registerComponent('my-comp', {\n template: '{{component components.button}}'\n });\n\n this.render('{{my-comp components=(hash button=(component \"change-button\" val=model.val2))}}');\n }\n }]));\n\n (0, _testCase.moduleFor)('Components test: contextual components -- mutable params', ContextualComponentMutableParamsTest);\n});","enifed('@ember/-internals/glimmer/tests/integration/components/curly-components-test', ['@ember/runloop', '@glimmer/env', '@ember/-internals/metal', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_runloop, _env, _metal, _service, _runtime, _views, _helpers, _abstractTestCase, _testCase, _testHelpers) {\n 'use strict';\n\n /* globals EmberDev */\n (0, _testCase.moduleFor)('Components test: curly components', class extends _testCase.RenderingTest {\n ['@test it can render a basic component']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it can have a custom id and it is not bound']() {\n this.registerComponent('foo-bar', { template: '{{id}} {{elementId}}' });\n\n this.render('{{foo-bar id=customId}}', {\n customId: 'bizz'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bar bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bizz'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n }\n\n ['@test elementId cannot change'](assert) {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{elementId}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'blahzorz' },\n content: 'blahzorz'\n });\n\n if (EmberDev && !EmberDev.runningProdBuild) {\n let willThrow = () => (0, _runloop.run)(null, _metal.set, component, 'elementId', 'herpyderpy');\n\n assert.throws(willThrow, /Changing a view's elementId after creation is not allowed/);\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'blahzorz' },\n content: 'blahzorz'\n });\n }\n }\n\n ['@test can specify template with `layoutName` property']() {\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n layoutName: 'fizz-bar',\n init() {\n this._super(...arguments);\n this.local = 'hey';\n }\n });\n\n this.registerTemplate('fizz-bar', `FIZZ BAR {{local}}`);\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n\n this.assertText('FIZZ BAR hey');\n }\n\n ['@test layout supports computed property']() {\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n layout: (0, _metal.computed)(function () {\n return (0, _helpers.compile)('so much layout wat {{lulz}}');\n }),\n init() {\n this._super(...arguments);\n this.lulz = 'heyo';\n }\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n\n this.assertText('so much layout wat heyo');\n }\n\n ['@test passing undefined elementId results in a default elementId'](assert) {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'h1'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'something'\n });\n\n this.render('{{foo-bar id=somethingUndefined}}');\n\n let foundId = this.$('h1').attr('id');\n assert.ok(/^ember/.test(foundId), 'Has a reasonable id attribute (found id=' + foundId + ').');\n\n this.runTask(() => this.rerender());\n\n let newFoundId = this.$('h1').attr('id');\n assert.ok(/^ember/.test(newFoundId), 'Has a reasonable id attribute (found id=' + newFoundId + ').');\n\n assert.equal(foundId, newFoundId);\n }\n\n ['@test id is an alias for elementId'](assert) {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'h1'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'something'\n });\n\n this.render('{{foo-bar id=\"custom-id\"}}');\n\n let foundId = this.$('h1').attr('id');\n assert.equal(foundId, 'custom-id');\n\n this.runTask(() => this.rerender());\n\n let newFoundId = this.$('h1').attr('id');\n assert.equal(newFoundId, 'custom-id');\n\n assert.equal(foundId, newFoundId);\n }\n\n ['@test cannot pass both id and elementId at the same time']() {\n this.registerComponent('foo-bar', { template: '' });\n\n expectAssertion(() => {\n this.render('{{foo-bar id=\"zomg\" elementId=\"lol\"}}');\n }, /You cannot invoke a component with both 'id' and 'elementId' at the same time./);\n }\n\n ['@test it can have a custom tagName']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test it can have a custom tagName set in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n this.tagName = 'foo-bar';\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test it can have a custom tagName from the invocation']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar tagName=\"foo-bar\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test tagName can not be a computed property']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: (0, _metal.computed)(function () {\n return 'foo-bar';\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You cannot use a computed property for the component's `tagName` \\(<.+?>\\)\\./);\n }\n\n ['@test class is applied before didInsertElement'](assert) {\n let componentClass;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n componentClass = this.element.className;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar class=\"foo-bar\"}}');\n\n assert.equal(componentClass, 'foo-bar ember-view');\n }\n\n ['@test it can have custom classNames']() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n }\n\n ['@test should not apply falsy class name']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=somethingFalsy}}', {\n somethingFalsy: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n }\n\n ['@test should update class using inline if, initially false, no alternate']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if predicate \"thing\") }}', {\n predicate: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', true));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', false));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n }\n\n ['@test should update class using inline if, initially true, no alternate']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if predicate \"thing\") }}', {\n predicate: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', false));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', true));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n }\n\n ['@test should apply classes of the dasherized property name when bound property specified is true']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=model.someTruth}}', {\n model: { someTruth: true }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { someTruth: true }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n }\n\n ['@test class property on components can be dynamic']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if fooBar \"foo-bar\")}}', {\n fooBar: true\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n }\n\n ['@test it can have custom classNames from constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n this.classNames = this.classNames.slice();\n this.classNames.push('foo', 'bar', `outside-${this.get('extraClass')}`);\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar extraClass=\"baz\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar outside-baz') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar outside-baz') },\n content: 'hello'\n });\n }\n\n ['@test it can set custom classNames from the invocation']() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar class=\"bar baz\"}}\n {{foo-bar classNames=\"bar baz\"}}\n {{foo-bar}}\n `);\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n ['@test it has an element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test an empty component does not have childNodes'](assert) {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'input',\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { tagName: 'input' });\n\n assert.strictEqual(fooBarInstance.element.childNodes.length, 0);\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { tagName: 'input' });\n\n assert.strictEqual(fooBarInstance.element.childNodes.length, 0);\n }\n\n ['@test it has the right parentView and childViews'](assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('{{foo-bar}}');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n ['@feature(ember-glimmer-named-arguments) it renders passed named arguments']() {\n this.registerComponent('foo-bar', {\n template: '{{@foo}}'\n });\n\n this.render('{{foo-bar foo=model.bar}}', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n ['@test it reflects named arguments as properties']() {\n this.registerComponent('foo-bar', {\n template: '{{foo}}'\n });\n\n this.render('{{foo-bar foo=model.bar}}', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n ['@test it can render a basic component with a block']() {\n this.registerComponent('foo-bar', {\n template: '{{yield}} - In component'\n });\n\n this.render('{{#foo-bar}}hello{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n }\n\n ['@test it can render a basic component with a block when the yield is in a partial']() {\n this.registerPartial('_partialWithYield', 'yielded: [{{yield}}]');\n\n this.registerComponent('foo-bar', {\n template: '{{partial \"partialWithYield\"}} - In component'\n });\n\n this.render('{{#foo-bar}}hello{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n }\n\n ['@test it can render a basic component with a block param when the yield is in a partial']() {\n this.registerPartial('_partialWithYield', 'yielded: [{{yield \"hello\"}}]');\n\n this.registerComponent('foo-bar', {\n template: '{{partial \"partialWithYield\"}} - In component'\n });\n\n this.render('{{#foo-bar as |value|}}{{value}}{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n }\n\n ['@test it renders the layout with the component instance as the context']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n this.set('message', 'hello');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{message}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it preserves the outer context when yielding']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#foo-bar}}{{message}}{{/foo-bar}}', { message: 'hello' });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it can yield a block param named for reserved words [GH#14096]']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n name: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield this}}'\n });\n\n this.render('{{#foo-bar as |component|}}{{component.name}}{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'foo-bar' });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'name', 'derp-qux'));\n\n this.assertComponentElement(this.firstChild, { content: 'derp-qux' });\n\n this.runTask(() => (0, _metal.set)(instance, 'name', 'foo-bar'));\n\n this.assertComponentElement(this.firstChild, { content: 'foo-bar' });\n }\n\n ['@test it can yield internal and external properties positionally']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n greeting: 'hello'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield greeting greetee.firstName}}'\n });\n\n this.render('{{#foo-bar greetee=person as |greeting name|}}{{name}} {{person.lastName}}, {{greeting}}{{/foo-bar}}', {\n person: {\n firstName: 'Joel',\n lastName: 'Kang'\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'Dora',\n lastName: 'the Explorer'\n }));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hello'\n });\n\n this.runTask(() => (0, _metal.set)(instance, 'greeting', 'hola'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hola'\n });\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'greeting', 'hello');\n (0, _metal.set)(this.context, 'person', {\n firstName: 'Joel',\n lastName: 'Kang'\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n }\n\n ['@test #11519 - block param infinite loop']() {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n danger: 0\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{danger}}{{yield danger}}'\n });\n\n // On initial render, create streams. The bug will not have manifested yet, but at this point\n // we have created streams that create a circular invalidation.\n this.render(`{{#foo-bar as |dangerBlockParam|}}{{/foo-bar}}`);\n\n this.assertText('0');\n\n // Trigger a non-revalidating re-render. The yielded block will not be dirtied\n // nor will block param streams, and thus no infinite loop will occur.\n this.runTask(() => this.rerender());\n\n this.assertText('0');\n\n // Trigger a revalidation, which will cause an infinite loop without the fix\n // in place. Note that we do not see the infinite loop is in testing mode,\n // because a deprecation warning about re-renders is issued, which Ember\n // treats as an exception.\n this.runTask(() => (0, _metal.set)(instance, 'danger', 1));\n\n this.assertText('1');\n\n this.runTask(() => (0, _metal.set)(instance, 'danger', 0));\n\n this.assertText('0');\n }\n\n ['@test the component and its child components are destroyed'](assert) {\n let destroyed = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0 };\n\n this.registerComponent('foo-bar', {\n template: '{{id}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed[this.get('id')]++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond1}}\n {{#foo-bar id=1}}\n {{#if cond2}}\n {{#foo-bar id=2}}{{/foo-bar}}\n {{#if cond3}}\n {{#foo-bar id=3}}\n {{#if cond4}}\n {{#foo-bar id=4}}\n {{#if cond5}}\n {{#foo-bar id=5}}{{/foo-bar}}\n {{#foo-bar id=6}}{{/foo-bar}}\n {{#foo-bar id=7}}{{/foo-bar}}\n {{/if}}\n {{#foo-bar id=8}}{{/foo-bar}}\n {{/foo-bar}}\n {{/if}}\n {{/foo-bar}}\n {{/if}}\n {{/if}}\n {{/foo-bar}}\n {{/if}}`, {\n cond1: true,\n cond2: true,\n cond3: true,\n cond4: true,\n cond5: true\n });\n\n this.assertText('1 2 3 4 5 6 7 8 ');\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 0,\n 6: 0,\n 7: 0,\n 8: 0\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond5', false));\n\n this.assertText('1 2 3 4 8 ');\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 0\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond3', false);\n (0, _metal.set)(this.context, 'cond5', true);\n (0, _metal.set)(this.context, 'cond4', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', false);\n (0, _metal.set)(this.context, 'cond1', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 1,\n 2: 1,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n }\n\n ['@test should escape HTML in normal mustaches']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: 'you need to be more bold'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{output}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('you need to be more bold');\n\n this.runTask(() => this.rerender());\n\n this.assertText('you need to be more bold');\n\n this.runTask(() => (0, _metal.set)(component, 'output', 'you are so super'));\n\n this.assertText('you are so super');\n\n this.runTask(() => (0, _metal.set)(component, 'output', 'you need to be more bold'));\n }\n\n ['@test should not escape HTML in triple mustaches']() {\n let expectedHtmlBold = 'you need to be more bold';\n let expectedHtmlItalic = 'you are so super';\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: expectedHtmlBold\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{{output}}}'\n });\n\n this.render('{{foo-bar}}');\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => this.rerender());\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => (0, _metal.set)(component, 'output', expectedHtmlItalic));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlItalic);\n\n this.runTask(() => (0, _metal.set)(component, 'output', expectedHtmlBold));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n }\n\n ['@test should not escape HTML if string is a htmlSafe']() {\n let expectedHtmlBold = 'you need to be more bold';\n let expectedHtmlItalic = 'you are so super';\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: (0, _helpers.htmlSafe)(expectedHtmlBold)\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{output}}'\n });\n\n this.render('{{foo-bar}}');\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => this.rerender());\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => (0, _metal.set)(component, 'output', (0, _helpers.htmlSafe)(expectedHtmlItalic)));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlItalic);\n\n this.runTask(() => (0, _metal.set)(component, 'output', (0, _helpers.htmlSafe)(expectedHtmlBold)));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n }\n\n ['@test late bound layouts return the same definition'](assert) {\n let templateIds = [];\n\n // This is testing the scenario where you import a template and\n // set it to the layout property:\n //\n // import Component from '@ember/component';\n // import layout from './template';\n //\n // export default Component.extend({\n // layout\n // });\n let hello = (0, _helpers.compile)('Hello');\n let bye = (0, _helpers.compile)('Bye');\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.layout = this.cond ? hello : bye;\n templateIds.push(this.layout.id);\n }\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar cond=true}}{{foo-bar cond=false}}{{foo-bar cond=true}}{{foo-bar cond=false}}');\n\n let [t1, t2, t3, t4] = templateIds;\n assert.equal(t1, t3);\n assert.equal(t2, t4);\n }\n\n ['@test can use isStream property without conflict (#13271)']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n isStream: true,\n\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: _abstractTestCase.strip`\n {{#if isStream}}\n true\n {{else}}\n false\n {{/if}}\n `\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n\n this.runTask(() => (0, _metal.set)(component, 'isStream', false));\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n\n this.runTask(() => (0, _metal.set)(component, 'isStream', true));\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n }\n ['@test lookup of component takes priority over property']() {\n this.registerComponent('some-component', {\n template: 'some-component'\n });\n\n this.render('{{some-prop}} {{some-component}}', {\n 'some-component': 'not-some-component',\n 'some-prop': 'some-prop'\n });\n\n this.assertText('some-prop some-component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('some-prop some-component');\n }\n\n ['@test component without dash is not looked up']() {\n this.registerComponent('somecomponent', {\n template: 'somecomponent'\n });\n\n this.render('{{somecomponent}}', {\n somecomponent: 'notsomecomponent'\n });\n\n this.assertText('notsomecomponent');\n\n this.runTask(() => this.rerender());\n\n this.assertText('notsomecomponent');\n\n this.runTask(() => this.context.set('somecomponent', 'not not notsomecomponent'));\n\n this.assertText('not not notsomecomponent');\n\n this.runTask(() => this.context.set('somecomponent', 'notsomecomponent'));\n\n this.assertText('notsomecomponent');\n }\n\n ['@test non-block with properties on attrs']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{attrs.someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'other thing there'));\n\n this.assertText('In layout - someProp: other thing there');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@feature(ember-glimmer-named-arguments) non-block with named argument']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{@someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'other thing there'));\n\n this.assertText('In layout - someProp: other thing there');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@test non-block with properties overridden in init']() {\n let instance;\n this.registerComponent('non-block', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n this.someProp = 'value set in instance';\n }\n }),\n template: 'In layout - someProp: {{someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something passed when invoked'\n });\n\n this.assertText('In layout - someProp: value set in instance');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: value set in instance');\n\n this.runTask(() => this.context.set('prop', 'updated something passed when invoked'));\n\n this.assertText('In layout - someProp: updated something passed when invoked');\n\n this.runTask(() => instance.set('someProp', 'update value set in instance'));\n\n this.assertText('In layout - someProp: update value set in instance');\n\n this.runTask(() => this.context.set('prop', 'something passed when invoked'));\n this.runTask(() => instance.set('someProp', 'value set in instance'));\n\n this.assertText('In layout - someProp: value set in instance');\n }\n\n ['@test rerendering component with attrs from parent'](assert) {\n let willUpdateCount = 0;\n let didReceiveAttrsCount = 0;\n\n function expectHooks({ willUpdate, didReceiveAttrs }, callback) {\n willUpdateCount = 0;\n didReceiveAttrsCount = 0;\n\n callback();\n\n if (willUpdate) {\n assert.strictEqual(willUpdateCount, 1, 'The willUpdate hook was fired');\n } else {\n assert.strictEqual(willUpdateCount, 0, 'The willUpdate hook was not fired');\n }\n\n if (didReceiveAttrs) {\n assert.strictEqual(didReceiveAttrsCount, 1, 'The didReceiveAttrs hook was fired');\n } else {\n assert.strictEqual(didReceiveAttrsCount, 0, 'The didReceiveAttrs hook was not fired');\n }\n }\n\n this.registerComponent('non-block', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n didReceiveAttrsCount++;\n },\n\n willUpdate() {\n willUpdateCount++;\n }\n }),\n template: 'In layout - someProp: {{someProp}}'\n });\n\n expectHooks({ willUpdate: false, didReceiveAttrs: true }, () => {\n this.render('{{non-block someProp=someProp}}', {\n someProp: 'wycats'\n });\n });\n\n this.assertText('In layout - someProp: wycats');\n\n // Note: Hooks are not fired in Glimmer for idempotent re-renders\n expectHooks({ willUpdate: false, didReceiveAttrs: false }, () => {\n this.runTask(() => this.rerender());\n });\n\n this.assertText('In layout - someProp: wycats');\n\n expectHooks({ willUpdate: true, didReceiveAttrs: true }, () => {\n this.runTask(() => this.context.set('someProp', 'tomdale'));\n });\n\n this.assertText('In layout - someProp: tomdale');\n\n // Note: Hooks are not fired in Glimmer for idempotent re-renders\n expectHooks({ willUpdate: false, didReceiveAttrs: false }, () => {\n this.runTask(() => this.rerender());\n });\n\n this.assertText('In layout - someProp: tomdale');\n\n expectHooks({ willUpdate: true, didReceiveAttrs: true }, () => {\n this.runTask(() => this.context.set('someProp', 'wycats'));\n });\n\n this.assertText('In layout - someProp: wycats');\n }\n\n ['@feature(!ember-glimmer-named-arguments) this.attrs.foo === attrs.foo === foo']() {\n this.registerComponent('foo-bar', {\n template: _abstractTestCase.strip`\n Args: {{this.attrs.value}} | {{attrs.value}} | {{value}}\n {{#each this.attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each items as |item|}}\n {{item}}\n {{/each}}\n `\n });\n\n this.render('{{foo-bar value=model.value items=model.items}}', {\n model: {\n value: 'wat',\n items: [1, 2, 3]\n }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.context.set('model.value', 'lul');\n this.context.set('model.items', [1]);\n });\n\n this.assertText(_abstractTestCase.strip`Args: lul | lul | lul111`);\n\n this.runTask(() => this.context.set('model', { value: 'wat', items: [1, 2, 3] }));\n\n this.assertText('Args: wat | wat | wat123123123');\n }\n\n ['@feature(ember-glimmer-named-arguments) this.attrs.foo === attrs.foo === @foo === foo']() {\n this.registerComponent('foo-bar', {\n template: _abstractTestCase.strip`\n Args: {{this.attrs.value}} | {{attrs.value}} | {{@value}} | {{value}}\n {{#each this.attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each @items as |item|}}\n {{item}}\n {{/each}}\n {{#each items as |item|}}\n {{item}}\n {{/each}}\n `\n });\n\n this.render('{{foo-bar value=model.value items=model.items}}', {\n model: {\n value: 'wat',\n items: [1, 2, 3]\n }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.context.set('model.value', 'lul');\n this.context.set('model.items', [1]);\n });\n\n this.assertText(_abstractTestCase.strip`Args: lul | lul | lul | lul1111`);\n\n this.runTask(() => this.context.set('model', { value: 'wat', items: [1, 2, 3] }));\n\n this.assertText('Args: wat | wat | wat | wat123123123123');\n }\n\n ['@test non-block with properties on self']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@test block with properties on self']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@test block with properties on attrs']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{attrs.someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@feature(ember-glimmer-named-arguments) block with named argument']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{@someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@test static arbitrary number of positional parameters'](assert) {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{sample-component \"Foo\" 4 \"Bar\" elementId=\"args-3\"}}\n {{sample-component \"Foo\" 4 \"Bar\" 5 \"Baz\" elementId=\"args-5\"}}`);\n\n assert.equal(this.$('#args-3').text(), 'Foo4Bar');\n assert.equal(this.$('#args-5').text(), 'Foo4Bar5Baz');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#args-3').text(), 'Foo4Bar');\n assert.equal(this.$('#args-5').text(), 'Foo4Bar5Baz');\n }\n\n ['@test arbitrary positional parameter conflict with hash parameter is reported']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n expectAssertion(() => {\n this.render(`{{sample-component \"Foo\" 4 \"Bar\" names=numbers id=\"args-3\"}}`, {\n numbers: [1, 2, 3]\n });\n }, 'You cannot specify positional parameters and the hash argument `names`.');\n }\n\n ['@test can use hash parameter instead of arbitrary positional param [GH #12444]']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render('{{sample-component names=things}}', {\n things: (0, _runtime.A)(['Foo', 4, 'Bar'])\n });\n\n this.assertText('Foo4Bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4Bar');\n\n this.runTask(() => this.context.get('things').pushObject(5));\n\n this.assertText('Foo4Bar5');\n\n this.runTask(() => this.context.get('things').shiftObject());\n\n this.assertText('4Bar5');\n\n this.runTask(() => this.context.get('things').clear());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('things', (0, _runtime.A)(['Foo', 4, 'Bar'])));\n\n this.assertText('Foo4Bar');\n }\n\n ['@test can use hash parameter instead of positional param'](assert) {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['first', 'second']\n }),\n template: '{{first}} - {{second}}'\n });\n\n // TODO: Fix when id is implemented\n this.render(_abstractTestCase.strip`\n {{sample-component \"one\" \"two\" elementId=\"two-positional\"}}\n {{sample-component \"one\" second=\"two\" elementId=\"one-positional\"}}\n {{sample-component first=\"one\" second=\"two\" elementId=\"no-positional\"}}`);\n\n assert.equal(this.$('#two-positional').text(), 'one - two');\n assert.equal(this.$('#one-positional').text(), 'one - two');\n assert.equal(this.$('#no-positional').text(), 'one - two');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#two-positional').text(), 'one - two');\n assert.equal(this.$('#one-positional').text(), 'one - two');\n assert.equal(this.$('#no-positional').text(), 'one - two');\n }\n\n ['@test dynamic arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'n'\n }),\n template: _abstractTestCase.strip`\n {{#each n as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{sample-component user1 user2}}`, {\n user1: 'Foo',\n user2: 4\n });\n\n this.assertText('Foo4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4');\n\n this.runTask(() => this.context.set('user1', 'Bar'));\n\n this.assertText('Bar4');\n\n this.runTask(() => this.context.set('user2', '5'));\n\n this.assertText('Bar5');\n\n this.runTask(() => {\n this.context.set('user1', 'Foo');\n this.context.set('user2', 4);\n });\n\n this.assertText('Foo4');\n }\n\n ['@test with ariaRole specified']() {\n this.registerComponent('aria-test', {\n template: 'Here!'\n });\n\n this.render('{{aria-test ariaRole=role}}', {\n role: 'main'\n });\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n\n this.runTask(() => this.context.set('role', 'input'));\n\n this.assertComponentElement(this.firstChild, {\n attrs: { role: 'input' }\n });\n\n this.runTask(() => this.context.set('role', 'main'));\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n }\n\n ['@test with ariaRole defined but initially falsey GH#16379']() {\n this.registerComponent('aria-test', {\n template: 'Here!'\n });\n\n this.render('{{aria-test ariaRole=role}}', {\n role: undefined\n });\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.context.set('role', 'input'));\n\n this.assertComponentElement(this.firstChild, {\n attrs: { role: 'input' }\n });\n\n this.runTask(() => this.context.set('role', undefined));\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n }\n\n ['@test without ariaRole defined initially']() {\n // we are using the ability to lazily add a role as a sign that we are\n // doing extra work\n let instance;\n this.registerComponent('aria-test', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n }\n }),\n template: 'Here!'\n });\n\n this.render('{{aria-test}}');\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => instance.set('ariaRole', 'input'));\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n }\n\n ['@test `template` specified in component is overridden by block']() {\n this.registerComponent('with-template', {\n ComponentClass: _helpers.Component.extend({\n template: (0, _helpers.compile)('Should not be used')\n }),\n template: '[In layout - {{name}}] {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-template name=\"with-block\"}}\n [In block - {{name}}]\n {{/with-template}}\n {{with-template name=\"without-block\"}}`, {\n name: 'Whoop, whoop!'\n });\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n\n this.runTask(() => this.context.set('name', 'Ole, ole'));\n\n this.assertText('[In layout - with-block] [In block - Ole, ole][In layout - without-block] ');\n\n this.runTask(() => this.context.set('name', 'Whoop, whoop!'));\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n }\n\n ['@test hasBlock is true when block supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n {{yield}}\n {{else}}\n No Block!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block}}\n In template\n {{/with-block}}`);\n\n this.assertText('In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In template');\n }\n\n ['@test hasBlock is false when no block supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n {{yield}}\n {{else}}\n No Block!\n {{/if}}`\n });\n\n this.render('{{with-block}}');\n\n this.assertText('No Block!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Block!');\n }\n\n ['@test hasBlockParams is true when block param supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n {{yield this}} - In Component\n {{else}}\n {{yield}} No Block!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block as |something|}}\n In template\n {{/with-block}}`);\n\n this.assertText('In template - In Component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In template - In Component');\n }\n\n ['@test hasBlockParams is false when no block param supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n {{yield this}}\n {{else}}\n {{yield}} No Block Param!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block}}\n In block\n {{/with-block}}`);\n\n this.assertText('In block No Block Param!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In block No Block Param!');\n }\n\n ['@test static named positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}}{{age}}'\n });\n\n this.render('{{sample-component \"Quint\" 4}}');\n\n this.assertText('Quint4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Quint4');\n }\n\n ['@test dynamic named positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}}{{age}}'\n });\n\n this.render('{{sample-component myName myAge}}', {\n myName: 'Quint',\n myAge: 4\n });\n\n this.assertText('Quint4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Quint4');\n\n this.runTask(() => this.context.set('myName', 'Sergio'));\n\n this.assertText('Sergio4');\n\n this.runTask(() => this.context.set('myAge', 2));\n\n this.assertText('Sergio2');\n\n this.runTask(() => {\n this.context.set('myName', 'Quint');\n this.context.set('myAge', 4);\n });\n\n this.assertText('Quint4');\n }\n\n ['@test if a value is passed as a non-positional parameter, it raises an assertion']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{sample-component notMyName name=myName}}', {\n myName: 'Quint',\n notMyName: 'Sergio'\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n }\n\n ['@test yield to inverse']() {\n this.registerComponent('my-if', {\n template: _abstractTestCase.strip`\n {{#if predicate}}\n Yes:{{yield someValue}}\n {{else}}\n No:{{yield to=\"inverse\"}}\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#my-if predicate=activated someValue=42 as |result|}}\n Hello{{result}}\n {{else}}\n Goodbye\n {{/my-if}}`, {\n activated: true\n });\n\n this.assertText('Yes:Hello42');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Yes:Hello42');\n\n this.runTask(() => this.context.set('activated', false));\n\n this.assertText('No:Goodbye');\n\n this.runTask(() => this.context.set('activated', true));\n\n this.assertText('Yes:Hello42');\n }\n\n ['@test expression hasBlock inverse']() {\n this.registerComponent('check-inverse', {\n template: _abstractTestCase.strip`\n {{#if (hasBlock \"inverse\")}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-inverse}}{{/check-inverse}}\n {{#check-inverse}}{{else}}{{/check-inverse}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlock default']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (hasBlock)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{check-block}}\n {{#check-block}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams inverse']() {\n this.registerComponent('check-inverse', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams \"inverse\")}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-inverse}}{{/check-inverse}}\n {{#check-inverse as |something|}}{{/check-inverse}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'No' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams default']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-block}}{{/check-block}}\n {{#check-block as |something|}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test non-expression hasBlock']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{check-block}}\n {{#check-block}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams']() {\n this.registerComponent('check-params', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-params}}{{/check-params}}\n {{#check-params as |foo|}}{{/check-params}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test non-expression hasBlockParams']() {\n this.registerComponent('check-params', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-params}}{{/check-params}}\n {{#check-params as |foo|}}{{/check-params}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n });\n\n this.render(_abstractTestCase.strip`\n {{check-attr}}\n {{#check-attr}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock inverse expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n }, '');\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr}}{{else}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr as |something|}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams inverse expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n }, '');\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr as |something|}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'false' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if hasBlock \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{check-helper}}\n {{#check-helper}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock as an expression param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlock) \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{check-helper}}\n {{#check-helper}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock inverse as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlock \"inverse\") \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper}}{{else}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if hasBlockParams \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams as an expression param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlockParams) \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams inverse as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlockParams \"inverse\") \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'false' });\n\n this.assertStableRerender();\n }\n\n ['@test component in template of a yielding component should have the proper parentView'](assert) {\n let outer, innerTemplate, innerLayout;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n }),\n template: '{{x-inner-in-layout}}{{yield}}'\n });\n\n this.registerComponent('x-inner-in-template', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerTemplate = this;\n }\n })\n });\n\n this.registerComponent('x-inner-in-layout', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerLayout = this;\n }\n })\n });\n\n this.render('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}');\n\n assert.equal(innerTemplate.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n assert.equal(innerLayout.parentView, outer, 'receives the wrapping component as its parentView in layout');\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n\n this.runTask(() => this.rerender());\n\n assert.equal(innerTemplate.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n assert.equal(innerLayout.parentView, outer, 'receives the wrapping component as its parentView in layout');\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n }\n\n ['@test newly-added sub-components get correct parentView'](assert) {\n let outer, inner;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n })\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n inner = this;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#x-outer}}\n {{#if showInner}}\n {{x-inner}}\n {{/if}}\n {{/x-outer}}`, {\n showInner: false\n });\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n\n this.runTask(() => this.rerender());\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView (after rerender)');\n\n this.runTask(() => this.context.set('showInner', true));\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n assert.equal(inner.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n\n this.runTask(() => this.context.set('showInner', false));\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n }\n\n [\"@test when a property is changed during children's rendering\"](assert) {\n let outer, middle;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n },\n value: 1\n }),\n template: '{{#x-middle}}{{x-inner value=value}}{{/x-middle}}'\n });\n\n this.registerComponent('x-middle', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n middle = this;\n },\n value: null\n }),\n template: '
    {{value}}
    {{yield}}'\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n value: null,\n pushDataUp: (0, _metal.observer)('value', function () {\n middle.set('value', this.get('value'));\n })\n }),\n template: '
    {{value}}
    '\n });\n\n this.render('{{x-outer}}');\n\n assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner');\n assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner');\n assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)');\n\n let expectedBacktrackingMessage = /modified \"value\" twice on <.+?> in a single render\\. It was rendered in \"component:x-middle\" and modified in \"component:x-inner\"/;\n\n expectAssertion(() => {\n this.runTask(() => outer.set('value', 2));\n }, expectedBacktrackingMessage);\n }\n\n [\"@test when a shared dependency is changed during children's rendering\"]() {\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n value: 1,\n wrapper: _runtime.Object.create({ content: null })\n }),\n template: '
    {{wrapper.content}}
    {{x-inner value=value wrapper=wrapper}}'\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n this.get('wrapper').set('content', this.get('value'));\n },\n value: null\n }),\n template: '
    {{wrapper.content}}
    '\n });\n\n let expectedBacktrackingMessage = /modified \"wrapper\\.content\" twice on <.+?> in a single render\\. It was rendered in \"component:x-outer\" and modified in \"component:x-inner\"/;\n\n expectAssertion(() => {\n this.render('{{x-outer}}');\n }, expectedBacktrackingMessage);\n }\n\n ['@test non-block with each rendering child components']() {\n this.registerComponent('non-block', {\n template: _abstractTestCase.strip`\n In layout. {{#each items as |item|}}\n [{{child-non-block item=item}}]\n {{/each}}`\n });\n\n this.registerComponent('child-non-block', {\n template: 'Child: {{item}}.'\n });\n\n let items = (0, _runtime.A)(['Tom', 'Dick', 'Harry']);\n\n this.render('{{non-block items=items}}', { items });\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n\n this.runTask(() => this.context.get('items').pushObject('Sergio'));\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.][Child: Sergio.]');\n\n this.runTask(() => this.context.get('items').shiftObject());\n\n this.assertText('In layout. [Child: Dick.][Child: Harry.][Child: Sergio.]');\n\n this.runTask(() => this.context.set('items', (0, _runtime.A)(['Tom', 'Dick', 'Harry'])));\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n }\n\n ['@test specifying classNames results in correct class'](assert) {\n this.registerComponent('some-clicky-thing', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'button',\n classNames: ['foo', 'bar']\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#some-clicky-thing classNames=\"baz\"}}\n Click Me\n {{/some-clicky-thing}}`);\n\n // TODO: ember-view is no longer viewable in the classNames array. Bug or\n // feature?\n let expectedClassNames = ['ember-view', 'foo', 'bar', 'baz'];\n\n assert.ok(this.$('button').is('.foo.bar.baz.ember-view'), `the element has the correct classes: ${this.$('button').attr('class')}`);\n // `ember-view` is no longer in classNames.\n // assert.deepEqual(clickyThing.get('classNames'), expectedClassNames, 'classNames are properly combined');\n this.assertComponentElement(this.firstChild, {\n tagName: 'button',\n attrs: { class: (0, _testHelpers.classes)(expectedClassNames.join(' ')) }\n });\n\n this.runTask(() => this.rerender());\n\n assert.ok(this.$('button').is('.foo.bar.baz.ember-view'), `the element has the correct classes: ${this.$('button').attr('class')} (rerender)`);\n // `ember-view` is no longer in classNames.\n // assert.deepEqual(clickyThing.get('classNames'), expectedClassNames, 'classNames are properly combined (rerender)');\n this.assertComponentElement(this.firstChild, {\n tagName: 'button',\n attrs: { class: (0, _testHelpers.classes)(expectedClassNames.join(' ')) }\n });\n }\n\n ['@test specifying custom concatenatedProperties avoids clobbering']() {\n this.registerComponent('some-clicky-thing', {\n ComponentClass: _helpers.Component.extend({\n concatenatedProperties: ['blahzz'],\n blahzz: ['blark', 'pory']\n }),\n template: _abstractTestCase.strip`\n {{#each blahzz as |p|}}\n {{p}}\n {{/each}}\n - {{yield}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#some-clicky-thing blahzz=\"baz\"}}\n Click Me\n {{/some-clicky-thing}}`);\n\n this.assertText('blarkporybaz- Click Me');\n\n this.runTask(() => this.rerender());\n\n this.assertText('blarkporybaz- Click Me');\n }\n\n ['@test a two way binding flows upstream when consumed in the template']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: '{{bar}}'\n });\n\n this.render('{{localBar}} - {{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value - initial value');\n\n if (_env.DEBUG) {\n expectAssertion(() => {\n component.bar = 'foo-bar';\n }, /You must use set\\(\\) to set the `bar` property \\(of .+\\) to `foo-bar`\\./);\n\n this.assertText('initial value - initial value');\n }\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value - updated value');\n\n this.runTask(() => {\n component.set('bar', undefined);\n });\n\n this.assertText(' - ');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value - initial value');\n }\n\n ['@test a two way binding flows upstream through a CP when consumed in the template']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n\n bar: (0, _metal.computed)({\n get() {\n return this._bar;\n },\n\n set(key, value) {\n this._bar = value;\n return this._bar;\n }\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: '{{bar}}'\n });\n\n this.render('{{localBar}} - {{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value - updated value');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value - initial value');\n }\n\n ['@test a two way binding flows upstream through a CP without template consumption']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n\n bar: (0, _metal.computed)({\n get() {\n return this._bar;\n },\n\n set(key, value) {\n this._bar = value;\n return this._bar;\n }\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{localBar}}{{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value');\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value');\n }\n\n ['@test services can be injected into components']() {\n let service;\n this.registerService('name', _service.default.extend({\n init() {\n this._super(...arguments);\n service = this;\n },\n last: 'Jackson'\n }));\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n name: (0, _service.inject)()\n }),\n template: '{{name.last}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Jackson');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Jackson');\n\n this.runTask(() => {\n service.set('last', 'McGuffey');\n });\n\n this.assertText('McGuffey');\n\n this.runTask(() => {\n service.set('last', 'Jackson');\n });\n\n this.assertText('Jackson');\n }\n\n ['@test injecting an unknown service raises an exception']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n missingService: (0, _service.inject)()\n })\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, \"Attempting to inject an unknown injection: 'service:missingService'\");\n }\n\n ['@test throws if `this._super` is not called from `init`']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {}\n })\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You must call `this._super\\(...arguments\\);` when overriding `init` on a framework object. Please update .* to call `this._super\\(...arguments\\);` from `init`./);\n }\n\n ['@test should toggle visibility with isVisible'](assert) {\n let assertStyle = expected => {\n let matcher = (0, _testHelpers.styles)(expected);\n let actual = this.firstChild.getAttribute('style');\n\n assert.pushResult({\n result: matcher.match(actual),\n message: matcher.message(),\n actual,\n expected\n });\n };\n\n this.registerComponent('foo-bar', {\n template: `

    foo

    `\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" isVisible=visible}}`, {\n visible: false\n });\n\n assertStyle('display: none;');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n assertStyle('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n });\n assertStyle('display: none;');\n }\n\n ['@test isVisible does not overwrite component style']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n style: (0, _helpers.htmlSafe)('color: blue;')\n }),\n\n template: `

    foo

    `\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" isVisible=visible}}`, {\n visible: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue; display: none;') }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue;') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue; display: none;') }\n });\n }\n\n ['@test adds isVisible binding when style binding is missing and other bindings exist'](assert) {\n let assertStyle = expected => {\n let matcher = (0, _testHelpers.styles)(expected);\n let actual = this.firstChild.getAttribute('style');\n\n assert.pushResult({\n result: matcher.match(actual),\n message: matcher.message(),\n actual,\n expected\n });\n };\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['foo'],\n foo: 'bar'\n }),\n template: `

    foo

    `\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" foo=foo isVisible=visible}}`, {\n visible: false,\n foo: 'baz'\n });\n\n assertStyle('display: none;');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n\n assertStyle('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n (0, _metal.set)(this.context, 'foo', 'woo');\n });\n\n assertStyle('display: none;');\n assert.equal(this.firstChild.getAttribute('foo'), 'woo');\n }\n\n ['@test it can use readDOMAttr to read input value']() {\n let component;\n let assertElement = expectedValue => {\n // value is a property, not an attribute\n this.assertHTML(``);\n this.assert.equal(this.firstChild.value, expectedValue, 'value property is correct');\n this.assert.equal((0, _metal.get)(component, 'value'), expectedValue, 'component.get(\"value\") is correct');\n };\n\n this.registerComponent('one-way-input', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'input',\n attributeBindings: ['value'],\n\n init() {\n this._super(...arguments);\n component = this;\n },\n\n change() {\n let value = this.readDOMAttr('value');\n this.set('value', value);\n }\n })\n });\n\n this.render('{{one-way-input value=value}}', {\n value: 'foo'\n });\n\n assertElement('foo');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.firstChild.value = 'bar';\n this.$('input').trigger('change');\n });\n\n assertElement('bar');\n\n this.runTask(() => {\n this.firstChild.value = 'foo';\n this.$('input').trigger('change');\n });\n\n assertElement('foo');\n\n this.runTask(() => {\n (0, _metal.set)(component, 'value', 'bar');\n });\n\n assertElement('bar');\n\n this.runTask(() => {\n this.firstChild.value = 'foo';\n this.$('input').trigger('change');\n });\n\n assertElement('foo');\n }\n\n ['@test child triggers revalidate during parent destruction (GH#13846)']() {\n this.registerComponent('x-select', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'select',\n\n init() {\n this._super();\n this.options = (0, _runtime.A)([]);\n this.value = null;\n },\n\n updateValue() {\n var newValue = this.get('options.lastObject.value');\n\n this.set('value', newValue);\n },\n\n registerOption(option) {\n this.get('options').addObject(option);\n },\n\n unregisterOption(option) {\n this.get('options').removeObject(option);\n\n this.updateValue();\n }\n }),\n\n template: '{{yield this}}'\n });\n\n this.registerComponent('x-option', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'option',\n attributeBindings: ['selected'],\n\n didInsertElement() {\n this._super(...arguments);\n\n this.get('select').registerOption(this);\n },\n\n selected: (0, _metal.computed)('select.value', function () {\n return this.get('value') === this.get('select.value');\n }),\n\n willDestroyElement() {\n this._super(...arguments);\n this.get('select').unregisterOption(this);\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#x-select value=value as |select|}}\n {{#x-option value=\"1\" select=select}}1{{/x-option}}\n {{#x-option value=\"2\" select=select}}2{{/x-option}}\n {{/x-select}}\n `);\n\n this.teardown();\n\n this.assert.ok(true, 'no errors during teardown');\n }\n\n ['@test setting a property in willDestroyElement does not assert (GH#14273)'](assert) {\n assert.expect(2);\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.showFoo = true;\n },\n\n willDestroyElement() {\n this.set('showFoo', false);\n assert.ok(true, 'willDestroyElement was fired');\n this._super(...arguments);\n }\n }),\n\n template: `{{#if showFoo}}things{{/if}}`\n });\n\n this.render(`{{foo-bar}}`);\n\n this.assertText('things');\n }\n\n ['@test didReceiveAttrs fires after .init() but before observers become active'](assert) {\n let barCopyDidChangeCount = 0;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.didInit = true;\n },\n\n didReceiveAttrs() {\n assert.ok(this.didInit, 'expected init to have run before didReceiveAttrs');\n this.set('barCopy', this.attrs.bar.value + 1);\n },\n\n barCopyDidChange: (0, _metal.observer)('barCopy', () => {\n barCopyDidChangeCount++;\n })\n }),\n\n template: '{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar bar=bar}}`, { bar: 3 });\n\n this.assertText('3-4');\n\n assert.strictEqual(barCopyDidChangeCount, 1, 'expected observer firing for: barCopy');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 7));\n\n this.assertText('7-8');\n\n assert.strictEqual(barCopyDidChangeCount, 2, 'expected observer firing for: barCopy');\n }\n\n ['@test overriding didReceiveAttrs does not trigger deprecation'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n assert.equal(1, this.get('foo'), 'expected attrs to have correct value');\n }\n }),\n\n template: '{{foo}}-{{fooCopy}}-{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar foo=foo bar=bar}}`, { foo: 1, bar: 3 });\n }\n\n ['@test overriding didUpdateAttrs does not trigger deprecation'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didUpdateAttrs() {\n assert.equal(5, this.get('foo'), 'expected newAttrs to have new value');\n }\n }),\n\n template: '{{foo}}-{{fooCopy}}-{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar foo=foo bar=bar}}`, { foo: 1, bar: 3 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 5));\n }\n\n ['@test returning `true` from an action does not bubble if `target` is not specified (GH#14275)'](assert) {\n this.registerComponent('display-toggle', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n show() {\n assert.ok(true, 'display-toggle show action was called');\n return true;\n }\n }\n }),\n\n template: ``\n });\n\n this.render(`{{display-toggle}}`, {\n send() {\n assert.notOk(true, 'send should not be called when action is not \"subscribed\" to');\n }\n });\n\n this.assertText('Show');\n\n this.runTask(() => this.$('button').click());\n }\n\n ['@test returning `true` from an action bubbles to the `target` if specified'](assert) {\n assert.expect(4);\n\n this.registerComponent('display-toggle', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n show() {\n assert.ok(true, 'display-toggle show action was called');\n return true;\n }\n }\n }),\n\n template: ``\n });\n\n this.render(`{{display-toggle target=this}}`, {\n send(actionName) {\n assert.ok(true, 'send should be called when action is \"subscribed\" to');\n assert.equal(actionName, 'show');\n }\n });\n\n this.assertText('Show');\n\n this.runTask(() => this.$('button').click());\n }\n\n ['@test triggering an event only attempts to invoke an identically named method, if it actually is a function (GH#15228)'](assert) {\n assert.expect(3);\n\n let payload = ['arbitrary', 'event', 'data'];\n\n this.registerComponent('evented-component', {\n ComponentClass: _helpers.Component.extend({\n someTruthyProperty: true,\n\n init() {\n this._super(...arguments);\n this.trigger('someMethod', ...payload);\n this.trigger('someTruthyProperty', ...payload);\n },\n\n someMethod(...data) {\n assert.deepEqual(data, payload, 'the method `someMethod` should be called, when `someMethod` is triggered');\n },\n\n listenerForSomeMethod: (0, _metal.on)('someMethod', function (...data) {\n assert.deepEqual(data, payload, 'the listener `listenerForSomeMethod` should be called, when `someMethod` is triggered');\n }),\n\n listenerForSomeTruthyProperty: (0, _metal.on)('someTruthyProperty', function (...data) {\n assert.deepEqual(data, payload, 'the listener `listenerForSomeTruthyProperty` should be called, when `someTruthyProperty` is triggered');\n })\n })\n });\n\n this.render(`{{evented-component}}`);\n }\n\n ['@test component yielding in an {{#each}} has correct block values after rerendering (GH#14284)']() {\n this.registerComponent('list-items', {\n template: `{{#each items as |item|}}{{yield item}}{{/each}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#list-items items=items as |thing|}}\n |{{thing}}|\n\n {{#if editMode}}\n Remove {{thing}}\n {{/if}}\n {{/list-items}}\n `, {\n editMode: false,\n items: ['foo', 'bar', 'qux', 'baz']\n });\n\n this.assertText('|foo||bar||qux||baz|');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'editMode', true));\n\n this.assertText('|foo|Remove foo|bar|Remove bar|qux|Remove qux|baz|Remove baz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'editMode', false));\n\n this.assertText('|foo||bar||qux||baz|');\n }\n\n ['@test unimplimented positionalParams do not cause an error GH#14416']() {\n this.registerComponent('foo-bar', {\n template: 'hello'\n });\n\n this.render('{{foo-bar wat}}');\n this.assertText('hello');\n }\n\n ['@test using attrs for positional params']() {\n let MyComponent = _helpers.Component.extend();\n\n this.registerComponent('foo-bar', {\n ComponentClass: MyComponent.reopenClass({\n positionalParams: ['myVar']\n }),\n template: 'MyVar1: {{attrs.myVar}} {{myVar}} MyVar2: {{myVar2}} {{attrs.myVar2}}'\n });\n\n this.render('{{foo-bar 1 myVar2=2}}');\n\n this.assertText('MyVar1: 1 1 MyVar2: 2 2');\n }\n\n ['@feature(ember-glimmer-named-arguments) using named arguments for positional params']() {\n let MyComponent = _helpers.Component.extend();\n\n this.registerComponent('foo-bar', {\n ComponentClass: MyComponent.reopenClass({\n positionalParams: ['myVar']\n }),\n template: 'MyVar1: {{@myVar}} {{myVar}} MyVar2: {{myVar2}} {{@myVar2}}'\n });\n\n this.render('{{foo-bar 1 myVar2=2}}');\n\n this.assertText('MyVar1: 1 1 MyVar2: 2 2');\n }\n\n [\"@test can use `{{this}}` to emit the component's toString value [GH#14581]\"]() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n toString() {\n return 'special sauce goes here!';\n }\n }),\n template: '{{this}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('special sauce goes here!');\n }\n\n ['@test can use `{{this` to access paths on current context [GH#14581]']() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n instance = this;\n },\n\n foo: {\n bar: {\n baz: 'huzzah!'\n }\n }\n }),\n template: '{{this.foo.bar.baz}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('huzzah!');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'foo.bar.baz', 'yippie!'));\n\n this.assertText('yippie!');\n\n this.runTask(() => (0, _metal.set)(instance, 'foo.bar.baz', 'huzzah!'));\n\n this.assertText('huzzah!');\n }\n\n ['@test can use custom element in component layout']() {\n this.registerComponent('foo-bar', {\n template: 'Hi!'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Hi!');\n }\n\n ['@test can use nested custom element in component layout']() {\n this.registerComponent('foo-bar', {\n template: 'Hi!'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Hi!');\n }\n\n ['@feature(!ember-glimmer-named-arguments) can access properties off of rest style positionalParams array']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'things'\n }),\n // using `attrs` here to simulate `@things.length`\n template: `{{attrs.things.length}}`\n });\n\n this.render('{{foo-bar \"foo\" \"bar\" \"baz\"}}');\n\n this.assertText('3');\n }\n\n ['@feature(ember-glimmer-named-arguments) can access properties off of rest style positionalParams array']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'things'\n }),\n template: `{{@things.length}}`\n });\n\n this.render('{{foo-bar \"foo\" \"bar\" \"baz\"}}');\n\n this.assertText('3');\n }\n\n ['@test has attrs by didReceiveAttrs with native classes'](assert) {\n class FooBarComponent extends _helpers.Component {\n constructor(injections) {\n super(injections);\n // analagous to class field defaults\n this.foo = 'bar';\n }\n\n didReceiveAttrs() {\n assert.equal(this.foo, 'bar', 'received default attrs correctly');\n }\n }\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n }\n });\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Components test: curly components: jQuery disabled', class extends _testCase.RenderingTest {\n ['@test jQuery proxy is not available without jQuery']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n expectAssertion(() => {\n instance.$()[0];\n }, 'You cannot access this.$() with `jQuery` disabled.');\n }\n });\n } else {\n (0, _testCase.moduleFor)('Components test: curly components: jQuery enabled', class extends _testCase.RenderingTest {\n ['@test it has a jQuery proxy to the element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n let element1 = instance.$()[0];\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.$()[0];\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it scopes the jQuery proxy to the component element'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'inner'\n });\n\n this.render('outer{{foo-bar}}');\n\n let $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n\n this.runTask(() => this.rerender());\n\n $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/destroy-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Component destroy', class extends _testCase.RenderingTest {\n ['@test it correctly releases the destroyed components'](assert) {\n let FooBarComponent = _helpers.Component.extend({});\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n this.assertText('');\n\n assert.equal(this.env.destroyedComponents.length, 0, 'environment.destroyedComponents should be empty');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/dynamic-components-test', ['@ember/canary-features', '@ember/-internals/metal', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case'], function (_canaryFeatures, _metal, _views, _helpers, _abstractTestCase, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: dynamic components', class extends _testCase.RenderingTest {\n ['@test it can render a basic component with a static component name argument']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component \"foo-bar\" name=name}}', { name: 'Sarah' });\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Gavin'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello Gavin' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Sarah'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n }\n\n ['@test it can render a basic component with a dynamic component name argument']() {\n this.registerComponent('foo-bar', {\n template: 'hello {{name}} from foo-bar'\n });\n this.registerComponent('foo-bar-baz', {\n template: 'hello {{name}} from foo-bar-baz'\n });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben from foo-bar-baz'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'foo-bar');\n (0, _metal.set)(this.context, 'name', 'Alex');\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n }\n\n ['@test it has an element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it has the right parentView and childViews'](assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('{{component \"foo-bar\"}}');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n ['@test it can render a basic component with a block']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#component \"foo-bar\"}}hello{{/component}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it renders the layout with the component instance as the context']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n this.set('message', 'hello');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{message}}'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it preserves the outer context when yielding']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#component \"foo-bar\"}}{{message}}{{/component}}', {\n message: 'hello'\n });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test the component and its child components are destroyed'](assert) {\n let destroyed = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0 };\n\n this.registerComponent('foo-bar', {\n template: '{{id}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed[this.get('id')]++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond1}}\n {{#component \"foo-bar\" id=1}}\n {{#if cond2}}\n {{#component \"foo-bar\" id=2}}{{/component}}\n {{#if cond3}}\n {{#component \"foo-bar\" id=3}}\n {{#if cond4}}\n {{#component \"foo-bar\" id=4}}\n {{#if cond5}}\n {{#component \"foo-bar\" id=5}}{{/component}}\n {{#component \"foo-bar\" id=6}}{{/component}}\n {{#component \"foo-bar\" id=7}}{{/component}}\n {{/if}}\n {{#component \"foo-bar\" id=8}}{{/component}}\n {{/component}}\n {{/if}}\n {{/component}}\n {{/if}}\n {{/if}}\n {{/component}}\n {{/if}}`, {\n cond1: true,\n cond2: true,\n cond3: true,\n cond4: true,\n cond5: true\n });\n\n this.assertText('1 2 3 4 5 6 7 8 ');\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 0,\n 6: 0,\n 7: 0,\n 8: 0\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond5', false));\n\n this.assertText('1 2 3 4 8 ');\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 0\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond3', false);\n (0, _metal.set)(this.context, 'cond5', true);\n (0, _metal.set)(this.context, 'cond4', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', false);\n (0, _metal.set)(this.context, 'cond1', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 1,\n 2: 1,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n }\n\n ['@test component helper destroys underlying component when it is swapped out'](assert) {\n let destroyed = { 'foo-bar': 0, 'foo-bar-baz': 0 };\n let testContext = this;\n\n this.registerComponent('foo-bar', {\n template: 'hello from foo-bar',\n ComponentClass: _helpers.Component.extend({\n willDestroyElement() {\n assert.equal(testContext.$(`#${this.elementId}`).length, 1, 'element is still attached to the document');\n },\n\n willDestroy() {\n this._super();\n destroyed['foo-bar']++;\n }\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'hello from foo-bar-baz',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed['foo-bar-baz']++;\n }\n })\n });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar'\n });\n\n assert.deepEqual(destroyed, { 'foo-bar': 0, 'foo-bar-baz': 0 });\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, { 'foo-bar': 0, 'foo-bar-baz': 0 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n assert.deepEqual(destroyed, { 'foo-bar': 1, 'foo-bar-baz': 0 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar'));\n\n assert.deepEqual(destroyed, { 'foo-bar': 1, 'foo-bar-baz': 1 });\n }\n\n ['@test component helper with bound properties are updating correctly in init of component']() {\n this.registerComponent('foo-bar', {\n template: 'foo-bar {{location}} {{locationCopy}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n init: function () {\n this._super(...arguments);\n this.set('locationCopy', this.get('location'));\n }\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'foo-bar-baz {{location}} {{locationCopy}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n init: function () {\n this._super(...arguments);\n this.set('locationCopy', this.get('location'));\n }\n })\n });\n\n this.registerComponent('outer-component', {\n template: '{{#component componentName location=location}}arepas!{{/component}}',\n ComponentClass: _helpers.Component.extend({\n componentName: (0, _metal.computed)('location', function () {\n if (this.get('location') === 'Caracas') {\n return 'foo-bar';\n } else {\n return 'foo-bar-baz';\n }\n })\n })\n });\n\n this.render('{{outer-component location=location}}', {\n location: 'Caracas'\n });\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Loisaida'));\n\n this.assertText('foo-bar-baz Loisaida Loisaida arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Caracas'));\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n }\n\n ['@test component helper with actions'](assert) {\n this.registerComponent('inner-component', {\n template: 'inner-component {{yield}}',\n ComponentClass: _helpers.Component.extend({\n classNames: 'inner-component',\n didInsertElement() {\n // trigger action on click in absence of app's EventDispatcher\n let sendAction = this.eventHandler = () => {\n if (this.somethingClicked) {\n this.somethingClicked();\n }\n };\n this.element.addEventListener('click', sendAction);\n },\n willDestroyElement() {\n this.element.removeEventListener('click', this.eventHandler);\n }\n })\n });\n\n let actionTriggered = 0;\n this.registerComponent('outer-component', {\n template: '{{#component componentName somethingClicked=(action \"mappedAction\")}}arepas!{{/component}}',\n ComponentClass: _helpers.Component.extend({\n classNames: 'outer-component',\n componentName: 'inner-component',\n actions: {\n mappedAction() {\n actionTriggered++;\n }\n }\n })\n });\n\n this.render('{{outer-component}}');\n\n assert.equal(actionTriggered, 0, 'action was not triggered');\n\n this.runTask(() => {\n this.$('.inner-component').click();\n });\n\n assert.equal(actionTriggered, 1, 'action was triggered');\n }\n\n ['@test nested component helpers']() {\n this.registerComponent('foo-bar', {\n template: 'yippie! {{attrs.location}} {{yield}}'\n });\n this.registerComponent('baz-qux', {\n template: 'yummy {{attrs.location}} {{yield}}'\n });\n this.registerComponent('corge-grault', {\n template: 'delicious {{attrs.location}} {{yield}}'\n });\n\n this.render('{{#component componentName1 location=location}}{{#component componentName2 location=location}}arepas!{{/component}}{{/component}}', {\n componentName1: 'foo-bar',\n componentName2: 'baz-qux',\n location: 'Caracas'\n });\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Loisaida'));\n\n this.assertText('yippie! Loisaida yummy Loisaida arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName1', 'corge-grault'));\n\n this.assertText('delicious Loisaida yummy Loisaida arepas!');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName1', 'foo-bar');\n (0, _metal.set)(this.context, 'location', 'Caracas');\n });\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n }\n\n ['@test component with dynamic name argument resolving to non-existent component']() {\n expectAssertion(() => {\n this.render('{{component componentName}}', {\n componentName: 'does-not-exist'\n });\n }, /Could not find component named \"does-not-exist\"/);\n }\n\n ['@test component with static name argument for non-existent component']() {\n expectAssertion(() => {\n this.render('{{component \"does-not-exist\"}}');\n }, /Could not find component named \"does-not-exist\"/);\n }\n\n ['@test component with dynamic component name resolving to a component, then non-existent component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', undefined));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test component helper properly invalidates hash params inside an {{each}} invocation #11044']() {\n this.registerComponent('foo-bar', {\n template: '[{{internalName}} - {{name}}]',\n ComponentClass: _helpers.Component.extend({\n willRender() {\n // store internally available name to ensure that the name available in `this.attrs.name`\n // matches the template lookup name\n (0, _metal.set)(this, 'internalName', this.get('name'));\n }\n })\n });\n\n this.render('{{#each items as |item|}}{{component \"foo-bar\" name=item.name}}{{/each}}', {\n items: [{ name: 'Robert' }, { name: 'Jacquie' }]\n });\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', [{ name: 'Max' }, { name: 'James' }]));\n\n this.assertText('[Max - Max][James - James]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', [{ name: 'Robert' }, { name: 'Jacquie' }]));\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n }\n\n ['@test dashless components should not be found'](assert) {\n if (_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) {\n assert.ok(true, 'test is not applicable');\n return;\n }\n\n this.registerComponent('dashless2', { template: 'Do not render me!' });\n\n expectAssertion(() => {\n this.render('{{component \"dashless\"}}');\n }, /You cannot use 'dashless' as a component name. Component names must contain a hyphen./);\n }\n\n ['@test positional parameters does not clash when rendering different components']() {\n this.registerComponent('foo-bar', {\n template: 'hello {{name}} ({{age}}) from foo-bar',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'hello {{name}} ({{age}}) from foo-bar-baz',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n })\n });\n\n this.render('{{component componentName name age}}', {\n componentName: 'foo-bar',\n name: 'Alex',\n age: 29\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (29) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 22));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (22) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (22) from foo-bar-baz'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'foo-bar');\n (0, _metal.set)(this.context, 'name', 'Alex');\n (0, _metal.set)(this.context, 'age', 29);\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n }\n\n ['@test positional parameters does not pollute the attributes when changing components']() {\n this.registerComponent('normal-message', {\n template: 'Normal: {{something}}!',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['something']\n })\n });\n\n this.registerComponent('alternative-message', {\n template: 'Alternative: {{something}} {{somethingElse}}!',\n ComponentClass: _helpers.Component.extend({\n something: 'Another'\n }).reopenClass({\n positionalParams: ['somethingElse']\n })\n });\n\n this.render('{{component componentName message}}', {\n componentName: 'normal-message',\n message: 'Hello'\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'alternative-message'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Alternative: Another Hello!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'Hi'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Alternative: Another Hi!'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'normal-message');\n (0, _metal.set)(this.context, 'message', 'Hello');\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n }\n\n ['@test static arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{component \"sample-component\" \"Foo\" 4 \"Bar\" 5 \"Baz\" elementId=\"helper\"}}`);\n\n this.assertText('Foo4Bar5Baz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4Bar5Baz');\n }\n\n ['@test dynamic arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'n'\n }),\n template: _abstractTestCase.strip`\n {{#each n as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{component \"sample-component\" user1 user2}}`, {\n user1: 'Foo',\n user2: 4\n });\n\n this.assertText('Foo4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4');\n\n this.runTask(() => this.context.set('user1', 'Bar'));\n\n this.assertText('Bar4');\n\n this.runTask(() => this.context.set('user2', '5'));\n\n this.assertText('Bar5');\n\n this.runTask(() => {\n this.context.set('user1', 'Foo');\n this.context.set('user2', 4);\n });\n\n this.assertText('Foo4');\n }\n\n ['@test component helper emits useful backtracking re-render assertion message']() {\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person', { name: 'Alex' });\n }\n }),\n template: `Hi {{person.name}}! {{component \"error-component\" person=person}}`\n });\n\n this.registerComponent('error-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person.name', { name: 'Ben' });\n }\n }),\n template: '{{person.name}}'\n });\n\n let expectedBacktrackingMessage = /modified \"person\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"component:outer-component\" and modified in \"component:error-component\"/;\n\n expectAssertion(() => {\n this.render('{{component componentName}}', {\n componentName: 'outer-component'\n });\n }, expectedBacktrackingMessage);\n }\n });\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Components test: dynamic components: jQuery disabled', class extends _testCase.RenderingTest {\n ['@test jQuery proxy is not available without jQuery']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n expectAssertion(() => {\n instance.$()[0];\n }, 'You cannot access this.$() with `jQuery` disabled.');\n }\n });\n } else {\n (0, _testCase.moduleFor)('Components test: dynamic components : jQuery enabled', class extends _testCase.RenderingTest {\n ['@test it has a jQuery proxy to the element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n let element1 = instance.$()[0];\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.$()[0];\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it scopes the jQuery proxy to the component element'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'inner'\n });\n\n this.render('outer{{component \"foo-bar\"}}');\n\n let $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n\n this.runTask(() => this.rerender());\n\n $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/error-handling-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Errors thrown during render', class extends _testCase.RenderingTest {\n ['@test it can recover resets the transaction when an error is thrown during initial render'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake in init!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n assert.throws(() => {\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', { switch: true });\n }, /silly mistake in init/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n shouldThrow = false;\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during rerender'](assert) {\n let shouldThrow = false;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake in init!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n shouldThrow = true;\n\n assert.throws(() => {\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n }, /silly mistake in init/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n shouldThrow = false;\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during didInsertElement'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n assert.throws(() => {\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', { switch: true });\n }, /silly mistake/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n this.assertText('');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during destroy'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n destroy() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertText('hello');\n\n assert.throws(() => {\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n }, /silly mistake/);\n\n this.assertText('');\n\n shouldThrow = false;\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/fragment-components-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _abstractTestCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: fragment components', class extends _testCase.RenderingTest {\n getCustomDispatcherEvents() {\n return {\n hitDem: 'folks'\n };\n }\n\n ['@test fragments do not render an outer tag']() {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n init() {\n this._super();\n instance = this;\n this.foo = true;\n this.bar = 'bar';\n }\n });\n\n let template = `{{#if foo}}
    Hey
    {{/if}}{{yield bar}}`;\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n this.render(`{{#foo-bar as |bar|}}{{bar}}{{/foo-bar}}`);\n\n this.assertHTML(_abstractTestCase.strip`
    Hey
    bar`);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'foo', false));\n\n this.assertHTML(_abstractTestCase.strip`bar`);\n\n this.runTask(() => (0, _metal.set)(instance, 'bar', 'bizz'));\n\n this.assertHTML(_abstractTestCase.strip`bizz`);\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'bar', 'bar');\n (0, _metal.set)(instance, 'foo', true);\n });\n }\n\n ['@test throws an error if an event function is defined in a tagless component']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n click() {}\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You can not define a function that handles DOM events in the .* tagless component since it doesn't have any DOM element./);\n }\n\n ['@test throws an error if a custom defined event function is defined in a tagless component']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n folks() {}\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You can not define a function that handles DOM events in the .* tagless component since it doesn't have any DOM element./);\n }\n\n ['@test throws an error if `tagName` is an empty string and `classNameBindings` are specified']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n foo: true,\n classNameBindings: ['foo:is-foo:is-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `classNameBindings` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `attributeBindings` are specified']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n attributeBindings: ['href']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `attributeBindings` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `elementId` is specified via JS']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n elementId: 'turntUp'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `elementId` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `elementId` is specified via template']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar elementId='turntUp'}}{{/foo-bar}}`);\n }, /You cannot use `elementId` on a tag-less component/);\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via JS']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n id: 'baz'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via template']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n this.render(`{{#foo-bar id='baz'}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is bound property specified via template']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n this.render(`{{#foo-bar id=fooBarId}}{{/foo-bar}}`, { fooBarId: 'baz' });\n\n this.assertText('baz');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBarId', 'qux'));\n\n this.assertText('qux');\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBarId', 'baz'));\n\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via template and passed to child component']() {\n let fooBarTemplate = `{{#baz-child id=id}}{{/baz-child}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n let BazChildComponent = _helpers.Component.extend();\n let bazChildTemplate = `{{id}}`;\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: fooBarTemplate\n });\n this.registerComponent('baz-child', {\n ComponentClass: BazChildComponent,\n template: bazChildTemplate\n });\n this.render(`{{#foo-bar id='baz'}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test throws an error if when $() is accessed on component where `tagName` is an empty string']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n init() {\n this._super();\n this.$();\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot access this.\\$\\(\\) on a component with `tagName: \\'\\'` specified/);\n }\n\n ['@test renders a contained view with omitted start tag and tagless parent view context']() {\n this.registerComponent('root-component', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'section'\n }),\n template: '{{frag-ment}}'\n });\n\n this.registerComponent('frag-ment', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n template: '{{my-span}}'\n });\n\n this.registerComponent('my-span', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'span'\n }),\n template: 'dab'\n });\n\n this.render(`{{root-component}}`);\n\n this.assertElement(this.firstChild, { tagName: 'section' });\n this.assertElement(this.firstChild.firstElementChild, {\n tagName: 'span'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, { tagName: 'section' });\n this.assertElement(this.firstChild.firstElementChild, {\n tagName: 'span'\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/instrumentation-compile-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/instrumentation'], function (_testCase, _helpers, _instrumentation) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components compile instrumentation', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.resetEvents();\n\n (0, _instrumentation.subscribe)('render.getComponentDefinition', {\n before: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.before.push(payload);\n }\n },\n after: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.after.push(payload);\n }\n }\n });\n }\n\n resetEvents() {\n this.expected = {\n before: [],\n after: []\n };\n\n this.actual = {\n before: [],\n after: []\n };\n }\n\n teardown() {\n this.assert.deepEqual(this.actual.before, [], 'No unexpected events (before)');\n this.assert.deepEqual(this.actual.after, [], 'No unexpected events (after)');\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test it should only receive an instrumentation event for initial render']() {\n let testCase = this;\n\n let BaseClass = _helpers.Component.extend({\n tagName: '',\n\n willRender() {\n testCase.expected.before.push(this);\n testCase.expected.after.unshift(this);\n }\n });\n\n this.registerComponent('x-bar', {\n template: '[x-bar: {{bar}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.render(`[-top-level: {{foo}}] {{x-bar bar=bar}}`, {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertText('[-top-level: foo] [x-bar: bar]');\n\n this.assertEvents('after initial render');\n\n this.runTask(() => this.rerender());\n\n this.assertEvents('after no-op rerender');\n }\n\n assertEvents(label) {\n let { actual, expected } = this;\n this.assert.strictEqual(actual.before.length, actual.after.length, `${label}: before and after callbacks should be balanced`);\n\n this._assertEvents(`${label} (before):`, actual.before, expected.before);\n this._assertEvents(`${label} (after):`, actual.before, expected.before);\n\n this.resetEvents();\n }\n\n _assertEvents(label, actual, expected) {\n this.assert.equal(actual.length, expected.length, `${label}: expected ${expected.length} and got ${actual.length}`);\n\n actual.forEach((payload, i) => this.assertPayload(payload, expected[i]));\n }\n\n assertPayload(payload, component) {\n this.assert.equal(payload.object, component._debugContainerKey, 'payload.object');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/instrumentation-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/instrumentation'], function (_testCase, _helpers, _metal, _instrumentation) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components instrumentation', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.resetEvents();\n\n (0, _instrumentation.subscribe)('render.component', {\n before: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.before.push(payload);\n }\n },\n after: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.after.push(payload);\n }\n }\n });\n }\n\n resetEvents() {\n this.expected = {\n before: [],\n after: []\n };\n\n this.actual = {\n before: [],\n after: []\n };\n }\n\n teardown() {\n this.assert.deepEqual(this.actual.before, [], 'No unexpected events (before)');\n this.assert.deepEqual(this.actual.after, [], 'No unexpected events (after)');\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test zomg'](assert) {\n assert.ok(true);\n }\n\n ['@test it should receive an instrumentation event for both initial render and updates']() {\n let testCase = this;\n\n let BaseClass = _helpers.Component.extend({\n tagName: '',\n\n willRender() {\n testCase.expected.before.push(this);\n testCase.expected.after.unshift(this);\n }\n });\n\n this.registerComponent('x-bar', {\n template: '[x-bar: {{bar}}] {{yield}}',\n ComponentClass: BaseClass.extend()\n });\n\n this.registerComponent('x-baz', {\n template: '[x-baz: {{baz}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.registerComponent('x-bat', {\n template: '[x-bat: {{bat}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.render(`[-top-level: {{foo}}] {{#x-bar bar=bar}}{{x-baz baz=baz}}{{/x-bar}} {{x-bat bat=bat}}`, {\n foo: 'foo',\n bar: 'bar',\n baz: 'baz',\n bat: 'bat'\n });\n\n this.assertText('[-top-level: foo] [x-bar: bar] [x-baz: baz] [x-bat: bat]');\n\n this.assertEvents('after initial render', true);\n\n this.runTask(() => this.rerender());\n\n this.assertEvents('after no-op rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'FOO'));\n\n this.assertEvents('after updating top-level');\n\n this.runTask(() => (0, _metal.set)(this.context, 'baz', 'BAZ'));\n\n this.assertEvents('after updating inner-most');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', 'BAR');\n (0, _metal.set)(this.context, 'bat', 'BAT');\n });\n\n this.assertEvents('after updating the rest');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', 'BAR');\n (0, _metal.set)(this.context, 'baz', 'BAZ');\n (0, _metal.set)(this.context, 'bat', 'BAT');\n });\n\n this.assertEvents('after reset');\n }\n\n assertEvents(label, initialRender = false) {\n let { actual, expected } = this;\n\n this.assert.strictEqual(actual.before.length, actual.after.length, `${label}: before and after callbacks should be balanced`);\n\n this._assertEvents(`${label} (before):`, actual.before, expected.before, initialRender);\n this._assertEvents(`${label} (after):`, actual.before, expected.before, initialRender);\n\n this.resetEvents();\n }\n\n _assertEvents(label, actual, expected, initialRender) {\n this.assert.equal(actual.length, expected.length, `${label}: expected ${expected.length} and got ${actual.length}`);\n\n actual.forEach((payload, i) => this.assertPayload(payload, expected[i], initialRender));\n }\n\n assertPayload(payload, component, initialRender) {\n this.assert.equal(payload.object, component.toString(), 'payload.object');\n this.assert.ok(payload.containerKey, 'the container key should be present');\n this.assert.equal(payload.containerKey, component._debugContainerKey, 'payload.containerKey');\n this.assert.equal(payload.view, component, 'payload.view');\n this.assert.strictEqual(payload.initialRender, initialRender, 'payload.initialRender');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/life-cycle-test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/utils', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _helpers, _abstractTestCase, _testCase, _views, _testHelpers, _utils, _internalTestHelpers) {\n 'use strict';\n\n class LifeCycleHooksTest extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.hooks = [];\n this.components = {};\n this.componentRegistry = [];\n this.teardownAssertions = [];\n this.viewRegistry = this.owner.lookup('-view-registry:main');\n }\n\n afterEach() {\n super.afterEach();\n\n for (let i = 0; i < this.teardownAssertions.length; i++) {\n this.teardownAssertions[i]();\n }\n }\n\n get isInteractive() {\n return true;\n }\n\n getBootOptions() {\n return {\n isInteractive: this.isInteractive\n };\n }\n\n /* abstract */\n get ComponentClass() {\n throw new Error('Not implemented: `ComponentClass`');\n }\n\n /* abstract */\n invocationFor() /* name, namedArgs = {} */{\n throw new Error('Not implemented: `invocationFor`');\n }\n\n /* abstract */\n attrFor() /* name */{\n throw new Error('Not implemented: `attrFor`');\n }\n\n get boundHelpers() {\n return {\n invoke: bind(this.invocationFor, this),\n attr: bind(this.attrFor, this)\n };\n }\n\n assertRegisteredViews(label) {\n let viewRegistry = this.viewRegistry;\n let topLevelId = (0, _views.getViewId)(this.component);\n let actual = Object.keys(viewRegistry).sort().filter(id => id !== topLevelId);\n\n if (this.isInteractive) {\n let expected = this.componentRegistry.sort();\n\n this.assert.deepEqual(actual, expected, 'registered views - ' + label);\n } else {\n this.assert.deepEqual(actual, [], 'no views should be registered for non-interactive mode');\n }\n }\n\n registerComponent(name, { template = null }) {\n let pushComponent = instance => {\n this.components[name] = instance;\n this.componentRegistry.push((0, _views.getViewId)(instance));\n };\n\n let removeComponent = instance => {\n let index = this.componentRegistry.indexOf(instance);\n this.componentRegistry.splice(index, 1);\n\n delete this.components[name];\n };\n\n let pushHook = (hookName, args) => {\n this.hooks.push(hook(name, hookName, args));\n };\n\n let assertParentView = (hookName, instance) => {\n this.assert.ok(instance.parentView, `parentView should be present in ${hookName}`);\n\n if (hookName === 'willDestroyElement') {\n this.assert.ok(instance.parentView.childViews.indexOf(instance) !== -1, `view is still connected to parentView in ${hookName}`);\n }\n };\n\n let assertElement = (hookName, instance, inDOM = true) => {\n if (instance.tagName === '') {\n return;\n }\n\n this.assert.ok((0, _views.getViewElement)(instance), `element should be present on ${instance} during ${hookName}`);\n\n if (this.isInteractive) {\n this.assert.ok(instance.element, `this.element should be present on ${instance} during ${hookName}`);\n this.assert.equal(document.body.contains(instance.element), inDOM, `element for ${instance} ${inDOM ? 'should' : 'should not'} be in the DOM during ${hookName}`);\n } else {\n this.assert.throws(() => instance.element, /Accessing `this.element` is not allowed in non-interactive environments/);\n }\n };\n\n let assertNoElement = (hookName, instance) => {\n this.assert.strictEqual((0, _views.getViewElement)(instance), null, `element should not be present in ${hookName}`);\n\n if (this.isInteractive) {\n this.assert.strictEqual(instance.element, null, `this.element should not be present in ${hookName}`);\n } else {\n this.assert.throws(() => instance.element, /Accessing `this.element` is not allowed in non-interactive environments/);\n }\n };\n\n let assertState = (hookName, expectedState, instance) => {\n this.assert.equal(instance._state, expectedState, `within ${hookName} the expected _state is ${expectedState}`);\n };\n\n let { isInteractive } = this;\n\n let ComponentClass = this.ComponentClass.extend({\n init() {\n this._super(...arguments);\n\n this.isInitialRender = true;\n this.componentName = name;\n pushHook('init');\n pushComponent(this);\n assertParentView('init', this);\n assertNoElement('init', this);\n assertState('init', 'preRender', this);\n\n this.on('init', () => pushHook('on(init)'));\n\n (0, _runloop.schedule)('afterRender', () => {\n this.isInitialRender = false;\n });\n },\n\n didReceiveAttrs(options) {\n pushHook('didReceiveAttrs', options);\n assertParentView('didReceiveAttrs', this);\n\n if (this.isInitialRender) {\n assertNoElement('didReceiveAttrs', this);\n assertState('didReceiveAttrs', 'preRender', this);\n } else {\n assertElement('didReceiveAttrs', this);\n\n if (isInteractive) {\n assertState('didReceiveAttrs', 'inDOM', this);\n } else {\n assertState('didReceiveAttrs', 'hasElement', this);\n }\n }\n },\n\n willInsertElement() {\n pushHook('willInsertElement');\n assertParentView('willInsertElement', this);\n assertElement('willInsertElement', this, false);\n assertState('willInsertElement', 'hasElement', this);\n },\n\n willRender() {\n pushHook('willRender');\n assertParentView('willRender', this);\n\n if (this.isInitialRender) {\n assertNoElement('willRender', this, false);\n assertState('willRender', 'preRender', this);\n } else {\n assertElement('willRender', this);\n assertState('willRender', 'inDOM', this);\n }\n },\n\n didInsertElement() {\n pushHook('didInsertElement');\n assertParentView('didInsertElement', this);\n assertElement('didInsertElement', this);\n assertState('didInsertElement', 'inDOM', this);\n },\n\n didRender() {\n pushHook('didRender');\n assertParentView('didRender', this);\n assertElement('didRender', this);\n assertState('didRender', 'inDOM', this);\n },\n\n didUpdateAttrs(options) {\n pushHook('didUpdateAttrs', options);\n assertParentView('didUpdateAttrs', this);\n\n if (isInteractive) {\n assertState('didUpdateAttrs', 'inDOM', this);\n } else {\n assertState('didUpdateAttrs', 'hasElement', this);\n }\n },\n\n willUpdate(options) {\n pushHook('willUpdate', options);\n assertParentView('willUpdate', this);\n assertElement('willUpdate', this);\n assertState('willUpdate', 'inDOM', this);\n },\n\n didUpdate(options) {\n pushHook('didUpdate', options);\n assertParentView('didUpdate', this);\n assertElement('didUpdate', this);\n assertState('didUpdate', 'inDOM', this);\n },\n\n willDestroyElement() {\n pushHook('willDestroyElement');\n assertParentView('willDestroyElement', this);\n assertElement('willDestroyElement', this);\n assertState('willDestroyElement', 'inDOM', this);\n },\n\n willClearRender() {\n pushHook('willClearRender');\n assertParentView('willClearRender', this);\n assertElement('willClearRender', this);\n assertState('willClearRender', 'inDOM', this);\n },\n\n didDestroyElement() {\n pushHook('didDestroyElement');\n assertNoElement('didDestroyElement', this);\n assertState('didDestroyElement', 'destroying', this);\n },\n\n willDestroy() {\n pushHook('willDestroy');\n removeComponent(this);\n\n this._super(...arguments);\n }\n });\n\n super.registerComponent(name, { ComponentClass, template });\n }\n\n assertHooks({ label, interactive, nonInteractive }) {\n let rawHooks = this.isInteractive ? interactive : nonInteractive;\n let hooks = rawHooks.map(raw => hook(...raw));\n this.assert.deepEqual(json(this.hooks), json(hooks), label);\n this.hooks = [];\n }\n\n ['@test lifecycle hooks are invoked in a predictable order']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-top', {\n template: _abstractTestCase.strip`\n
    \n Twitter: {{${attr('twitter')}}}|\n ${invoke('the-middle', { name: string('Tom Dale') })}\n
    `\n });\n\n this.registerComponent('the-middle', {\n template: _abstractTestCase.strip`\n
    \n Name: {{${attr('name')}}}|\n ${invoke('the-bottom', { website: string('tomdale.net') })}\n
    `\n });\n\n this.registerComponent('the-bottom', {\n template: _abstractTestCase.strip`\n
    \n Website: {{${attr('website')}}}\n
    `\n });\n\n this.render(invoke('the-top', { twitter: expr('twitter') }), {\n twitter: '@tomdale'\n });\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'],\n\n // Async hooks\n\n ['the-bottom', 'didInsertElement'], ['the-bottom', 'didRender'], ['the-middle', 'didInsertElement'], ['the-middle', 'didRender'], ['the-top', 'didInsertElement'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.components['the-bottom'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (bottom)',\n\n interactive: [\n // Sync hooks\n ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'], ['the-bottom', 'willUpdate'], ['the-bottom', 'willRender'],\n\n // Async hooks\n\n ['the-bottom', 'didUpdate'], ['the-bottom', 'didRender'], ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-middle'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (middle)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'],\n\n // Async hooks\n\n ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-top'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (top)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'willUpdate'], ['the-top', 'willRender'],\n\n // Async hooks\n\n ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'twitter', '@horsetomdale'));\n\n this.assertText('Twitter: @horsetomdale|Name: Tom Dale|Website: tomdale.net');\n\n // Because the `twitter` attr is only used by the topmost component,\n // and not passed down, we do not expect to see lifecycle hooks\n // called for child components. If the `didReceiveAttrs` hook used\n // the new attribute to rerender itself imperatively, that would result\n // in lifecycle hooks being invoked for the child.\n\n this.assertHooks({\n label: 'after update',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willUpdate'], ['the-top', 'willRender'],\n\n // Async hooks\n\n ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-top', 'willDestroyElement'], ['the-top', 'willClearRender'], ['the-middle', 'willDestroyElement'], ['the-middle', 'willClearRender'], ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'], ['the-top', 'didDestroyElement'], ['the-middle', 'didDestroyElement'], ['the-bottom', 'didDestroyElement'], ['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']],\n\n nonInteractive: [['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test lifecycle hooks are invoked in a correct sibling order']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-parent', {\n template: _abstractTestCase.strip`\n
    \n ${invoke('the-first-child', { twitter: expr(attr('twitter')) })}|\n ${invoke('the-second-child', { name: expr(attr('name')) })}|\n ${invoke('the-last-child', { website: expr(attr('website')) })}\n
    `\n });\n\n this.registerComponent('the-first-child', {\n template: `Twitter: {{${attr('twitter')}}}`\n });\n\n this.registerComponent('the-second-child', {\n template: `Name: {{${attr('name')}}}`\n });\n\n this.registerComponent('the-last-child', {\n template: `Website: {{${attr('website')}}}`\n });\n\n this.render(invoke('the-parent', {\n twitter: expr('twitter'),\n name: expr('name'),\n website: expr('website')\n }), {\n twitter: '@tomdale',\n name: 'Tom Dale',\n website: 'tomdale.net'\n });\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'init'], ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-parent', 'willRender'], ['the-parent', 'willInsertElement'], ['the-first-child', 'init'], ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-first-child', 'willRender'], ['the-first-child', 'willInsertElement'], ['the-second-child', 'init'], ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-second-child', 'willRender'], ['the-second-child', 'willInsertElement'], ['the-last-child', 'init'], ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs'], ['the-last-child', 'willRender'], ['the-last-child', 'willInsertElement'],\n\n // Async hooks\n\n ['the-first-child', 'didInsertElement'], ['the-first-child', 'didRender'], ['the-second-child', 'didInsertElement'], ['the-second-child', 'didRender'], ['the-last-child', 'didInsertElement'], ['the-last-child', 'didRender'], ['the-parent', 'didInsertElement'], ['the-parent', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-parent', 'init'], ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-first-child', 'init'], ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-second-child', 'init'], ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-last-child', 'init'], ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.components['the-first-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (first child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-first-child', 'willUpdate'], ['the-first-child', 'willRender'],\n\n // Async hooks\n\n ['the-first-child', 'didUpdate'], ['the-first-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-second-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (second child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-second-child', 'willUpdate'], ['the-second-child', 'willRender'],\n\n // Async hooks\n\n ['the-second-child', 'didUpdate'], ['the-second-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-last-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (last child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-last-child', 'willUpdate'], ['the-last-child', 'willRender'],\n\n // Async hooks\n\n ['the-last-child', 'didUpdate'], ['the-last-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-parent'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (parent)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'],\n\n // Async hooks\n\n ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n twitter: '@horsetomdale',\n name: 'Horse Tom Dale',\n website: 'horsetomdale.net'\n }));\n\n this.assertText('Twitter: @horsetomdale|Name: Horse Tom Dale|Website: horsetomdale.net');\n\n this.assertHooks({\n label: 'after update',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'didUpdateAttrs'], ['the-parent', 'didReceiveAttrs'], ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-first-child', 'didUpdateAttrs'], ['the-first-child', 'didReceiveAttrs'], ['the-first-child', 'willUpdate'], ['the-first-child', 'willRender'], ['the-second-child', 'didUpdateAttrs'], ['the-second-child', 'didReceiveAttrs'], ['the-second-child', 'willUpdate'], ['the-second-child', 'willRender'], ['the-last-child', 'didUpdateAttrs'], ['the-last-child', 'didReceiveAttrs'], ['the-last-child', 'willUpdate'], ['the-last-child', 'willRender'],\n\n // Async hooks\n\n ['the-first-child', 'didUpdate'], ['the-first-child', 'didRender'], ['the-second-child', 'didUpdate'], ['the-second-child', 'didRender'], ['the-last-child', 'didUpdate'], ['the-last-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-parent', 'didUpdateAttrs'], ['the-parent', 'didReceiveAttrs'], ['the-first-child', 'didUpdateAttrs'], ['the-first-child', 'didReceiveAttrs'], ['the-second-child', 'didUpdateAttrs'], ['the-second-child', 'didReceiveAttrs'], ['the-last-child', 'didUpdateAttrs'], ['the-last-child', 'didReceiveAttrs']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-parent', 'willDestroyElement'], ['the-parent', 'willClearRender'], ['the-first-child', 'willDestroyElement'], ['the-first-child', 'willClearRender'], ['the-second-child', 'willDestroyElement'], ['the-second-child', 'willClearRender'], ['the-last-child', 'willDestroyElement'], ['the-last-child', 'willClearRender'], ['the-parent', 'didDestroyElement'], ['the-first-child', 'didDestroyElement'], ['the-second-child', 'didDestroyElement'], ['the-last-child', 'didDestroyElement'], ['the-parent', 'willDestroy'], ['the-first-child', 'willDestroy'], ['the-second-child', 'willDestroy'], ['the-last-child', 'willDestroy']],\n\n nonInteractive: [['the-parent', 'willDestroy'], ['the-first-child', 'willDestroy'], ['the-second-child', 'willDestroy'], ['the-last-child', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test passing values through attrs causes lifecycle hooks to fire if the attribute values have changed']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-top', {\n template: _abstractTestCase.strip`\n
    \n Top: ${invoke('the-middle', { twitterTop: expr(attr('twitter')) })}\n
    `\n });\n\n this.registerComponent('the-middle', {\n template: _abstractTestCase.strip`\n
    \n Middle: ${invoke('the-bottom', {\n twitterMiddle: expr(attr('twitterTop'))\n })}\n
    `\n });\n\n this.registerComponent('the-bottom', {\n template: _abstractTestCase.strip`\n
    \n Bottom: {{${attr('twitterMiddle')}}}\n
    `\n });\n\n this.render(invoke('the-top', { twitter: expr('twitter') }), {\n twitter: '@tomdale'\n });\n\n this.assertText('Top: Middle: Bottom: @tomdale');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'],\n\n // Async hooks\n\n ['the-bottom', 'didInsertElement'], ['the-bottom', 'didRender'], ['the-middle', 'didInsertElement'], ['the-middle', 'didRender'], ['the-top', 'didInsertElement'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'twitter', '@horsetomdale'));\n\n this.assertText('Top: Middle: Bottom: @horsetomdale');\n\n // Because the `twitter` attr is used by the all of the components,\n // the lifecycle hooks are invoked for all components.\n\n this.assertHooks({\n label: 'after updating (root)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'didUpdateAttrs'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'], ['the-bottom', 'didUpdateAttrs'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willUpdate'], ['the-bottom', 'willRender'],\n\n // Async hooks\n\n ['the-bottom', 'didUpdate'], ['the-bottom', 'didRender'], ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'didUpdateAttrs'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'didUpdateAttrs'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.rerender());\n\n this.assertText('Top: Middle: Bottom: @horsetomdale');\n\n // In this case, because the attrs are passed down, all child components are invoked.\n\n this.assertHooks({\n label: 'after no-op rernder (root)',\n interactive: [],\n nonInteractive: []\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-top', 'willDestroyElement'], ['the-top', 'willClearRender'], ['the-middle', 'willDestroyElement'], ['the-middle', 'willClearRender'], ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'], ['the-top', 'didDestroyElement'], ['the-middle', 'didDestroyElement'], ['the-bottom', 'didDestroyElement'], ['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']],\n\n nonInteractive: [['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test components rendered from `{{each}}` have correct life-cycle hooks to be called']() {\n let { invoke } = this.boundHelpers;\n\n this.registerComponent('nested-item', { template: `{{yield}}` });\n\n this.registerComponent('an-item', {\n template: _abstractTestCase.strip`\n {{#nested-item}}Item: {{count}}{{/nested-item}}\n `\n });\n\n this.registerComponent('no-items', {\n template: _abstractTestCase.strip`\n {{#nested-item}}Nothing to see here{{/nested-item}}\n `\n });\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n ${invoke('an-item', { count: expr('item') })}\n {{else}}\n ${invoke('no-items')}\n {{/each}}\n `, {\n items: [1, 2, 3, 4, 5]\n });\n\n this.assertText('Item: 1Item: 2Item: 3Item: 4Item: 5');\n this.assertRegisteredViews('intial render');\n\n let initialHooks = () => {\n let ret = [['an-item', 'init'], ['an-item', 'on(init)'], ['an-item', 'didReceiveAttrs']];\n if (this.isInteractive) {\n ret.push(['an-item', 'willRender'], ['an-item', 'willInsertElement']);\n }\n ret.push(['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs']);\n if (this.isInteractive) {\n ret.push(['nested-item', 'willRender'], ['nested-item', 'willInsertElement']);\n }\n return ret;\n };\n\n let initialAfterRenderHooks = () => {\n if (this.isInteractive) {\n return [['nested-item', 'didInsertElement'], ['nested-item', 'didRender'], ['an-item', 'didInsertElement'], ['an-item', 'didRender']];\n } else {\n return [];\n }\n };\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n ...initialHooks(1), ...initialHooks(2), ...initialHooks(3), ...initialHooks(4), ...initialHooks(5),\n\n // Async hooks\n ...initialAfterRenderHooks(5), ...initialAfterRenderHooks(4), ...initialAfterRenderHooks(3), ...initialAfterRenderHooks(2), ...initialAfterRenderHooks(1)],\n\n nonInteractive: [\n // Sync hooks\n ...initialHooks(1), ...initialHooks(2), ...initialHooks(3), ...initialHooks(4), ...initialHooks(5),\n\n // Async hooks\n ...initialAfterRenderHooks(5), ...initialAfterRenderHooks(4), ...initialAfterRenderHooks(3), ...initialAfterRenderHooks(2), ...initialAfterRenderHooks(1)]\n });\n\n // TODO: Is this correct? Should childViews be populated in non-interactive mode?\n if (this.isInteractive) {\n this.assert.equal(this.component.childViews.length, 5, 'childViews precond');\n }\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', []));\n\n // TODO: Is this correct? Should childViews be populated in non-interactive mode?\n if (this.isInteractive) {\n this.assert.equal(this.component.childViews.length, 1, 'childViews updated');\n }\n\n this.assertText('Nothing to see here');\n\n this.assertHooks({\n label: 'reset to empty array',\n\n interactive: [['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['no-items', 'init'], ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['no-items', 'willRender'], ['no-items', 'willInsertElement'], ['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['nested-item', 'willRender'], ['nested-item', 'willInsertElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['nested-item', 'didInsertElement'], ['nested-item', 'didRender'], ['no-items', 'didInsertElement'], ['no-items', 'didRender'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy']],\n\n nonInteractive: [['no-items', 'init'], ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['no-items', 'willDestroyElement'], ['no-items', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['no-items', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['no-items', 'willDestroy'], ['nested-item', 'willDestroy']],\n\n nonInteractive: [['no-items', 'willDestroy'], ['nested-item', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n }\n\n class CurlyComponentsTest extends LifeCycleHooksTest {\n get ComponentClass() {\n return _helpers.Component;\n }\n\n invocationFor(name, namedArgs = {}) {\n let attrs = Object.keys(namedArgs).map(k => `${k}=${this.val(namedArgs[k])}`).join(' ');\n return `{{${name} ${attrs}}}`;\n }\n\n attrFor(name) {\n return `${name}`;\n }\n\n /* private */\n val(value) {\n if (value.isString) {\n return JSON.stringify(value.value);\n } else if (value.isExpr) {\n return `(readonly ${value.value})`;\n } else {\n throw new Error(`Unknown value: ${value}`);\n }\n }\n }\n\n (0, _testCase.moduleFor)('Components test: interactive lifecycle hooks (curly components)', class extends CurlyComponentsTest {\n get isInteractive() {\n return true;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: non-interactive lifecycle hooks (curly components)', class extends CurlyComponentsTest {\n get isInteractive() {\n return false;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: interactive lifecycle hooks (tagless curly components)', class extends CurlyComponentsTest {\n get ComponentClass() {\n return _helpers.Component.extend({ tagName: '' });\n }\n\n get isInteractive() {\n return true;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: non-interactive lifecycle hooks (tagless curly components)', class extends CurlyComponentsTest {\n get ComponentClass() {\n return _helpers.Component.extend({ tagName: '' });\n }\n\n get isInteractive() {\n return false;\n }\n });\n\n (0, _testCase.moduleFor)('Run loop and lifecycle hooks', class extends _testCase.RenderingTest {\n ['@test afterRender set']() {\n let ComponentClass = _helpers.Component.extend({\n width: '5',\n didInsertElement() {\n (0, _runloop.schedule)('afterRender', () => {\n this.set('width', '10');\n });\n }\n });\n\n let template = `{{width}}`;\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render('{{foo-bar}}');\n\n this.assertText('10');\n\n this.runTask(() => this.rerender());\n\n this.assertText('10');\n }\n\n ['@test afterRender set on parent']() {\n let ComponentClass = _helpers.Component.extend({\n didInsertElement() {\n (0, _runloop.schedule)('afterRender', () => {\n let parent = this.get('parent');\n parent.set('foo', 'wat');\n });\n }\n });\n\n let template = `{{foo}}`;\n\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render('{{foo-bar parent=this foo=foo}}');\n\n this.assertText('wat');\n\n this.runTask(() => this.rerender());\n\n this.assertText('wat');\n }\n\n ['@test `willRender` can set before render (GH#14458)']() {\n let ComponentClass = _helpers.Component.extend({\n tagName: 'a',\n customHref: 'http://google.com',\n attributeBindings: ['customHref:href'],\n willRender() {\n this.set('customHref', 'http://willRender.com');\n }\n });\n\n let template = `Hello World`;\n\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render(`{{foo-bar id=\"foo\"}}`);\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n attrs: {\n id: 'foo',\n href: 'http://willRender.com',\n class: (0, _testHelpers.classes)('ember-view')\n }\n });\n }\n\n ['@test that thing about destroying'](assert) {\n let ParentDestroyedElements = [];\n let ChildDestroyedElements = [];\n\n let ParentComponent = _helpers.Component.extend({\n willDestroyElement() {\n ParentDestroyedElements.push({\n id: this.itemId,\n name: 'parent-component',\n hasParent: !!this.element.parentNode,\n nextSibling: !!this.element.nextSibling,\n previousSibling: !!this.element.previousSibling\n });\n }\n });\n\n let PartentTemplate = _abstractTestCase.strip`\n {{yield}}\n
      \n {{#nested-component nestedId=(concat itemId '-A')}}A{{/nested-component}}\n {{#nested-component nestedId=(concat itemId '-B')}}B{{/nested-component}}\n
    \n `;\n\n let NestedComponent = _helpers.Component.extend({\n willDestroyElement() {\n ChildDestroyedElements.push({\n id: this.nestedId,\n name: 'nested-component',\n hasParent: !!this.element.parentNode,\n nextSibling: !!this.element.nextSibling,\n previousSibling: !!this.element.previousSibling\n });\n }\n });\n\n let NestedTemplate = `{{yield}}`;\n\n this.registerComponent('parent-component', {\n ComponentClass: ParentComponent,\n template: PartentTemplate\n });\n\n this.registerComponent('nested-component', {\n ComponentClass: NestedComponent,\n template: NestedTemplate\n });\n\n let array = (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]);\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{#parent-component itemId=item.id}}{{item.id}}{{/parent-component}}\n {{/each}}\n {{#if model.shouldShow}}\n {{#parent-component itemId=6}}6{{/parent-component}}\n {{/if}}\n {{#if model.shouldShow}}\n {{#parent-component itemId=7}}7{{/parent-component}}\n {{/if}}\n `, {\n items: array,\n model: { shouldShow: true }\n });\n\n this.assertText('1AB2AB3AB4AB5AB6AB7AB');\n\n this.runTask(() => {\n array.removeAt(2);\n array.removeAt(2);\n (0, _metal.set)(this.context, 'model.shouldShow', false);\n });\n\n this.assertText('1AB2AB5AB');\n\n assertDestroyHooks(assert, [...ParentDestroyedElements], [{\n id: 3,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 4,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 6,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 7,\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }]);\n\n assertDestroyHooks(assert, [...ChildDestroyedElements], [{\n id: '3-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '3-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '4-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '4-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '6-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '6-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '7-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '7-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }]);\n }\n\n ['@test lifecycle hooks exist on the base class'](assert) {\n // Make sure we get the finalized component prototype\n let prototype = _helpers.Component.proto();\n\n assert.equal(typeof prototype.didDestroyElement, 'function', 'didDestroyElement exists');\n assert.equal(typeof prototype.didInsertElement, 'function', 'didInsertElement exists');\n assert.equal(typeof prototype.didReceiveAttrs, 'function', 'didReceiveAttrs exists');\n assert.equal(typeof prototype.didRender, 'function', 'didRender exists');\n assert.equal(typeof prototype.didUpdate, 'function', 'didUpdate exists');\n assert.equal(typeof prototype.didUpdateAttrs, 'function', 'didUpdateAttrs exists');\n assert.equal(typeof prototype.willClearRender, 'function', 'willClearRender exists');\n assert.equal(typeof prototype.willDestroy, 'function', 'willDestroy exists');\n assert.equal(typeof prototype.willDestroyElement, 'function', 'willDestroyElement exists');\n assert.equal(typeof prototype.willInsertElement, 'function', 'willInsertElement exists');\n assert.equal(typeof prototype.willRender, 'function', 'willRender exists');\n assert.equal(typeof prototype.willUpdate, 'function', 'willUpdate exists');\n }\n });\n\n if (!_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Run loop and lifecycle hooks - jQuery only', class extends _testCase.RenderingTest {\n ['@test lifecycle hooks have proper access to this.$()'](assert) {\n assert.expect(6);\n let component;\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'div',\n init() {\n assert.notOk(this.$(), 'no access to element via this.$() on init() enter');\n this._super(...arguments);\n assert.notOk(this.$(), 'no access to element via this.$() after init() finished');\n },\n willInsertElement() {\n component = this;\n assert.ok(this.$(), 'willInsertElement has access to element via this.$()');\n },\n didInsertElement() {\n assert.ok(this.$(), 'didInsertElement has access to element via this.$()');\n },\n willDestroyElement() {\n assert.ok(this.$(), 'willDestroyElement has access to element via this.$()');\n },\n didDestroyElement() {\n assert.notOk(this.$(), 'didDestroyElement does not have access to element via this.$()');\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n let { owner } = this;\n let comp = owner.lookup('component:foo-bar');\n (0, _internalTestHelpers.runAppend)(comp);\n this.runTask(() => (0, _utils.tryInvoke)(component, 'destroy'));\n }\n });\n }\n\n function assertDestroyHooks(assert, _actual, _expected) {\n _expected.forEach((expected, i) => {\n let name = expected.name;\n assert.equal(expected.id, _actual[i].id, `${name} id is the same`);\n assert.equal(expected.hasParent, _actual[i].hasParent, `${name} has parent node`);\n assert.equal(expected.nextSibling, _actual[i].nextSibling, `${name} has next sibling node`);\n assert.equal(expected.previousSibling, _actual[i].previousSibling, `${name} has previous sibling node`);\n });\n }\n\n function bind(func, thisArg) {\n return (...args) => func.apply(thisArg, args);\n }\n\n function string(value) {\n return { isString: true, value };\n }\n\n function expr(value) {\n return { isExpr: true, value };\n }\n\n function hook(name, hook, { attrs, oldAttrs, newAttrs } = {}) {\n return { name, hook, args: { attrs, oldAttrs, newAttrs } };\n }\n\n function json(serializable) {\n return JSON.parse(JSON.stringify(serializable));\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/link-to-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/controller', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _controller, _metal, _helpers, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Link-to component', class extends _testCase.ApplicationTest {\n visitWithDeprecation(path, deprecation) {\n let p;\n\n expectDeprecation(() => {\n p = this.visit(path);\n }, deprecation);\n\n return p;\n }\n\n ['@test should be able to be inserted in DOM when the router is not present']() {\n this.addTemplate('application', `{{#link-to 'index'}}Go to Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertText('Go to Index');\n });\n }\n\n ['@test re-renders when title changes']() {\n let controller;\n\n this.addTemplate('application', '{{link-to title routeName}}');\n this.add('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n },\n title: 'foo',\n routeName: 'index'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('foo');\n this.runTask(() => (0, _metal.set)(controller, 'title', 'bar'));\n this.assertText('bar');\n });\n }\n\n ['@test re-computes active class when params change'](assert) {\n let controller;\n\n this.addTemplate('application', '{{link-to \"foo\" routeName}}');\n\n this.add('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n },\n routeName: 'index'\n }));\n\n this.router.map(function () {\n this.route('bar', { path: '/bar' });\n });\n\n return this.visit('/bar').then(() => {\n assert.equal(this.firstChild.classList.contains('active'), false);\n this.runTask(() => (0, _metal.set)(controller, 'routeName', 'bar'));\n assert.equal(this.firstChild.classList.contains('active'), true);\n });\n }\n\n ['@test escaped inline form (double curlies) escapes link title']() {\n this.addTemplate('application', `{{link-to title 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n });\n }\n\n ['@test escaped inline form with (-html-safe) does not escape link title'](assert) {\n this.addTemplate('application', `{{link-to (-html-safe title) 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n assert.equal(this.$('b').length, 1);\n });\n }\n\n ['@test unescaped inline form (triple curlies) does not escape link title'](assert) {\n this.addTemplate('application', `{{{link-to title 'index'}}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n assert.equal(this.$('b').length, 1);\n });\n }\n\n ['@test able to safely extend the built-in component and use the normal path']() {\n this.addComponent('custom-link-to', {\n ComponentClass: _helpers.LinkComponent.extend()\n });\n this.addTemplate('application', `{{#custom-link-to 'index'}}{{title}}{{/custom-link-to}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'Hello'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('Hello');\n });\n }\n\n ['@test [GH#13432] able to safely extend the built-in component and invoke it inline']() {\n this.addComponent('custom-link-to', {\n ComponentClass: _helpers.LinkComponent.extend()\n });\n this.addTemplate('application', `{{custom-link-to title 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'Hello'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('Hello');\n });\n }\n });\n\n (0, _testCase.moduleFor)('Link-to component with query-params', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: '123',\n bar: 'yes'\n }));\n }\n\n ['@test populates href with fully supplied query param values']() {\n this.addTemplate('index', `{{#link-to 'index' (query-params foo='456' bar='NAW')}}Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: '/?bar=NAW&foo=456' },\n content: 'Index'\n });\n });\n }\n\n ['@test populates href with partially supplied query param values, but omits if value is default value']() {\n this.addTemplate('index', `{{#link-to 'index' (query-params foo='123')}}Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: '/', class: (0, _testHelpers.classes)('ember-view active') },\n content: 'Index'\n });\n });\n }\n });\n\n (0, _testCase.moduleFor)('Link-to component', class extends _testCase.RenderingTest {\n ['@test should be able to be inserted in DOM when the router is not present - block']() {\n this.render(`{{#link-to 'index'}}Go to Index{{/link-to}}`);\n\n this.assertText('Go to Index');\n }\n\n ['@test should be able to be inserted in DOM when the router is not present - inline']() {\n this.render(`{{link-to 'Go to Index' 'index'}}`);\n\n this.assertText('Go to Index');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/local-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'ember-template-compiler', 'internal-test-helpers', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/canary-features', '@ember/-internals/glimmer'], function (_testCase, _emberTemplateCompiler, _internalTestHelpers, _helpers, _canaryFeatures, _glimmer) {\n 'use strict';\n\n class LocalLookupTest extends _testCase.RenderingTest {\n ['@test it can lookup a local template']() {\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says: {{yield}}'\n });\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test tagless blockless component can lookup local template']() {\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says: {{yield}}'\n });\n this.registerTemplate('components/x-outer', '{{#x-inner}}Hi!{{/x-inner}}');\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({ tagName: '' })\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test it can lookup a local component template']() {\n this.registerTemplate('components/x-outer/x-inner', 'Nested template says: {{yield}}');\n this.registerTemplate('components/x-outer', '{{#x-inner}}Hi!{{/x-inner}}');\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test it can local lookup a dynamic component']() {\n this.registerComponent('foo-bar', {\n template: 'yall finished {{component child}}'\n });\n this.registerComponent('foo-bar/biz-baz', { template: 'or yall done?' });\n\n this.render('{{foo-bar child=child}}', { child: 'biz-baz' });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a dynamic component from a dynamic component']() {\n this.registerComponent('foo-bar', {\n template: 'yall finished {{component child}}'\n });\n this.registerComponent('foo-bar/biz-baz', { template: 'or yall done?' });\n\n this.render('{{component componentName child=child}}', {\n componentName: 'foo-bar',\n child: 'biz-baz'\n });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a dynamic component from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-biz baz=(component 'local-bar')}}`\n });\n this.registerComponent('global-biz', { template: 'or {{component baz}}' });\n this.registerComponent('parent-foo/local-bar', { template: 'yall done?' });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a re-wrapped dynamic component from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component 'local-bar')}}`\n });\n this.registerComponent('global-x', {\n template: `or {{global-y comp=(component comp phrase='done')}}`\n });\n this.registerComponent('global-y', { template: `{{component comp}}?` });\n this.registerComponent('parent-foo/local-bar', {\n template: 'yall {{phrase}}'\n });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can nest local lookups of dynamic components from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component 'local-bar')}}`\n });\n this.registerComponent('global-x', {\n template: `or {{global-y comp=(component comp phrase='done')}}`\n });\n this.registerComponent('global-y', {\n template: `{{component comp}}{{component 'local-bar'}}`\n });\n this.registerComponent('parent-foo/local-bar', {\n template: 'yall {{phrase}}'\n });\n this.registerComponent('global-y/local-bar', { template: `?` });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can switch from local to global lookups of dynamic components from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component bar)}}`\n });\n this.registerComponent('global-x', {\n template: `or yall {{component comp}}`\n });\n this.registerComponent('parent-foo/local-bar', { template: 'done?' });\n this.registerComponent('global-bar', { template: `ready?` });\n\n this.render('{{parent-foo bar=bar}}', { bar: 'local-bar' });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.context.set('bar', 'global-bar'));\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall ready?');\n }\n\n ['@test it can lookup a local helper']() {\n this.registerHelper('x-outer/x-helper', () => {\n return 'Who dis?';\n });\n this.registerComponent('x-outer', { template: 'Who dat? {{x-helper}}' });\n\n this.render('{{x-outer}}');\n\n this.assertText('Who dat? Who dis?', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who dat? Who dis?', 'Re-render works');\n }\n\n ['@test it overrides global helper lookup']() {\n this.registerHelper('x-outer/x-helper', () => {\n return 'Who dis?';\n });\n\n this.registerHelper('x-helper', () => {\n return 'I dunno';\n });\n\n this.registerComponent('x-outer', { template: 'Who dat? {{x-helper}}' });\n\n this.render('{{x-outer}} {{x-helper}}');\n\n this.assertText('Who dat? Who dis? I dunno', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who dat? Who dis? I dunno', 'Re-render works');\n }\n\n ['@test lookup without match issues standard assertion (with local helper name)']() {\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n\n expectAssertion(() => {\n this.render('{{x-outer}}');\n }, /A component or helper named \"x-inner\" could not be found/);\n }\n\n ['@test overrides global lookup']() {\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says (from local): {{yield}}'\n });\n this.registerComponent('x-inner', {\n template: 'Nested template says (from global): {{yield}}'\n });\n\n this.render('{{#x-inner}}Hi!{{/x-inner}} {{x-outer}} {{#x-outer/x-inner}}Hi!{{/x-outer/x-inner}}');\n\n this.assertText('Nested template says (from global): Hi! Nested template says (from local): Hi! Nested template says (from local): Hi!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says (from global): Hi! Nested template says (from local): Hi! Nested template says (from local): Hi!');\n }\n }\n\n // first run these tests with expandLocalLookup\n\n function buildResolver() {\n let resolver = {\n resolve() {},\n expandLocalLookup(fullName, sourceFullName) {\n if (!sourceFullName) {\n return null;\n }\n\n let [sourceType, sourceName] = sourceFullName.split(':');\n let [type, name] = fullName.split(':');\n\n sourceName = sourceName.replace('my-app/', '');\n\n if (sourceType === 'template' && sourceName.slice(0, 21) === 'templates/components/') {\n sourceName = sourceName.slice(21);\n }\n\n name = name.replace('my-app/', '');\n\n if (type === 'template' && name.slice(0, 11) === 'components/') {\n name = name.slice(11);\n sourceName = `components/${sourceName}`;\n }\n\n sourceName = sourceName.replace('.hbs', '');\n\n let result = `${type}:${sourceName}/${name}`;\n return result;\n }\n };\n\n return resolver;\n }\n\n (0, _testCase.moduleFor)('Components test: local lookup with expandLocalLookup feature', class extends LocalLookupTest {\n getResolver() {\n return buildResolver();\n }\n });\n\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n class LocalLookupTestResolver extends _internalTestHelpers.ModuleBasedTestResolver {\n expandLocalLookup(specifier, source) {\n if (source && source.indexOf('components/') !== -1) {\n let namespace = source.split('components/')[1];\n let [type, name] = specifier.split(':');\n name = name.replace('components/', '');\n\n namespace = namespace.replace('.hbs', '');\n return `${type}:${type === 'template' ? 'components/' : ''}${namespace}/${name}`;\n }\n\n return super.expandLocalLookup(specifier, source);\n }\n }\n\n /*\n * This sub-classing changes `registerXXX` methods to use the resolver.\n * Required for testing the module unification-friendly `resolve` call\n * with a `referrer` argument.\n *\n * In theory all these tests can be ported to use the resolver instead of\n * the registry.\n */\n (0, _testCase.moduleFor)('Components test: local lookup with resolution referrer', class extends LocalLookupTest {\n get resolver() {\n return this.owner.__registry__.fallback.resolver;\n }\n\n getResolver() {\n return new LocalLookupTestResolver();\n }\n\n registerComponent(name, { ComponentClass = _helpers.Component, template = null }) {\n let { resolver } = this;\n\n if (ComponentClass) {\n resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `my-name/templates/components/${name}.hbs`\n }));\n }\n }\n\n registerTemplate(name, template) {\n let { resolver } = this;\n if (typeof template === 'string') {\n resolver.add(`template:${name}`, this.compile(template, {\n moduleName: `my-name/templates/${name}.hbs`\n }));\n } else {\n throw new Error(`Registered template \"${name}\" must be a string`);\n }\n }\n\n registerHelper(name, funcOrClassBody) {\n let { resolver } = this;\n let type = typeof funcOrClassBody;\n\n if (type === 'function') {\n resolver.add(`helper:${name}`, (0, _glimmer.helper)(funcOrClassBody));\n } else if (type === 'object' && type !== null) {\n resolver.add(`helper:${name}`, _glimmer.Helper.extend(funcOrClassBody));\n } else {\n throw new Error(`Cannot register ${funcOrClassBody} as a helper`);\n }\n }\n });\n }\n\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n (0, _internalTestHelpers.moduleFor)('Components test: local lookup with resolution referrer (MU)', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Ensure that the same specifier with two sources does not share a cache key'](assert) {\n this.add({\n specifier: 'template:components/x-not-shared',\n source: 'template:my-app/templates/components/x-top.hbs'\n }, (0, _emberTemplateCompiler.compile)('child-x-not-shared'));\n\n this.add({\n specifier: 'template:components/x-top',\n source: 'template:my-app/templates/application.hbs'\n }, (0, _emberTemplateCompiler.compile)('top-level-x-top ({{x-not-shared}})', {\n moduleName: 'my-app/templates/components/x-top.hbs'\n }));\n\n this.add({\n specifier: 'template:components/x-not-shared',\n source: 'template:my-app/templates/application.hbs'\n }, (0, _emberTemplateCompiler.compile)('top-level-x-not-shared'));\n\n this.addTemplate('application', '{{x-not-shared}} {{x-top}} {{x-not-shared}} {{x-top}}');\n\n return this.visit('/').then(() => {\n assert.equal(this.element.textContent, 'top-level-x-not-shared top-level-x-top (child-x-not-shared) top-level-x-not-shared top-level-x-top (child-x-not-shared)');\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/namespaced-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/canary-features', '@ember/-internals/glimmer'], function (_testCase, _canaryFeatures, _glimmer) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n (0, _testCase.moduleFor)('Namespaced lookup', class extends _testCase.RenderingTest {\n ['@test it can render a namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'my-addon'\n }, 'namespaced template {{myProp}}');\n\n this.add({\n specifier: 'component:my-component',\n namespace: 'my-addon'\n }, _glimmer.Component.extend({\n myProp: 'My property'\n }));\n\n this.addComponent('x-outer', {\n template: '{{my-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('namespaced template My property');\n\n this.runTask(() => this.rerender());\n\n this.assertText('namespaced template My property');\n }\n\n ['@test it can render a nested namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'second-addon'\n }, 'second namespaced template');\n\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'first-addon'\n }, 'first namespaced template - {{second-addon::my-component}}');\n\n this.addComponent('x-outer', {\n template: '{{first-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('first namespaced template - second namespaced template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('first namespaced template - second namespaced template');\n }\n\n ['@test it can render a nested un-namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/addon-component',\n source: 'template:first-addon/src/ui/components/my-component.hbs'\n }, 'un-namespaced addon template');\n\n this.addTemplate({\n specifier: 'template:components/my-component',\n moduleName: 'first-addon/src/ui/components/my-component.hbs',\n namespace: 'first-addon'\n }, '{{addon-component}}');\n\n this.addComponent('x-outer', {\n template: '{{first-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('un-namespaced addon template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('un-namespaced addon template');\n }\n\n ['@test it can render a namespaced main component']() {\n this.addTemplate({\n specifier: 'template:components/addon-component',\n soruce: 'template:first-addon/src/ui/components/main.hbs'\n }, 'Nested namespaced component');\n\n this.addTemplate({\n specifier: 'template:components/first-addon',\n moduleName: 'first-addon/src/ui/components/main.hbs'\n }, '{{addon-component}}');\n\n this.addComponent('x-outer', { template: '{{first-addon}}' });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested namespaced component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested namespaced component');\n }\n\n ['@test it does not render a main component when using a namespace']() {\n this.addTemplate({\n specifier: 'template:components/main',\n namespace: 'my-addon'\n }, 'namespaced template {{myProp}}');\n\n this.add({\n specifier: 'component:main',\n namespace: 'my-addon'\n }, _glimmer.Component.extend({\n myProp: 'My property'\n }));\n\n this.add({\n specifier: 'helper:my-addon',\n namespace: 'empty-namespace'\n }, (0, _glimmer.helper)(() => 'my helper'));\n\n this.render('{{empty-namespace::my-addon}}');\n\n this.assertText('my helper'); // component should be not found\n\n this.runTask(() => this.rerender());\n\n this.assertText('my helper');\n }\n\n ['@test it renders a namespaced helper']() {\n this.add({\n specifier: 'helper:my-helper',\n namespace: 'my-namespace'\n }, (0, _glimmer.helper)(() => 'my helper'));\n\n this.render('{{my-namespace::my-helper}}');\n\n this.assertText('my helper');\n\n this.runTask(() => this.rerender());\n\n this.assertText('my helper');\n }\n });\n }\n});","enifed(\"@ember/-internals/glimmer/tests/integration/components/render-to-element-test\", [], function () {\n \"use strict\";\n});","enifed('@ember/-internals/glimmer/tests/integration/components/target-action-test', ['@ember/polyfills', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/routing'], function (_polyfills, _testCase, _abstractTestCase, _metal, _helpers, _controller, _runtime, _routing) {\n 'use strict';\n\n function expectSendActionDeprecation(fn) {\n expectDeprecation(fn, /You called (.*).sendAction\\((.*)\\) but Component#sendAction is deprecated. Please use closure actions instead./);\n }\n\n (0, _testCase.moduleFor)('Components test: sendAction', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.actionCounts = {};\n this.sendCount = 0;\n this.actionArguments = null;\n\n var self = this;\n\n this.registerComponent('action-delegate', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n self.delegate = this;\n this.name = 'action-delegate';\n }\n })\n });\n }\n\n renderDelegate(template = '{{action-delegate}}', context = {}) {\n let root = this;\n context = (0, _polyfills.assign)(context, {\n send(actionName, ...args) {\n root.sendCount++;\n root.actionCounts[actionName] = root.actionCounts[actionName] || 0;\n root.actionCounts[actionName]++;\n root.actionArguments = args;\n }\n });\n this.render(template, context);\n }\n\n assertSendCount(count) {\n this.assert.equal(this.sendCount, count, `Send was called ${count} time(s)`);\n }\n\n assertNamedSendCount(actionName, count) {\n this.assert.equal(this.actionCounts[actionName], count, `An action named '${actionName}' was sent ${count} times`);\n }\n\n assertSentWithArgs(expected, message = 'arguments were sent with the action') {\n this.assert.deepEqual(this.actionArguments, expected, message);\n }\n\n ['@test Calling sendAction on a component without an action defined does nothing']() {\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction());\n });\n\n this.assertSendCount(0);\n }\n\n ['@test Calling sendAction on a component with an action defined calls send on the controller']() {\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', 'addItem');\n this.delegate.sendAction();\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('addItem', 1);\n }\n\n ['@test Calling sendAction on a component with a function calls the function']() {\n this.assert.expect(2);\n\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', () => this.assert.ok(true, 'function is called'));\n this.delegate.sendAction();\n });\n });\n }\n\n ['@test Calling sendAction on a component with a function calls the function with arguments']() {\n this.assert.expect(2);\n let argument = {};\n\n this.renderDelegate();\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', actualArgument => {\n this.assert.deepEqual(argument, actualArgument, 'argument is passed');\n });\n this.delegate.sendAction('action', argument);\n });\n });\n }\n\n // TODO consolidate these next 2 tests\n ['@test Calling sendAction on a component with a reference attr calls the function with arguments']() {\n this.renderDelegate('{{action-delegate playing=playing}}', {\n playing: null\n });\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction());\n });\n\n this.assertSendCount(0);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'playing', 'didStartPlaying');\n });\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n this.delegate.sendAction('playing');\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n }\n\n ['@test Calling sendAction on a component with a {{mut}} attr calls the function with arguments']() {\n this.renderDelegate('{{action-delegate playing=(mut playing)}}', {\n playing: null\n });\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction('playing'));\n });\n\n this.assertSendCount(0);\n\n this.runTask(() => this.delegate.attrs.playing.update('didStartPlaying'));\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction('playing'));\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n }\n\n [\"@test Calling sendAction with a named action uses the component's property as the action name\"]() {\n this.renderDelegate();\n\n let component = this.delegate;\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'playing', 'didStartPlaying');\n component.sendAction('playing');\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n\n expectSendActionDeprecation(() => {\n this.runTask(() => component.sendAction('playing'));\n });\n\n this.assertSendCount(2);\n this.assertNamedSendCount('didStartPlaying', 2);\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(component, 'action', 'didDoSomeBusiness');\n component.sendAction();\n });\n });\n\n this.assertSendCount(3);\n this.assertNamedSendCount('didDoSomeBusiness', 1);\n }\n\n ['@test Calling sendAction when the action name is not a string raises an exception']() {\n this.renderDelegate();\n\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', {});\n (0, _metal.set)(this.delegate, 'playing', {});\n });\n expectSendActionDeprecation(() => {\n expectAssertion(() => this.delegate.sendAction());\n });\n expectSendActionDeprecation(() => {\n expectAssertion(() => this.delegate.sendAction('playing'));\n });\n }\n\n ['@test Calling sendAction on a component with contexts']() {\n this.renderDelegate();\n\n let testContext = { song: 'She Broke My Ember' };\n let firstContext = { song: 'She Broke My Ember' };\n let secondContext = { song: 'My Achey Breaky Ember' };\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'playing', 'didStartPlaying');\n this.delegate.sendAction('playing', testContext);\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n this.assertSentWithArgs([testContext], 'context was sent with the action');\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n this.delegate.sendAction('playing', firstContext, secondContext);\n });\n });\n\n this.assertSendCount(2);\n this.assertNamedSendCount('didStartPlaying', 2);\n this.assertSentWithArgs([firstContext, secondContext], 'multiple contexts were sent to the action');\n }\n\n ['@test calling sendAction on a component within a block sends to the outer scope GH#14216'](assert) {\n let testContext = this;\n // overrides default action-delegate so actions can be added\n this.registerComponent('action-delegate', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n testContext.delegate = this;\n this.name = 'action-delegate';\n },\n\n actions: {\n derp(arg1) {\n assert.ok(true, 'action called on action-delgate');\n assert.equal(arg1, 'something special', 'argument passed through properly');\n }\n }\n }),\n\n template: _abstractTestCase.strip`\n {{#component-a}}\n {{component-b bar=\"derp\"}}\n {{/component-a}}\n `\n });\n\n this.registerComponent('component-a', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.name = 'component-a';\n },\n actions: {\n derp() {\n assert.ok(false, 'no! bad scoping!');\n }\n }\n })\n });\n\n let innerChild;\n this.registerComponent('component-b', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerChild = this;\n this.name = 'component-b';\n }\n })\n });\n\n this.renderDelegate();\n expectSendActionDeprecation(() => {\n this.runTask(() => innerChild.sendAction('bar', 'something special'));\n });\n }\n\n ['@test asserts if called on a destroyed component']() {\n let component;\n\n this.registerComponent('rip-alley', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n\n toString() {\n return 'component:rip-alley';\n }\n })\n });\n\n this.render('{{#if shouldRender}}{{rip-alley}}{{/if}}', {\n shouldRender: true\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'shouldRender', false);\n });\n\n expectAssertion(() => {\n component.sendAction('trigger-me-dead');\n }, \"Attempted to call .sendAction() with the action 'trigger-me-dead' on the destroyed object 'component:rip-alley'.\");\n }\n });\n\n (0, _testCase.moduleFor)('Components test: sendAction to a controller', class extends _testCase.ApplicationTest {\n [\"@test sendAction should trigger an action on the parent component's controller if it exists\"](assert) {\n assert.expect(20);\n\n let component;\n\n this.router.map(function () {\n this.route('a');\n this.route('b');\n this.route('c', function () {\n this.route('d');\n this.route('e');\n });\n });\n\n this.addComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `{{val}}`\n });\n\n this.add('controller:a', _controller.default.extend({\n send(actionName, actionContext) {\n assert.equal(actionName, 'poke', 'send() method was invoked from a top level controller');\n assert.equal(actionContext, 'top', 'action arguments were passed into the top level controller');\n }\n }));\n this.addTemplate('a', '{{foo-bar val=\"a\" poke=\"poke\"}}');\n\n this.add('route:b', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'top no controller');\n }\n }\n }));\n this.addTemplate('b', '{{foo-bar val=\"b\" poke=\"poke\"}}');\n\n this.add('route:c', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'top with nested no controller');\n }\n }\n }));\n this.addTemplate('c', '{{foo-bar val=\"c\" poke=\"poke\"}}{{outlet}}');\n\n this.add('route:c.d', _routing.Route.extend({}));\n\n this.add('controller:c.d', _controller.default.extend({\n send(actionName, actionContext) {\n assert.equal(actionName, 'poke', 'send() method was invoked from a nested controller');\n assert.equal(actionContext, 'nested', 'action arguments were passed into the nested controller');\n }\n }));\n this.addTemplate('c.d', '{{foo-bar val=\".d\" poke=\"poke\"}}');\n\n this.add('route:c.e', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'nested no controller');\n }\n }\n }));\n this.addTemplate('c.e', '{{foo-bar val=\".e\" poke=\"poke\"}}');\n\n return this.visit('/a').then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'top'));\n }).then(() => {\n this.assertText('a');\n return this.visit('/b');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'top no controller'));\n }).then(() => {\n this.assertText('b');\n return this.visit('/c');\n }).then(() => {\n expectSendActionDeprecation(() => {\n component.sendAction('poke', 'top with nested no controller');\n });\n }).then(() => {\n this.assertText('c');\n return this.visit('/c/d');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'nested'));\n }).then(() => {\n this.assertText('c.d');\n return this.visit('/c/e');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'nested no controller'));\n }).then(() => this.assertText('c.e'));\n }\n\n [\"@test sendAction should not trigger an action in an outlet's controller if a parent component handles it\"](assert) {\n assert.expect(2);\n\n let component;\n\n this.addComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n poke() {\n assert.ok(true, 'parent component handled the aciton');\n }\n }\n }),\n template: '{{x-child poke=\"poke\"}}'\n });\n\n this.addComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n })\n });\n\n this.addTemplate('application', '{{x-parent}}');\n this.add('controller:application', _controller.default.extend({\n send() {\n throw new Error('controller action should not be called');\n }\n }));\n\n return this.visit('/').then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke'));\n });\n }\n });\n\n (0, _testCase.moduleFor)('Components test: sendAction of a closure action', class extends _testCase.RenderingTest {\n ['@test action should be called'](assert) {\n assert.expect(2);\n let component;\n\n this.registerComponent('inner-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n outerSubmit() {\n assert.ok(true, 'outerSubmit called');\n }\n }),\n template: '{{inner-component submitAction=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n expectSendActionDeprecation(() => {\n this.runTask(() => component.sendAction('submitAction'));\n });\n }\n\n ['@test contexts passed to sendAction are appended to the bound arguments on a closure action']() {\n let first = 'mitch';\n let second = 'martin';\n let third = 'matt';\n let fourth = 'wacky wycats';\n\n let innerComponent;\n let actualArgs;\n\n this.registerComponent('inner-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n }\n }),\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n third,\n actions: {\n outerSubmit() {\n actualArgs = [...arguments];\n }\n }\n }),\n template: `{{inner-component innerSubmit=(action (action \"outerSubmit\" \"${first}\") \"${second}\" third)}}`\n });\n\n this.render('{{outer-component}}');\n expectSendActionDeprecation(() => {\n this.runTask(() => innerComponent.sendAction('innerSubmit', fourth));\n });\n\n this.assert.deepEqual(actualArgs, [first, second, third, fourth], 'action has the correct args');\n }\n });\n\n (0, _testCase.moduleFor)('Components test: send', class extends _testCase.RenderingTest {\n ['@test sending to undefined actions triggers an error'](assert) {\n assert.expect(2);\n\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n actions: {\n foo(message) {\n assert.equal('bar', message);\n }\n }\n })\n });\n\n this.render('{{foo-bar}}');\n\n this.runTask(() => component.send('foo', 'bar'));\n\n expectAssertion(() => {\n return component.send('baz', 'bar');\n }, /had no action handler for: baz/);\n }\n\n ['@test `send` will call send from a target if it is defined']() {\n let component;\n let target = {\n send: (message, payload) => {\n this.assert.equal('foo', message);\n this.assert.equal('baz', payload);\n }\n };\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n target\n })\n });\n\n this.render('{{foo-bar}}');\n\n this.runTask(() => component.send('foo', 'baz'));\n }\n\n ['@test a handled action can be bubbled to the target for continued processing']() {\n this.assert.expect(2);\n\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n poke: () => {\n this.assert.ok(true, 'component action called');\n return true;\n }\n },\n target: _controller.default.extend({\n actions: {\n poke: () => {\n this.assert.ok(true, 'action bubbled to controller');\n }\n }\n }).create()\n })\n });\n\n this.render('{{foo-bar poke=\"poke\"}}');\n\n this.runTask(() => component.send('poke'));\n }\n\n [\"@test action can be handled by a superclass' actions object\"](assert) {\n this.assert.expect(4);\n\n let component;\n\n let SuperComponent = _helpers.Component.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let BarViewMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\n }\n }\n });\n\n this.registerComponent('x-index', {\n ComponentClass: SuperComponent.extend(BarViewMixin, {\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n }\n })\n });\n\n this.render('{{x-index}}');\n\n this.runTask(() => {\n component.send('foo');\n component.send('bar', 'HELLO');\n component.send('baz');\n });\n }\n\n ['@test actions cannot be provided at create time'](assert) {\n this.registerComponent('foo-bar', _helpers.Component.extend());\n let ComponentFactory = this.owner.factoryFor('component:foo-bar');\n\n expectAssertion(() => {\n ComponentFactory.create({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n }\n }\n });\n }, /`actions` must be provided at extend time, not at create time/);\n // but should be OK on an object that doesn't mix in Ember.ActionHandler\n _runtime.Object.create({\n actions: ['foo']\n });\n }\n\n ['@test asserts if called on a destroyed component']() {\n let component;\n\n this.registerComponent('rip-alley', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n\n toString() {\n return 'component:rip-alley';\n }\n })\n });\n\n this.render('{{#if shouldRender}}{{rip-alley}}{{/if}}', {\n shouldRender: true\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'shouldRender', false);\n });\n\n expectAssertion(() => {\n component.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed object 'component:rip-alley'.\");\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/template-only-components-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/environment'], function (_testCase, _testHelpers, _environment) {\n 'use strict';\n\n class TemplateOnlyComponentsTest extends _testCase.RenderingTest {\n registerComponent(name, template) {\n super.registerComponent(name, { template, ComponentClass: null });\n }\n }\n\n (0, _testCase.moduleFor)('Components test: template-only components (glimmer components)', class extends TemplateOnlyComponentsTest {\n constructor() {\n super(...arguments);\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n ['@test it can render a template-only component']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar}}');\n\n this.assertInnerHTML('hello');\n\n this.assertStableRerender();\n }\n\n ['@feature(ember-glimmer-named-arguments) it can render named arguments']() {\n this.registerComponent('foo-bar', '|{{@foo}}|{{@bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertInnerHTML('|foo|bar|');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertInnerHTML('|FOO|bar|');\n\n this.runTask(() => this.context.set('bar', 'BAR'));\n\n this.assertInnerHTML('|FOO|BAR|');\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertInnerHTML('|foo|bar|');\n }\n\n ['@test it does not reflected arguments as properties']() {\n this.registerComponent('foo-bar', '|{{foo}}|{{this.bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertInnerHTML('|||');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertInnerHTML('|||');\n\n this.runTask(() => this.context.set('bar', null));\n\n this.assertInnerHTML('|||');\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertInnerHTML('|||');\n }\n\n ['@test it does not have curly component features']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar tagName=\"p\" class=class}}', {\n class: 'foo bar'\n });\n\n this.assertInnerHTML('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('class', 'foo'));\n\n this.assertInnerHTML('hello');\n\n this.runTask(() => this.context.set('class', null));\n\n this.assertInnerHTML('hello');\n\n this.runTask(() => this.context.set('class', 'foo bar'));\n\n this.assertInnerHTML('hello');\n }\n });\n\n (0, _testCase.moduleFor)('Components test: template-only components (curly components)', class extends TemplateOnlyComponentsTest {\n constructor() {\n super(...arguments);\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = false;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n ['@test it can render a template-only component']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n ['@feature(ember-glimmer-named-arguments) it can render named arguments']() {\n this.registerComponent('foo-bar', '|{{@foo}}|{{@bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|bar|' });\n\n this.runTask(() => this.context.set('bar', 'BAR'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|BAR|' });\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n }\n\n ['@test it renders named arguments as reflected properties']() {\n this.registerComponent('foo-bar', '|{{foo}}|{{this.bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|bar|' });\n\n this.runTask(() => this.context.set('bar', null));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO||' });\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n }\n\n ['@test it has curly component features']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar tagName=\"p\" class=class}}', {\n class: 'foo bar'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo bar ember-view') },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('class', 'foo'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => this.context.set('class', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => this.context.set('class', 'foo bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo bar ember-view') },\n content: 'hello'\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/to-string-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer'], function (_testCase, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('built-in component toString', class AbstractAppendTest extends _testCase.RenderingTest {\n '@test text-field has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.TextField.toString(), '@ember/component/text-field');\n }\n\n '@test checkbox has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.Checkbox.toString(), '@ember/component/checkbox');\n }\n\n '@test text-area has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.TextArea.toString(), '@ember/component/text-area');\n }\n\n '@test component has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.Component.toString(), '@ember/component');\n }\n\n '@test LinkTo has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.LinkComponent.toString(), '@ember/routing/link-component');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/utils-test', ['@ember/controller', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_controller, _views, _testCase, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('View tree tests', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.addComponent('x-tagless', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '
    [{{id}}] {{#if isShowing}}{{yield}}{{/if}}
    '\n });\n\n this.addComponent('x-toggle', {\n ComponentClass: _helpers.Component.extend({\n isExpanded: true,\n\n click() {\n this.toggleProperty('isExpanded');\n return false;\n }\n }),\n\n template: '[{{id}}] {{#if isExpanded}}{{yield}}{{/if}}'\n });\n\n let ToggleController = _controller.default.extend({\n isExpanded: true,\n\n actions: {\n toggle: function () {\n this.toggleProperty('isExpanded');\n }\n }\n });\n\n this.add('controller:application', ToggleController);\n\n this.addTemplate('application', `\n {{x-tagless id=\"root-1\"}}\n\n {{#x-toggle id=\"root-2\"}}\n {{x-toggle id=\"inner-1\"}}\n\n {{#x-toggle id=\"inner-2\"}}\n {{x-toggle id=\"inner-3\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n \n\n {{#if isExpanded}}\n {{x-toggle id=\"root-3\"}}\n {{/if}}\n\n {{outlet}}\n `);\n\n this.add('controller:index', ToggleController.extend({\n isExpanded: false\n }));\n\n this.addTemplate('index', `\n {{x-tagless id=\"root-4\"}}\n\n {{#x-toggle id=\"root-5\" isExpanded=false}}\n {{x-toggle id=\"inner-4\"}}\n\n {{#x-toggle id=\"inner-5\"}}\n {{x-toggle id=\"inner-6\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n \n\n {{#if isExpanded}}\n {{x-toggle id=\"root-6\"}}\n {{/if}}\n `);\n\n this.addTemplate('zomg', `\n {{x-tagless id=\"root-7\"}}\n\n {{#x-toggle id=\"root-8\"}}\n {{x-toggle id=\"inner-7\"}}\n\n {{#x-toggle id=\"inner-8\"}}\n {{x-toggle id=\"inner-9\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n {{#x-toggle id=\"root-9\"}}\n {{outlet}}\n {{/x-toggle}}\n `);\n\n this.addTemplate('zomg.lol', `\n {{x-toggle id=\"inner-10\"}}\n `);\n\n this.router.map(function () {\n this.route('zomg', function () {\n this.route('lol');\n });\n });\n }\n\n ['@test getRootViews']() {\n return this.visit('/').then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5']);\n\n this.runTask(() => this.$('#toggle-application').click());\n\n this.assertRootViews(['root-1', 'root-2', 'root-4', 'root-5']);\n\n this.runTask(() => {\n this.$('#toggle-application').click();\n this.$('#toggle-index').click();\n });\n\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5', 'root-6']);\n\n return this.visit('/zomg/lol');\n }).then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-7', 'root-8', 'root-9']);\n\n return this.visit('/');\n }).then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5', 'root-6']);\n });\n }\n\n assertRootViews(ids) {\n let owner = this.applicationInstance;\n\n let actual = (0, _views.getRootViews)(owner).map(view => view.id).sort();\n let expected = ids.sort();\n\n this.assert.deepEqual(actual, expected, 'root views');\n }\n\n ['@test getChildViews']() {\n return this.visit('/').then(() => {\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n this.assertChildViews('root-5', []);\n this.assertChildViews('inner-2', ['inner-3']);\n\n this.runTask(() => this.$('#root-2').click());\n\n this.assertChildViews('root-2', []);\n\n this.runTask(() => this.$('#root-5').click());\n\n this.assertChildViews('root-5', ['inner-4', 'inner-5']);\n this.assertChildViews('inner-5', ['inner-6']);\n\n return this.visit('/zomg');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-8', ['inner-7', 'inner-8']);\n this.assertChildViews('inner-8', ['inner-9']);\n this.assertChildViews('root-9', []);\n\n this.runTask(() => this.$('#root-8').click());\n\n this.assertChildViews('root-8', []);\n\n return this.visit('/zomg/lol');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-8', []);\n this.assertChildViews('root-9', ['inner-10']);\n\n return this.visit('/');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-5', []);\n\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#inner-2').click());\n\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n this.assertChildViews('inner-2', []);\n });\n }\n\n ['@test getChildViews does not return duplicates']() {\n return this.visit('/').then(() => {\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n });\n }\n\n assertChildViews(parentId, childIds) {\n let parentView = this.viewFor(parentId);\n let childViews = (0, _views.getChildViews)(parentView);\n\n let actual = childViews.map(view => view.id).sort();\n let expected = childIds.sort();\n\n this.assert.deepEqual(actual, expected, `child views for #${parentId}`);\n }\n\n viewFor(id) {\n let owner = this.applicationInstance;\n let registry = owner.lookup('-view-registry:main');\n return registry[id];\n }\n });\n\n let hasGetClientRects, hasGetBoundingClientRect;\n let ClientRectListCtor, ClientRectCtor;\n\n (function () {\n if (document.createRange) {\n let range = document.createRange();\n\n if (range.getClientRects) {\n let clientRectsList = range.getClientRects();\n hasGetClientRects = true;\n ClientRectListCtor = clientRectsList && clientRectsList.constructor;\n }\n\n if (range.getBoundingClientRect) {\n let clientRect = range.getBoundingClientRect();\n hasGetBoundingClientRect = true;\n ClientRectCtor = clientRect && clientRect.constructor;\n }\n }\n })();\n\n (0, _testCase.moduleFor)('Bounds tests', class extends _testCase.RenderingTest {\n ['@test getViewBounds on a regular component'](assert) {\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

    Hi, mom!

    `\n });\n\n this.render(`{{hi-mom}}`);\n\n let { parentElement, firstNode, lastNode } = (0, _views.getViewBounds)(component);\n\n assert.equal(parentElement, this.element, 'a regular component should have the right parentElement');\n assert.equal(firstNode, component.element, 'a regular component should have a single node that is its element');\n assert.equal(lastNode, component.element, 'a regular component should have a single node that is its element');\n }\n\n ['@test getViewBounds on a tagless component'](assert) {\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `Hi, mom!`\n });\n\n this.render(`{{hi-mom}}`);\n\n let { parentElement, firstNode, lastNode } = (0, _views.getViewBounds)(component);\n\n assert.equal(parentElement, this.element, 'a tagless component should have the right parentElement');\n assert.equal(firstNode, this.$('#start-node')[0], 'a tagless component should have a range enclosing all of its nodes');\n assert.equal(lastNode, this.$('#before-end-node')[0].nextSibling, 'a tagless component should have a range enclosing all of its nodes');\n }\n\n ['@test getViewClientRects'](assert) {\n if (!hasGetClientRects || !ClientRectListCtor) {\n assert.ok(true, 'The test environment does not support the DOM API required to run this test.');\n return;\n }\n\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

    Hi, mom!

    `\n });\n\n this.render(`{{hi-mom}}`);\n\n assert.ok((0, _views.getViewClientRects)(component) instanceof ClientRectListCtor);\n }\n\n ['@test getViewBoundingClientRect'](assert) {\n if (!hasGetBoundingClientRect || !ClientRectCtor) {\n assert.ok(true, 'The test environment does not support the DOM API required to run this test.');\n return;\n }\n\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

    Hi, mom!

    `\n });\n\n this.render(`{{hi-mom}}`);\n\n assert.ok((0, _views.getViewBoundingClientRect)(component) instanceof ClientRectCtor);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/web-component-fallback-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: web component fallback', class extends _testCase.RenderingTest {\n ['@test custom elements are rendered']() {\n let template = `hello`;\n\n this.render(template);\n\n this.assertHTML(template);\n\n this.assertStableRerender();\n }\n\n ['@test custom elements can have bound attributes']() {\n let template = `hello`;\n\n this.render(template, { name: 'Robert' });\n\n this.assertHTML(`hello`);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Kris'));\n\n this.assertHTML(`hello`);\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Robert'));\n\n this.assertHTML(`hello`);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/will-destroy-element-hook-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Component willDestroyElement hook', class extends _testCase.RenderingTest {\n ['@test it calls willDestroyElement when removed by if'](assert) {\n let didInsertElementCount = 0;\n let willDestroyElementCount = 0;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n didInsertElementCount++;\n assert.notEqual(this.element.parentNode, null, 'precond component is in DOM');\n },\n willDestroyElement() {\n willDestroyElementCount++;\n assert.notEqual(this.element.parentNode, null, 'has not been removed from DOM yet');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{foo-bar}}{{/if}}', { switch: true });\n\n assert.equal(didInsertElementCount, 1, 'didInsertElement was called once');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n assert.equal(willDestroyElementCount, 1, 'willDestroyElement was called once');\n\n this.assertText('');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/content-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/debug', '@ember/object/computed', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers'], function (_testCase, _abstractTestCase, _metal, _debug, _computed, _runtime, _testHelpers, _views, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Static content tests', class extends _testCase.RenderingTest {\n ['@test it can render a static text node']() {\n this.render('hello');\n let text1 = this.assertTextNode(this.firstChild, 'hello');\n\n this.runTask(() => this.rerender());\n\n let text2 = this.assertTextNode(this.firstChild, 'hello');\n\n this.assertSameNode(text1, text2);\n }\n\n ['@test it can render a static element']() {\n this.render('

    hello

    ');\n let p1 = this.assertElement(this.firstChild, { tagName: 'p' });\n let text1 = this.assertTextNode(this.firstChild.firstChild, 'hello');\n\n this.runTask(() => this.rerender());\n\n let p2 = this.assertElement(this.firstChild, { tagName: 'p' });\n let text2 = this.assertTextNode(this.firstChild.firstChild, 'hello');\n\n this.assertSameNode(p1, p2);\n this.assertSameNode(text1, text2);\n }\n\n ['@test it can render a static template']() {\n let template = `\n
    \n

    Welcome to Ember.js

    \n
    \n
    \n

    Why you should use Ember.js?

    \n
      \n
    1. It's great
    2. \n
    3. It's awesome
    4. \n
    5. It's Ember.js
    6. \n
    \n
    \n
    \n Ember.js is free, open source and always will be.\n
    \n `;\n\n this.render(template);\n this.assertHTML(template);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(template);\n }\n }); /* globals EmberDev */\n\n\n class DynamicContentTest extends _testCase.RenderingTest {\n /* abstract */\n renderPath() /* path, context = {} */{\n throw new Error('Not implemented: `renderValues`');\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.firstChild, null);\n }\n\n /* abstract */\n assertContent() /* content */{\n throw new Error('Not implemented: `assertContent`');\n }\n\n ['@test it can render a dynamic path']() {\n this.renderPath('message', { message: 'hello' });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test resolves the string length properly']() {\n this.render('

    {{foo.length}}

    ', { foo: undefined });\n\n this.assertHTML('

    ');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'foo'));\n\n this.assertHTML('

    3

    ');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', ''));\n\n this.assertHTML('

    0

    ');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertHTML('

    ');\n }\n\n ['@test resolves the array length properly']() {\n this.render('

    {{foo.length}}

    ', { foo: undefined });\n\n this.assertHTML('

    ');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', [1, 2, 3]));\n\n this.assertHTML('

    3

    ');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', []));\n\n this.assertHTML('

    0

    ');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertHTML('

    ');\n }\n\n ['@test it can render a capitalized path with no deprecation']() {\n expectNoDeprecation();\n\n this.renderPath('CaptializedPath', { CaptializedPath: 'no deprecation' });\n\n this.assertContent('no deprecation');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'CaptializedPath', 'still no deprecation'));\n\n this.assertContent('still no deprecation');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'CaptializedPath', 'no deprecation'));\n\n this.assertContent('no deprecation');\n this.assertInvariants();\n }\n\n ['@test it can render undefined dynamic paths']() {\n this.renderPath('name', {});\n\n this.assertIsEmpty();\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'foo-bar'));\n\n this.assertContent('foo-bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', undefined));\n\n this.assertIsEmpty();\n }\n\n ['@test it can render a deeply nested dynamic path']() {\n this.renderPath('a.b.c.d.e.f', {\n a: { b: { c: { d: { e: { f: 'hello' } } } } }\n });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'a.b.c.d.e.f', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'a.b.c.d', { e: { f: 'aloha' } }));\n\n this.assertContent('aloha');\n this.assertInvariants();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'a', { b: { c: { d: { e: { f: 'hello' } } } } });\n });\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a computed property']() {\n let Formatter = _runtime.Object.extend({\n formattedMessage: (0, _metal.computed)('message', function () {\n return this.get('message').toUpperCase();\n })\n });\n\n let m = Formatter.create({ message: 'hello' });\n\n this.renderPath('m.formattedMessage', { m });\n\n this.assertContent('HELLO');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(m, 'message', 'goodbye'));\n\n this.assertContent('GOODBYE');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'm', Formatter.create({ message: 'hello' })));\n\n this.assertContent('HELLO');\n this.assertInvariants();\n }\n\n ['@test it can render a computed property with nested dependency']() {\n let Formatter = _runtime.Object.extend({\n formattedMessage: (0, _metal.computed)('messenger.message', function () {\n return this.get('messenger.message').toUpperCase();\n })\n });\n\n let m = Formatter.create({ messenger: { message: 'hello' } });\n\n this.renderPath('m.formattedMessage', { m });\n\n this.assertContent('HELLO');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(m, 'messenger.message', 'goodbye'));\n\n this.assertContent('GOODBYE');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'm', Formatter.create({ messenger: { message: 'hello' } })));\n\n this.assertContent('HELLO');\n this.assertInvariants();\n }\n\n ['@test it can read from a proxy object']() {\n this.renderPath('proxy.name', {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertContent('Tom Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Yehuda Katz'));\n\n this.assertContent('Yehuda Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertContent('Godfrey Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Stefan Penner'));\n\n this.assertContent('Stefan Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertContent('Tom Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a nested path in a proxy object']() {\n this.renderPath('proxy.name.last', {\n proxy: _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', { first: 'Yehuda', last: 'Katz' }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', {\n name: { first: 'Godfrey', last: 'Chan' }\n }));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', { first: 'Stefan', last: 'Penner' }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a path flipping between a proxy and a real object']() {\n this.renderPath('proxyOrObject.name.last', {\n proxyOrObject: _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', {\n name: { first: 'Tom', last: 'Dale' }\n }));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', {\n name: { first: 'Yehuda', last: 'Katz' }\n }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', _runtime.ObjectProxy.create({\n content: { name: { first: 'Godfrey', last: 'Chan' } }\n })));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.content.name', {\n first: 'Stefan',\n last: 'Penner'\n }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a path flipping between a real object and a proxy']() {\n this.renderPath('objectOrProxy.name.last', {\n objectOrProxy: { name: { first: 'Tom', last: 'Dale' } }\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content', {\n name: { first: 'Yehuda', last: 'Katz' }\n }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', {\n name: { first: 'Godfrey', last: 'Chan' }\n }));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.name', {\n first: 'Stefan',\n last: 'Penner'\n }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', {\n name: { first: 'Tom', last: 'Dale' }\n }));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a null object']() {\n let nullObject = Object.create(null);\n nullObject['message'] = 'hello';\n\n this.renderPath('nullObject.message', { nullObject });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(nullObject, 'message', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n nullObject = Object.create(null);\n nullObject['message'] = 'hello';\n\n this.runTask(() => (0, _metal.set)(this.context, 'nullObject', nullObject));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a readOnly property of a path']() {\n let Messenger = _runtime.Object.extend({\n message: (0, _computed.readOnly)('a.b.c')\n });\n\n let messenger = Messenger.create({\n a: {\n b: {\n c: 'hello'\n }\n }\n });\n\n this.renderPath('messenger.message', { messenger });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(messenger, 'a.b.c', 'hi'));\n\n this.assertContent('hi');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'messenger.a.b', {\n c: 'goodbye'\n }));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'messenger', {\n message: 'hello'\n }));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a property on a function']() {\n let func = () => {};\n func.aProp = 'this is a property on a function';\n\n this.renderPath('func.aProp', { func });\n\n this.assertContent('this is a property on a function');\n\n this.assertStableRerender();\n\n // this.runTask(() => set(func, 'aProp', 'still a property on a function'));\n // this.assertContent('still a property on a function');\n // this.assertInvariants();\n\n // func = () => {};\n // func.aProp = 'a prop on a new function';\n\n // this.runTask(() => set(this.context, 'func', func));\n\n // this.assertContent('a prop on a new function');\n // this.assertInvariants();\n }\n }\n\n const EMPTY = {};\n\n class ContentTestGenerator {\n constructor(cases, tag = '@test') {\n this.cases = cases;\n this.tag = tag;\n }\n\n generate([value, expected, label]) {\n let tag = this.tag;\n label = label || value;\n\n if (expected === EMPTY) {\n return {\n [`${tag} rendering ${label}`]() {\n this.renderPath('value', { value });\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', value));\n\n this.assertIsEmpty();\n }\n };\n } else {\n return {\n [`${tag} rendering ${label}`]() {\n this.renderPath('value', { value });\n\n this.assertContent(expected);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('hello');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', value));\n\n this.assertContent(expected);\n this.assertInvariants();\n }\n };\n }\n }\n }\n\n const SharedContentTestCases = new ContentTestGenerator([['foo', 'foo'], [0, '0'], [-0, '0', '-0'], [1, '1'], [-1, '-1'], [0.0, '0', '0.0'], [0.5, '0.5'], [undefined, EMPTY], [null, EMPTY], [true, 'true'], [false, 'false'], [NaN, 'NaN'], [new Date(2000, 0, 1), String(new Date(2000, 0, 1)), 'a Date object'], [Infinity, 'Infinity'], [1 / -0, '-Infinity'], [{ foo: 'bar' }, '[object Object]', `{ foo: 'bar' }`], [{\n toString() {\n return 'foo';\n }\n }, 'foo', 'an object with a custom toString function'], [{\n valueOf() {\n return 1;\n }\n }, '[object Object]', 'an object with a custom valueOf function'],\n\n // Escaping tests\n ['MaxJames', 'MaxJames']]);\n\n let GlimmerContentTestCases = new ContentTestGenerator([[Object.create(null), EMPTY, 'an object with no toString']]);\n\n if (typeof Symbol !== 'undefined') {\n GlimmerContentTestCases.cases.push([Symbol('debug'), 'Symbol(debug)', 'a symbol']);\n }\n\n (0, _abstractTestCase.applyMixins)(DynamicContentTest, SharedContentTestCases, GlimmerContentTestCases);\n\n (0, _testCase.moduleFor)('Dynamic content tests (content position)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`{{${path}}}`, context);\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one text node');\n this.assertTextNode(this.firstChild, content);\n // this.takeSnapshot();\n }\n\n ['@test it can render empty safe strings [GH#16314]']() {\n this.render('before {{value}} after', { value: (0, _helpers.htmlSafe)('hello') });\n\n this.assertHTML('before hello after');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('')));\n\n this.assertHTML('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('hello')));\n\n this.assertHTML('before hello after');\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (content concat)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`{{concat \"\" ${path} \"\"}}`, context);\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one text node');\n this.assertTextNode(this.firstChild, content);\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (inside an element)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`

    {{${path}}}

    `, context);\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one

    tag');\n this.assertElement(this.firstChild, { tagName: 'p' });\n this.assertText('');\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one

    tag');\n this.assertElement(this.firstChild, { tagName: 'p' });\n this.assertText(content);\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (attribute position)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`

    `, context);\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one
    tag');\n this.assertElement(this.firstChild, { tagName: 'div', content: '' });\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: { 'data-foo': content },\n content: ''\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 this.runTask(() => this.rerender());\n super.assertInvariants();\n }\n\n assertInvariants() {\n // 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 (0, _testCase.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('{{{htmlContent}}}{{{nested.htmlContent}}}', {\n htmlContent: 'Max',\n nested: { htmlContent: 'James' }\n });\n\n this.assertContent('MaxJames');\n\n this.runTask(() => this.rerender());\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'htmlContent', 'Max'));\n\n this.assertContent('MaxJames');\n\n this.runTask(() => (0, _metal.set)(this.context, 'nested.htmlContent', 'Jammie'));\n\n this.assertContent('MaxJammie');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'htmlContent', 'Max');\n (0, _metal.set)(this.context, 'nested', { htmlContent: 'James' });\n });\n\n this.assertContent('MaxJames');\n }\n\n ['@test empty content in trusted curlies [GH#14978]']() {\n this.render('before {{{value}}} after', {\n value: 'hello'\n });\n\n this.assertContent('before hello after');\n\n this.runTask(() => this.rerender());\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', undefined));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', null));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', ''));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('')));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (integration)', class extends _testCase.RenderingTest {\n ['@test it can render a dynamic template']() {\n let template = `\n
    \n

    Welcome to {{framework}}

    \n
    \n
    \n

    Why you should use {{framework}}?

    \n
      \n
    1. It's great
    2. \n
    3. It's awesome
    4. \n
    5. It's {{framework}}
    6. \n
    \n
    \n
    \n {{framework}} is free, open source and always will be.\n
    \n `;\n\n let ember = `\n
    \n

    Welcome to Ember.js

    \n
    \n
    \n

    Why you should use Ember.js?

    \n
      \n
    1. It's great
    2. \n
    3. It's awesome
    4. \n
    5. It's Ember.js
    6. \n
    \n
    \n
    \n Ember.js is free, open source and always will be.\n
    \n `;\n\n let react = `\n
    \n

    Welcome to React

    \n
    \n
    \n

    Why you should use React?

    \n
      \n
    1. It's great
    2. \n
    3. It's awesome
    4. \n
    5. It's React
    6. \n
    \n
    \n
    \n React is free, open source and always will be.\n
    \n `;\n\n this.render(template, {\n framework: 'Ember.js'\n });\n this.assertHTML(ember);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(ember);\n\n this.runTask(() => (0, _metal.set)(this.context, 'framework', 'React'));\n\n this.assertHTML(react);\n\n this.runTask(() => (0, _metal.set)(this.context, 'framework', 'Ember.js'));\n\n this.assertHTML(ember);\n }\n\n ['@test it should evaluate to nothing if part of the path is `undefined`']() {\n this.render('{{foo.bar.baz.bizz}}', {\n foo: {}\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hey!' } }\n }));\n\n this.assertText('Hey!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hello!' } }\n }));\n\n this.assertText('Hello!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n\n ['@test it should evaluate to nothing if part of the path is a primative']() {\n this.render('{{foo.bar.baz.bizz}}', {\n foo: { bar: true }\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: false\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: 'Haha'\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: null\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: undefined\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: 1\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hello!' } }\n }));\n\n this.assertText('Hello!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: true\n }));\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\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.url', 'http://linkedin.com'));\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://linkedin.com' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { url: 'http://example.com' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n }\n\n ['@test quoteless class attributes update correctly']() {\n this.render('
    hello
    ', {\n fooBar: true\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertElement(this.firstChild, { tagName: 'div', content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n }\n\n ['@test quoted class attributes update correctly'](assert) {\n this.render('
    hello
    ', {\n fooBar: true\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n assert.equal(this.firstChild.className, '');\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { classes: 'foo bar baz' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n }\n\n ['@test unquoted class attribute']() {\n this.render('
    hello
    ', {\n model: {\n foo: 'foo'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'foo' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n }\n\n ['@test quoted class attribute']() {\n this.render('
    hello
    ', {\n model: {\n foo: 'foo'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'foo' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { classes: 'foo bar baz' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar bizz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bar bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', null));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, '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: { class: (0, _testHelpers.classes)('foo bar bizz') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.hasShape', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large round') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.hasSize', false));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('round') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, '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: { class: (0, _testHelpers.classes)('large') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.foo', null);\n (0, _metal.set)(this.context, 'model.fizz', null);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('bar baz') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar',\n fizz: 'fizz',\n baz: 'baz'\n });\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.bar', null);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static ' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar'\n });\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n }\n });\n\n let warnings, originalWarn;\n class StyleTest extends _testCase.RenderingTest {\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 (0, _testCase.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\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', 'height: 60px;'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'height: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', null));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {}\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { style: 'width: 60px;' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n }\n\n ['@test can set dynamic style with -html-safe']() {\n this.render('
    ', {\n model: {\n style: (0, _helpers.htmlSafe)('width: 60px;')\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', 'height: 60px;'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'height: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { style: 'width: 60px;' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n }\n });\n\n if (!EmberDev.runningProdBuild) {\n (0, _testCase.moduleFor)('Inline style tests - warnings', class extends StyleTest {\n ['@test specifying
    generates a warning']() {\n let userValue = 'width: 42px';\n this.render('
    ', {\n userValue\n });\n\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `attributeBindings: [\"style\"]` generates a warning']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['style']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n let userValue = 'width: 42px';\n this.render('{{foo-bar style=userValue}}', {\n userValue\n });\n\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `
    ` works properly without a warning']() {\n this.render('
    ', {\n userValue: 'width: 42px'\n });\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\n this.assertNoWarning();\n }\n\n ['@test null value do not generate htmlsafe warning']() {\n this.render('
    ', {\n userValue: null\n });\n\n this.assertNoWarning();\n }\n\n ['@test undefined value do not generate htmlsafe warning']() {\n this.render('
    ');\n\n this.assertNoWarning();\n }\n\n ['@test no warnings are triggered when using `-html-safe`']() {\n this.render('
    ', {\n userValue: 'width: 42px'\n });\n\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\n this.assertNoWarning();\n }\n\n ['@test binding warning is triggered when an unsafe string is quoted']() {\n let userValue = 'width: 42px';\n this.render('
    ', {\n userValue\n });\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 let userValue = 'width: 42px';\n this.render('
    ', {\n userValue: new _helpers.SafeString('width: 42px')\n });\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 let userValue = '42px';\n this.render('
    ', {\n userValue: new _helpers.SafeString(userValue)\n });\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 let userValue = 'width';\n this.render('
    ', {\n userProperty: new _helpers.SafeString(userValue)\n });\n\n this.assertStyleWarning(`color: green; ${userValue}: 42px`);\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/custom-component-manager-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/metal', '@ember/canary-features', '@ember/-internals/glimmer'], function (_testCase, _runtime, _metal, _canaryFeatures, _glimmer) {\n 'use strict';\n\n if (_canaryFeatures.GLIMMER_CUSTOM_COMPONENT_MANAGER) {\n class ComponentManagerTest extends _testCase.RenderingTest {\n constructor(assert) {\n super(...arguments);\n\n this.registerComponentManager('basic', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent(factory, args) {\n return factory.create({ args });\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 this.registerComponentManager('instrumented-full', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4', {\n destructor: true,\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({ args });\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 (0, _testCase.moduleFor)('Component Manager - Curly Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    {{greeting}} world

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`

    hello world

    `);\n }\n\n ['@test it can have no template context']() {\n this.registerComponentManager('pseudo-template-only', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent() {\n return null;\n },\n\n updateComponent() {},\n\n getContext() {\n return null;\n }\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('pseudo-template-only', {});\n\n this.registerComponent('foo-bar', {\n template: `

    {{@greeting}} world

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar greeting=\"hello\"}}');\n\n this.assertHTML(`

    hello world

    `);\n }\n\n ['@test it can discover component manager through inheritance - ES Classes']() {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('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 class Base {}\n (0, _glimmer.setComponentManager)('test', Base);\n class Child extends Base {}\n class Grandchild extends Child {\n constructor() {\n super();\n this.name = 'grandchild';\n }\n }\n\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can discover component manager through inheritance - Ember Object']() {\n let Parent = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend());\n let Child = Parent.extend();\n let Grandchild = Child.extend({\n init() {\n this._super(...arguments);\n this.name = 'grandchild';\n }\n });\n\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can customize the template context']() {\n let customContext = {\n greeting: 'goodbye'\n };\n\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent(factory) {\n return factory.create();\n },\n\n getContext() {\n return customContext;\n },\n\n updateComponent() {}\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello',\n count: 1234\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    {{greeting}} world {{count}}

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`

    goodbye world

    `);\n\n this.runTask(() => (0, _metal.set)(customContext, 'greeting', 'sayonara'));\n\n this.assertHTML(`

    sayonara world

    `);\n }\n\n ['@test it can set arguments on the component instance']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _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\n this.registerComponent('foo-bar', {\n template: `

    {{salutation}}

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar firstName=\"Yehuda\" lastName=\"Katz\"}}');\n\n this.assertHTML(`

    Yehuda Katz

    `);\n }\n\n ['@test arguments are updated if they change']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _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\n this.registerComponent('foo-bar', {\n template: `

    {{salutation}}

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar firstName=firstName lastName=lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n\n this.assertHTML(`

    Yehuda Katz

    `);\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n\n this.assertHTML(`

    Chad Hietala

    `);\n }\n\n ['@test it can opt-in to running destructor'](assert) {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('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 let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello',\n destroy() {\n assert.step('component.destroy()');\n this._super(...arguments);\n }\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    {{greeting}} world

    `,\n ComponentClass\n });\n\n this.render('{{#if show}}{{foo-bar}}{{/if}}', { show: true });\n\n this.assertHTML(`

    hello world

    `);\n\n this.runTask(() => this.context.set('show', false));\n\n this.assertText('');\n\n assert.verifySteps(['createComponent', 'destroyComponent', 'component.destroy()']);\n }\n\n ['@test it can opt-in to running async lifecycle hooks'](assert) {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4', {\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({ args });\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 let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    {{greeting}} {{@name}}

    `,\n ComponentClass\n });\n\n this.render('{{foo-bar name=name}}', { name: 'world' });\n\n this.assertHTML(`

    hello world

    `);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n\n this.runTask(() => this.context.set('name', 'max'));\n this.assertHTML(`

    hello max

    `);\n assert.verifySteps(['updateComponent', 'didUpdateComponent']);\n }\n });\n\n if (_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) {\n (0, _testCase.moduleFor)('Component Manager - Angle Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    {{greeting}} world

    `,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

    hello world

    `);\n }\n\n ['@test it can set arguments on the component instance']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _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\n this.registerComponent('foo-bar', {\n template: `

    {{salutation}}

    `,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

    Yehuda Katz

    `);\n }\n\n ['@test it can pass attributes']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend());\n\n this.registerComponent('foo-bar', {\n template: `

    Hello world!

    `,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

    Hello world!

    `);\n }\n\n ['@test arguments are updated if they change']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _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\n this.registerComponent('foo-bar', {\n template: `

    {{salutation}}

    `,\n ComponentClass\n });\n\n this.render('', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n\n this.assertHTML(`

    Yehuda Katz

    `);\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n\n this.assertHTML(`

    Chad Hietala

    `);\n }\n\n ['@test updating attributes triggers didUpdateComponent'](assert) {\n let ComponentClass = (0, _glimmer.setComponentManager)('instrumented-full', _runtime.Object.extend({\n didRender() {},\n didUpdate() {}\n }));\n\n this.registerComponent('foo-bar', {\n template: `

    Hello world!

    `,\n ComponentClass\n });\n\n this.render('', { value: 'foo' });\n\n this.assertHTML(`

    Hello world!

    `);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n\n this.runTask(() => this.context.set('value', 'bar'));\n assert.verifySteps(['didUpdateComponent']);\n }\n });\n }\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/event-dispatcher-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/runloop', '@ember/instrumentation', '@ember/canary-features', '@ember/-internals/views', '@ember/-internals/utils', '@glimmer/env'], function (_testCase, _helpers, _runloop, _instrumentation, _canaryFeatures, _views, _utils, _env) {\n 'use strict';\n\n let canDataTransfer = !!document.createEvent('HTMLEvents').dataTransfer;\n\n function fireNativeWithDataTransfer(node, type, dataTransfer) {\n let event = document.createEvent('HTMLEvents');\n event.initEvent(type, true, true);\n event.dataTransfer = dataTransfer;\n node.dispatchEvent(event);\n }\n\n (0, _testCase.moduleFor)('EventDispatcher', class extends _testCase.RenderingTest {\n ['@test events bubble view hierarchy for form elements'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.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 let receivedEvent;\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-bar}}`);\n\n this.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 let receivedEvent;\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-bar}}`);\n\n this.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 let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {}\n }),\n template: ``\n });\n\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n\n this.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'](assert) {\n let hasReceivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n hasReceivedEvent = true;\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {\n return false;\n }\n }),\n template: ``\n });\n\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n\n this.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 template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('#is-done').trigger('click');\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `
    `\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // mouse moves over #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: outer });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, outer);\n\n // mouse moves over #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseover', { relatedTarget: outer });\n this.$(outer).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was not triggered again');\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseout', { relatedTarget: outer });\n this.$(outer).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 0, 'mouseleave event was not triggered');\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: outer });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, outer);\n }\n\n ['@test delegated event listeners work for mouseEnter on SVG elements'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'svg',\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // mouse moves over #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: outer });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, outer);\n\n // mouse moves over #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseover', { relatedTarget: outer });\n this.$(outer).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was not triggered again');\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseout', { relatedTarget: outer });\n this.$(outer).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 0, 'mouseleave event was not triggered');\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: outer });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, outer);\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave with skipped events'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `
    `\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // we replicate fast mouse movement, where mouseover is fired directly in #inner, skipping #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, inner);\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, inner);\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave with skipped events and subcomponent'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend(),\n template: ``\n });\n\n this.render(`{{#x-outer id=\"outer\"}}{{x-inner id=\"inner\"}}{{/x-outer}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // we replicate fast mouse movement, where mouseover is fired directly in #inner, skipping #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, inner);\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: inner });\n });\n\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, inner);\n }\n });\n\n (0, _testCase.moduleFor)('EventDispatcher#setup', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n let dispatcher = this.owner.lookup('event_dispatcher:main');\n (0, _runloop.run)(dispatcher, 'destroy');\n this.owner.__container__.reset('event_dispatcher:main');\n this.dispatcher = this.owner.lookup('event_dispatcher:main');\n }\n\n ['@test additional events can be specified'](assert) {\n this.dispatcher.setup({ 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 template: `

    Hello!

    `\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('div').trigger('myevent');\n }\n\n ['@test a rootElement can be specified'](assert) {\n this.element.innerHTML = '
    ';\n // this.$().append('
    ');\n this.dispatcher.setup({ myevent: 'myEvent' }, '#app');\n\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({ 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\n this.render(`{{x-foo}}`);\n\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({ myevent: 'myEvent' }, '#app');\n });\n }\n });\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _testCase.moduleFor)('EventDispatcher - Instrumentation', class extends _testCase.RenderingTest {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test instruments triggered events'](assert) {\n let clicked = 0;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click() {\n clicked++;\n }\n }),\n template: `

    hello

    `\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('div').trigger('click');\n\n assert.equal(clicked, 1, 'precond - the click handler was invoked');\n\n let clickInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.click', {\n before() {\n clickInstrumented++;\n assert.equal(clicked, 1, 'invoked before event is handled');\n },\n after() {\n clickInstrumented++;\n assert.equal(clicked, 2, 'invoked after event is handled');\n }\n });\n\n let keypressInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.keypress', {\n before() {\n keypressInstrumented++;\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 if (canDataTransfer) {\n (0, _testCase.moduleFor)('EventDispatcher - Event Properties', class extends _testCase.RenderingTest {\n ['@test dataTransfer property is added to drop event'](assert) {\n let 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\n fireNativeWithDataTransfer(this.$('div')[0], 'drop', 'success');\n assert.equal(receivedEvent.dataTransfer, 'success');\n }\n });\n }\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('EventDispatcher#native-events', class extends _testCase.RenderingTest {\n ['@test native events are passed when jQuery is not present'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n assert.ok(receivedEvent, 'click event was triggered');\n assert.notOk(receivedEvent.originalEvent, 'event is not a jQuery.Event');\n }\n });\n } else {\n (0, _testCase.moduleFor)('EventDispatcher#jquery-events', class extends _testCase.RenderingTest {\n beforeEach() {\n this.jqueryIntegration = window.ENV._JQUERY_INTEGRATION;\n }\n\n afterEach() {\n window.ENV._JQUERY_INTEGRATION = this.jqueryIntegration;\n }\n\n ['@test jQuery events are passed when jQuery is present'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n assert.ok(receivedEvent, 'click event was triggered');\n assert.ok(receivedEvent instanceof _views.jQuery.Event, 'event is a jQuery.Event');\n }\n\n [`@${_utils.HAS_NATIVE_PROXY ? 'test' : 'skip'} accessing jQuery.Event#originalEvent is deprecated`](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectDeprecation(() => {\n let { originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of originalEvent are available');\n }, 'Accessing jQuery.Event specific properties is deprecated. Either use the ember-jquery-legacy addon to normalize events to native events, or explicitly opt into jQuery integration using @ember/optional-features.');\n }\n\n ['@test other jQuery.Event properties do not trigger deprecation'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n receivedEvent.stopPropagation();\n receivedEvent.stopImmediatePropagation();\n receivedEvent.preventDefault();\n assert.ok(receivedEvent.bubbles, 'properties of jQuery event are available');\n assert.equal(receivedEvent.type, 'click', 'properties of jQuery event are available');\n });\n }\n\n ['@test accessing jQuery.Event#originalEvent does not trigger deprecations when jquery integration is explicitly enabled'](assert) {\n let receivedEvent;\n window.ENV._JQUERY_INTEGRATION = true;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n let { originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of originalEvent are available');\n });\n }\n\n [`@${_utils.HAS_NATIVE_PROXY && _env.DEBUG ? 'test' : 'skip'} accessing jQuery.Event#__originalEvent does not trigger deprecations to support ember-jquery-legacy`](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n let { __originalEvent: originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has __originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of __originalEvent are available');\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/-class-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/metal'], function (_testCase, _testHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{-class}}', class extends _testCase.RenderingTest {\n ['@test casts binding to dasherized class']() {\n this.registerComponent('foo-bar', { template: '' });\n this.render(`{{foo-bar class=(-class someTruth \"someTruth\")}}`, {\n someTruth: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'someTruth', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n }\n\n ['@tests casts leaf path of binding to dasherized class']() {\n this.registerComponent('foo-bar', { template: '' });\n this.render(`{{foo-bar class=(-class model.someTruth \"someTruth\")}}`, {\n model: {\n someTruth: true\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { someTruth: true }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/closure-action-test', ['@ember/instrumentation', '@ember/runloop', '@ember/-internals/metal', '@ember/canary-features', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_instrumentation, _runloop, _metal, _canaryFeatures, _testCase, _abstractTestCase, _helpers) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _testCase.moduleFor)('Helpers test: closure {{action}} improved instrumentation', class extends _testCase.RenderingTest {\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 let actionParam = 'So krispy';\n let beforeParameters = [];\n let afterParameters = [];\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n this.attrs.submit(actionParam);\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {}\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.args);\n },\n after(name, timestamp, payload) {\n afterParameters.push(payload.args);\n }\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\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 let beforeParameters = [];\n let afterParameters = [];\n\n let InnerComponent = _helpers.Component.extend({\n myProperty: 'inner-thing',\n actions: {\n fireAction() {\n this.attrs.submit();\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n myProperty: 'outer-thing',\n outerSubmit() {}\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.target.get('myProperty'));\n },\n after(name, timestamp, payload) {\n afterParameters.push(payload.target.get('myProperty'));\n }\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\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 let returnedValue = 'Chris P is so krispy';\n let actualReturnedValue;\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n actualReturnedValue = this.attrs.submit();\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return returnedValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before() {},\n after() {}\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\n\n this.assert.equal(actualReturnedValue, returnedValue, 'action can return to caller');\n }\n });\n }\n\n (0, _testCase.moduleFor)('Helpers test: closure {{action}}', class extends _testCase.RenderingTest {\n ['@test action should be called']() {\n let outerActionCalled = false;\n let component;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n outerActionCalled = true;\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 outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n component.fireAction();\n });\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 somethingThatIsUndefined)}}'\n });\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 nonFunctionThing)}}'\n });\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 attrs.foo']() {\n this.registerComponent('inner-component', {\n template: ''\n });\n\n this.registerComponent('outer-component', {\n template: '{{inner-component}}'\n });\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 let expectedValue = 'terrible tom';\n let returnedValue;\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n returnedValue = this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return expectedValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let innerComponent;\n let outerComponent;\n let actualComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n isOuterComponent: true,\n outerSubmit() {\n actualComponent = this;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let first = 'mitch';\n let second = 'martin';\n let third = 'matt';\n let fourth = 'wacky wycats';\n\n let innerComponent;\n let actualArgs;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(fourth);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n third,\n outerSubmit() {\n // eslint-disable-line no-unused-vars\n actualArgs = [...arguments];\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (action outerSubmit \"${first}\") \"${second}\" third)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let value = {};\n let component;\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n outerAction(incomingValue) {\n value = 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 \"outerAction\" this)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.strictEqual(value, component, 'the component is passed at `this`');\n }\n\n ['@test arguments to action are bound']() {\n let value = 'lazy leah';\n\n let innerComponent;\n let outerComponent;\n let actualArg;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n value: '',\n outerSubmit(incomingValue) {\n actualArg = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerSubmit value)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.strictEqual(actualArg, '', 'action has the correct first arg');\n\n this.runTask(() => {\n outerComponent.set('value', value);\n });\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let first = 'foo';\n let second = [3, 5];\n let third = [4, 9];\n\n let actualFirst;\n let actualSecond;\n let actualThird;\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(second, third);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerSubmit(incomingFirst, incomingSecond, incomingThird) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n actualThird = incomingThird;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerSubmit first)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n outerComponent.set('first', first);\n outerComponent.set('second', second);\n });\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let newValue = 'trollin trek';\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(newValue);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut outerMut))}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let newValue = 'trollin trek';\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut outerMut) '${newValue}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(outerComponent.get('outerMut'), newValue, 'mut value is set');\n }\n\n ['@test action can create closures over actions']() {\n let first = 'raging robert';\n let second = 'mild machty';\n let returnValue = 'butch brian';\n\n let actualFirst;\n let actualSecond;\n let actualReturnedValue;\n\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n actualReturnedValue = this.attrs.submit(second);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' '${first}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let InnerComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n something() {\n // 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 this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\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 let InnerComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({});\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\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 let innerComponent;\n let actionCalled = false;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let 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 this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' target=otherComponent)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.ok(actionCalled, 'action called on otherComponent');\n }\n\n ['@test value can be used with action over actions']() {\n let newValue = 'yelping yehuda';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerContent: {\n readProp: newValue\n },\n actions: {\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualValue, newValue, 'value is read');\n }\n\n ['@test action will read the value of a first property']() {\n let newValue = 'irate igor';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerAction value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\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 let newValue = 'kissing kris';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n objectArgument: {\n readProp: newValue\n },\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerAction objectArgument value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualValue, newValue, 'property is read');\n }\n\n ['@test action closure does not get auto-mut wrapped'](assert) {\n let first = 'raging robert';\n let second = 'mild machty';\n let returnValue = 'butch brian';\n\n let innerComponent;\n let actualFirst;\n let actualSecond;\n let actualReturnedValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.get('submit')(second);\n this.get('attrs-submit')(second);\n let attrsSubmitReturnValue = this.attrs['attrs-submit'](second);\n let submitReturnValue = this.attrs.submit(second);\n\n assert.equal(attrsSubmitReturnValue, submitReturnValue, 'both attrs.foo and foo should behave the same');\n\n return submitReturnValue;\n }\n });\n\n let MiddleComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: `{{inner-component attrs-submit=attrs.submit submit=submit}}`\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{middle-component submit=(action 'outerAction' '${first}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n actualReturnedValue = innerComponent.fireAction();\n });\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 let innerComponent;\n let capturedRunLoop;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n submit() {\n capturedRunLoop = (0, _runloop.getCurrentRunLoop)();\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'submit')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.ok(capturedRunLoop, 'action is called within a run loop');\n }\n\n ['@test objects that define INVOKE can be casted to actions']() {\n let innerComponent;\n let actionArgs;\n let invokableArgs;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n actionArgs = this.attrs.submit(4, 5, 6);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n foo: 123,\n submitTask: (0, _metal.computed)(function () {\n return {\n [_helpers.INVOKE]: (...args) => {\n invokableArgs = args;\n return this.foo;\n }\n };\n })\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action submitTask 1 2 3)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actionArgs, 123);\n this.assert.deepEqual(invokableArgs, [1, 2, 3, 4, 5, 6]);\n }\n\n ['@test closure action with `(mut undefinedThing)` works properly [GH#13959]']() {\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n label: undefined,\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assertText('Click me');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', 'Dun clicked');\n });\n\n this.assertText('Dun clicked');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', undefined);\n });\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 let clicked = 0;\n let didReceiveAttrsFired = 0;\n\n let 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 this.registerComponent('click-me', {\n ComponentClass: ClickMeComponent\n });\n\n let outer;\n\n let OuterComponent = _helpers.Component.extend({\n clicked: 0,\n\n actions: {\n 'on-click': function () {\n this.incrementProperty('clicked');\n }\n },\n\n init() {\n this._super();\n outer = this;\n this.set('onClick', () => this.incrementProperty('clicked'));\n }\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: _abstractTestCase.strip`\n
    clicked: {{clicked}}; foo: {{foo}}
    \n\n {{click-me id=\"string-action\" onClick=(action \"on-click\")}}\n {{click-me id=\"function-action\" onClick=(action onClick)}}\n {{click-me id=\"mut-action\" onClick=(action (mut clicked))}}\n `\n });\n\n this.render('{{outer-component foo=foo}}', { foo: 1 });\n\n this.assertText('clicked: 0; foo: 1');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.rerender());\n\n this.assertText('clicked: 0; foo: 1');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 2));\n\n this.assertText('clicked: 0; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#string-action').click());\n\n this.assertText('clicked: 1; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#function-action').click());\n\n this.assertText('clicked: 2; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => (0, _metal.set)(outer, 'onClick', function () {\n outer.incrementProperty('clicked');\n }));\n\n this.assertText('clicked: 2; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#function-action').click());\n\n this.assertText('clicked: 3; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#mut-action').click());\n\n this.assertText('clicked: 4; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/concat-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{concat}}', class extends _testCase.RenderingTest {\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 model.first model.second}}`, {\n model: { first: 'one', second: 'two' }\n });\n\n this.assertText('onetwo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('onetwo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n\n this.assertText('threetwo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.second', 'four'));\n\n this.assertText('threefour');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { first: 'one', second: 'two' }));\n\n this.assertText('onetwo');\n }\n\n ['@test it can be used as a sub-expression']() {\n this.render(`{{concat (concat model.first model.second) (concat model.third model.fourth)}}`, {\n model: {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n }\n });\n\n this.assertText('onetwothreefour');\n\n this.runTask(() => this.rerender());\n\n this.assertText('onetwothreefour');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'five'));\n\n this.assertText('fivetwothreefour');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.second', 'six');\n (0, _metal.set)(this.context, 'model.third', 'seven');\n });\n\n this.assertText('fivesixsevenfour');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n });\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\n this.render(`{{#if (x-eq (concat model.first model.second) \"onetwo\")}}Truthy!{{else}}False{{/if}}`, {\n model: {\n first: 'one',\n second: 'two'\n }\n });\n\n this.assertText('Truthy!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Truthy!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n\n this.assertText('False');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { first: 'one', second: 'two' }));\n\n this.assertText('Truthy!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/metal'], function (_testCase, _internalTestHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: custom helpers', class extends _testCase.RenderingTest {\n ['@test it cannot override built-in syntax']() {\n this.registerHelper('if', () => 'Nope');\n expectAssertion(() => {\n this.render(`{{if foo 'LOL'}}`, { foo: true });\n }, /You attempted to overwrite the built-in helper \\\"if\\\" 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\n this.render('{{hello}} | {{hello-world}}');\n\n this.assertText('hello | hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello | hello world');\n }\n\n ['@test it does not resolve helpers with a `.` (period)']() {\n this.registerHelper('hello.world', () => 'hello world');\n\n this.render('{{hello.world}}', {\n hello: {\n world: ''\n }\n });\n\n this.assertText('');\n\n this.assertStableRerender();\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'hello', { world: 'hello world!' }));\n\n this.assertText('hello world!');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'hello', {\n world: ''\n });\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\n this.assertText('hello | hello world');\n\n this.runTask(() => this.rerender());\n\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 `this._super\\(...arguments\\);` when overriding `init` on a framework object. Please update .* to call `this._super\\(...arguments\\);` from `init`./);\n }\n\n ['@test class-based helper can recompute a new value'](assert) {\n let destroyCount = 0;\n let computeCount = 0;\n let helper;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return ++computeCount;\n },\n destroy() {\n destroyCount++;\n this._super();\n }\n });\n\n this.render('{{hello-world}}');\n\n this.assertText('1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('1');\n\n this.runTask(() => helper.recompute());\n\n this.assertText('2');\n\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n }\n\n ['@test class-based helper with static arguments can recompute a new value'](assert) {\n let destroyCount = 0;\n let computeCount = 0;\n let helper;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return ++computeCount;\n },\n destroy() {\n destroyCount++;\n this._super();\n }\n });\n\n this.render('{{hello-world \"whut\"}}');\n\n this.assertText('1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('1');\n\n this.runTask(() => helper.recompute());\n\n this.assertText('2');\n\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\n this.render('{{#each (hello-world model) as |item|}}({{item}}){{/each}}', {\n model: ['bob']\n });\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\n this.render(`{{get (hello-world model=model) 'name'}}`, {\n model: { name: 'bob' }\n });\n\n this.assertText('bob');\n }\n\n ['@test simple helper is called for param changes'](assert) {\n let computeCount = 0;\n\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return `${value}-value`;\n });\n\n this.render('{{hello-world model.name}}', {\n model: { name: 'bob' }\n });\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('sal-value');\n\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob' }));\n\n this.assertText('bob-value');\n\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 let createCount = 0;\n let computeCount = 0;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n createCount++;\n },\n compute([value]) {\n computeCount++;\n return `${value}-value`;\n }\n });\n\n this.render('{{hello-world model.name}}', {\n model: { name: 'bob' }\n });\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('sal-value');\n\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob' }));\n\n this.assertText('bob-value');\n\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\n this.render('{{hello-world model.name \"rich\" first=model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => this.rerender());\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.age', 28));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob', 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 model.name \"rich\" first=model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => this.rerender());\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.age', 28));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob', 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 model.reason\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`, { model: { reason: 'force' } });\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.reason', 'Nickleback'));\n\n this.assertText('Who overcomes by Nickleback hath overcome but half his foe');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { 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\n this.render(`{{#if (should-show)}}true{{/if}}`);\n\n this.assertText('true');\n\n this.runTask(() => this.rerender());\n\n this.assertText('true');\n }\n\n ['@test parameterless helper is usable in attributes']() {\n this.registerHelper('foo-bar', () => {\n return 'baz';\n });\n\n this.render(`
    `);\n\n this.assertHTML('
    ');\n\n this.runTask(() => this.rerender());\n\n this.assertHTML('
    ');\n }\n\n ['@test simple helper not usable with a block']() {\n this.registerHelper('some-helper', () => {});\n\n expectAssertion(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Helpers may not be used in the block form/);\n }\n\n ['@test class-based helper not usable with a block']() {\n this.registerHelper('some-helper', {\n compute() {}\n });\n\n expectAssertion(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Helpers may not be used in the block form/);\n }\n\n ['@test simple helper not usable within element']() {\n this.registerHelper('some-helper', () => {});\n\n this.assert.throws(() => {\n this.render(`
    `);\n }, /Compile Error some-helper is not a modifier: Helpers may not be used in the element form/);\n }\n\n ['@test class-based helper not usable within element']() {\n this.registerHelper('some-helper', {\n compute() {}\n });\n\n this.assert.throws(() => {\n this.render(`
    `);\n }, /Compile Error some-helper is not a modifier: Helpers may not be used in the element form/);\n }\n\n ['@test class-based helper is torn down'](assert) {\n let destroyCalled = 0;\n\n this.registerHelper('some-helper', {\n destroy() {\n destroyCalled++;\n this._super(...arguments);\n },\n compute() {\n return 'must define a compute';\n }\n });\n\n this.render(`{{some-helper}}`);\n\n (0, _internalTestHelpers.runDestroy)(this.component);\n\n assert.strictEqual(destroyCalled, 1, 'destroy called once');\n }\n\n ['@test class-based helper used in subexpression can recompute']() {\n let helper;\n let phrase = 'overcomes by';\n\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n helper = this;\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\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n phrase = 'believes his';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who believes his force hath overcome but half his foe');\n\n phrase = 'overcomes by';\n\n this.runTask(() => helper.recompute());\n\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 let helper;\n let phrase = 'overcomes by';\n\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n helper = this;\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\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\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n phrase = 'believes his';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who believes his force hath overcome but half his foe');\n\n phrase = 'overcomes by';\n\n this.runTask(() => helper.recompute());\n\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 let destroyCount = 0;\n\n this.registerHelper('dynamic-segment', {\n phrase: 'overcomes by',\n init() {\n this._super(...arguments);\n },\n compute() {\n return this.phrase;\n },\n destroy() {\n destroyCount++;\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\n (0, _internalTestHelpers.runDestroy)(this.component);\n\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\n let instance = this.owner.factoryFor('helper:some-helper').create();\n\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 let instance = this.owner.factoryFor('helper:some-helper').create();\n\n assert.equal(typeof instance.compute, 'function', 'expected instance.compute to be present');\n assert.equal(instance.compute(), 'lolol', 'can invoke `.compute`');\n }\n }); /* globals EmberDev */\n\n\n if (!EmberDev.runningProdBuild) {\n class HelperMutatingArgsTests extends _testCase.RenderingTest {\n buildCompute() {\n return (params, hash) => {\n this.assert.throws(() => {\n params.push('foo');\n\n // cannot assert error message as it varies by platform\n });\n\n this.assert.throws(() => {\n hash.foo = 'bar';\n\n // cannot assert error message as it varies by platform\n });\n\n this.assert.throws(() => {\n hash.someUnusedHashProperty = 'bar';\n\n // 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=bar}}', { bar: 'derp' });\n }\n\n ['@test cannot mutate params - positional specified / no named specified']() {\n this.render('{{test-helper bar}}', { bar: 'derp' });\n }\n\n ['@test cannot mutate params - positional specified / named specified']() {\n this.render('{{test-helper bar foo=qux}}', { bar: 'derp', qux: 'baz' });\n }\n\n ['@test cannot mutate params - no positional specified / no named specified']() {\n this.render('{{test-helper}}', { bar: 'derp', qux: 'baz' });\n }\n }\n\n (0, _testCase.moduleFor)('Helpers test: mutation triggers errors - class based helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n\n let compute = this.buildCompute();\n\n this.registerHelper('test-helper', {\n compute\n });\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: mutation triggers errors - simple helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n\n let compute = this.buildCompute();\n\n this.registerHelper('test-helper', compute);\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/element-action-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/instrumentation', '@ember/canary-features', '@ember/-internals/runtime', '@ember/-internals/views'], function (_testCase, _abstractTestCase, _helpers, _metal, _instrumentation, _canaryFeatures, _runtime, _views) {\n 'use strict';\n\n function getActionAttributes(element) {\n let attributes = element.attributes;\n let actionAttrs = [];\n\n for (let i = 0; i < attributes.length; i++) {\n let 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 const isIE11 = !window.ActiveXObject && 'ActiveXObject' in window;\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _testCase.moduleFor)('Helpers test: element action instrumentation', class extends _testCase.RenderingTest {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test action should fire interaction event with proper params']() {\n let subscriberCallCount = 0;\n let subscriberPayload = null;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n (0, _instrumentation.subscribe)('interaction.ember-action', {\n before() {\n subscriberCallCount++;\n },\n after(name, time, payload) {\n subscriberPayload = payload;\n }\n });\n\n this.render('{{example-component}}');\n\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 (0, _testCase.moduleFor)('Helpers test: element action', class extends _testCase.RenderingTest {\n ['@test it can call an action on its enclosing component']() {\n let fooCallCount = 0;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {\n fooCallCount++;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(fooCallCount, 1, 'foo has been called 1 time');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let fooArgs = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n member: 'a',\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n foo(thing) {\n fooArgs.push(thing);\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.deepEqual(fooArgs, ['a'], 'foo has not been called');\n\n this.runTask(() => {\n component.set('member', 'b');\n });\n\n this.runTask(() => {\n this.$('button').click();\n });\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('');\n\n let button = this.$('button');\n\n let attributes = getActionAttributes(button[0]);\n\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 let showCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
    '\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#show').trigger('mouseup');\n });\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 let targetWatted = false;\n let innerWatted = false;\n\n let TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n }\n });\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n wat() {\n innerWatted = true;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '{{yield}}'\n });\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: _abstractTestCase.strip`\n {{#inner-component}}\n \n {{/inner-component}}\n `\n });\n\n this.render('{{target-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let targetWatted = false;\n\n let TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n }\n });\n\n let OtherComponent = _helpers.Component.extend({});\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n\n this.registerComponent('other-component', {\n ComponentClass: OtherComponent,\n template: 'Wat?'\n });\n\n this.render(_abstractTestCase.strip`\n {{#target-component as |parent|}}\n {{other-component anotherTarget=parent}}\n {{/target-component}}\n `);\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(targetWatted, true, 'the specified target was watted');\n }\n\n ['@test it should lazily evaluate the target']() {\n let firstEdit = 0;\n let secondEdit = 0;\n let component;\n\n let first = {\n edit() {\n firstEdit++;\n }\n };\n\n let second = {\n edit() {\n secondEdit++;\n }\n };\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n theTarget: first\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Edit'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(firstEdit, 1);\n\n this.runTask(() => {\n (0, _metal.set)(component, 'theTarget', second);\n });\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(firstEdit, 1);\n this.assert.equal(secondEdit, 1);\n }\n\n ['@test it should register an event handler']() {\n let editHandlerWasCalled = false;\n let shortcutHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me
    click me too
    '\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n this.runTask(() => {\n this.$('div[data-ember-action]').trigger('click', { 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 let editHandlerWasCalled = false;\n let shortcutHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n altKey: 'alt',\n anyKey: 'any',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me
    click me too
    '\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n this.runTask(() => {\n this.$('div[data-ember-action]').trigger('click', { 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 let editHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n acceptedKeys: 'alt',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n editHandlerWasCalled = false;\n\n this.runTask(() => {\n component.set('acceptedKeys', '');\n });\n\n this.runTask(() => {\n this.$('div[data-ember-action]').click();\n });\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 let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\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 let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\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 let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n isFalse: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\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\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\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 let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n shouldBubble: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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\n editHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n component.set('shouldBubble', true);\n });\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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 it should work properly in an #each block']() {\n let editHandlerWasCalled = false;\n\n let 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 this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each items as |item|}}click me{{/each}}'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n }\n\n ['@test it should work properly in a {{#with foo as |bar|}} block']() {\n let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n something: { ohai: 'there' },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#with something as |somethingElse|}}click me{{/with}}'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\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 let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#if isActive}}click me{{/if}}'\n });\n\n this.render('{{example-component isActive=isActive}}', {\n isActive: true\n });\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n\n let actionId;\n\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n\n assert.ok(_views.ActionManager.registeredActions[actionId], 'An action is registered');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is still present');\n\n assert.ok(_views.ActionManager.registeredActions[actionId], 'The action is still registered');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isActive', false));\n\n assert.strictEqual(this.$('a[data-ember-action]').length, 0, 'The element is removed');\n\n assert.ok(!_views.ActionManager.registeredActions[actionId], 'The action is unregistered');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isActive', true));\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n\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 let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
    '\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\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 let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\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 let sendHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n send() {\n sendHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\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 let passedTarget;\n let passedContext;\n let targetThis;\n\n let TargetComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n targetThis = this;\n },\n actions: {\n edit(context) {\n passedTarget = this === targetThis;\n passedContext = context;\n }\n }\n });\n\n let aContext;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n aContext = this;\n }\n });\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: _abstractTestCase.strip`\n {{#target-component as |aTarget|}}\n click me\n {{/target-component}}\n `\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\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 let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(editHandlerWasCalled, 'the event handler was called on click');\n\n editHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('a').trigger('mouseover');\n });\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 let passedContexts;\n let models = [_runtime.Object.create(), _runtime.Object.create()];\n\n let 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 this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let passedContexts;\n let model = _runtime.Object.create();\n\n let ExampleComponent = _helpers.Component.extend({\n model: model,\n actions: {\n edit(...args) {\n passedContexts = args;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let showCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n let assert = this.assert;\n\n let checkClick = (prop, value, expected) => {\n showCalled = false;\n let event = this.wrap(component.element).findAll('button').trigger('click', { [prop]: value })[0];\n if (expected) {\n assert.ok(showCalled, `should call action with ${prop}:${value}`);\n\n // IE11 does not allow simulated events to have a valid `defaultPrevented`\n if (!isIE11) {\n assert.ok(event.defaultPrevented, 'should prevent default');\n }\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\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 let showCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('input').trigger('keyup', { char: 'a', 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 let lastAction;\n let actionOrder = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n hookMeUp: 'rock',\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Whistle tips go woop woooop'\n });\n\n this.render('{{example-component}}');\n\n let test = this;\n\n let testBoundAction = propertyValue => {\n test.runTask(() => {\n component.set('hookMeUp', propertyValue);\n });\n\n test.runTask(() => {\n this.wrap(component.element).findAll('#bound-param').click();\n });\n\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n\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 let lastAction;\n let actionOrder = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n allactions: (0, _runtime.A)([{ title: 'Rock', name: 'rock' }, { title: 'Paper', name: 'paper' }, { title: 'Scissors', name: 'scissors' }]),\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each allactions as |allaction|}}{{allaction.title}}{{/each}}'\n });\n\n this.render('{{example-component}}');\n\n let test = this;\n\n let testBoundAction = propertyValue => {\n test.runTask(() => {\n this.wrap(component.element).findAll(`#${propertyValue}`).click();\n });\n\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n\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 let submitCalled = false;\n let incomingArg;\n\n let arg = 'rough ray';\n\n let ExampleComponent = _helpers.Component.extend({\n submit(actualArg) {\n incomingArg = actualArg;\n submitCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: `Hi`\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\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 let ExampleComponent = _helpers.Component.extend({\n actions: {\n ohNoeNotValid() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n expectAssertion(() => {\n this.render('{{example-component}}');\n }, 'You specified a quoteless path, `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 let clickActionWasCalled = false;\n let doubleClickActionWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n clicked() {\n clickActionWasCalled = true;\n },\n doubleClicked() {\n doubleClickActionWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: _abstractTestCase.strip`\n click me`\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').trigger('click');\n });\n\n this.assert.ok(clickActionWasCalled, 'the clicked action was called');\n\n this.runTask(() => {\n this.$('a').trigger('dblclick');\n });\n\n this.assert.ok(doubleClickActionWasCalled, 'the doubleClicked action was called');\n }\n\n ['@test it should respect preventDefault option if provided']() {\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n this.render('{{example-component}}');\n\n let event;\n\n this.runTask(() => {\n event = this.$('a').click()[0];\n });\n\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n }\n\n ['@test it should respect preventDefault option if provided bound']() {\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n shouldPreventDefault: false,\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n show() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n this.render('{{example-component}}');\n\n let event;\n\n this.runTask(() => {\n event = this.$('a').trigger(event)[0];\n });\n\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n\n this.runTask(() => {\n component.set('shouldPreventDefault', true);\n event = this.$('a').trigger('click')[0];\n });\n\n // IE11 does not allow simulated events to have a valid `defaultPrevented`\n if (!isIE11) {\n this.assert.equal(event.defaultPrevented, true, 'should preventDefault');\n }\n }\n\n ['@test it should target the proper component when `action` is in yielded block [GH #12409]']() {\n let outerActionCalled = false;\n let innerClickCalled = false;\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n hey() {\n outerActionCalled = true;\n }\n }\n });\n\n let MiddleComponent = _helpers.Component.extend({});\n\n let InnerComponent = _helpers.Component.extend({\n click() {\n innerClickCalled = true;\n expectDeprecation(() => {\n this.sendAction();\n }, /You called (.*).sendAction\\((.*)\\) but Component#sendAction is deprecated. Please use closure actions instead./);\n }\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: _abstractTestCase.strip`\n {{#middle-component}}\n {{inner-component action=\"hey\"}}\n {{/middle-component}}\n `\n });\n\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: '{{yield}}'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: _abstractTestCase.strip`\n \n {{yield}}\n `\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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 let component;\n\n let ExampleComponent = _helpers.Component.extend({\n label: undefined,\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assertText('Click me');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', 'Dun clicked');\n });\n\n this.assertText('Dun clicked');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', undefined);\n });\n\n this.assertText('Click me');\n }\n\n ['@test it supports non-registered actions [GH#14888]']() {\n this.render(`\n {{#if show}}\n \n {{/if}}\n `, { show: true });\n\n this.assert.equal(this.$('button').text().trim(), 'Show (true)');\n // We need to focus in to simulate an actual click.\n this.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 let actionCount = 0;\n let ExampleComponent = _helpers.Component.extend({\n selected: false,\n actions: {\n toggleSelected() {\n actionCount++;\n this.toggleProperty('selected');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\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\n this.runTask(() => {\n this.$('button').click();\n });\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});","enifed('@ember/-internals/glimmer/tests/integration/helpers/get-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{get}}', class extends _testCase.RenderingTest {\n ['@test should be able to get an object value with a static key']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors 'apple')}}]`, {\n colors: { apple: 'red' }\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple', 'green'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'red'\n }));\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 colors \"apple.gala\"}}] [{{if true (get colors \"apple.gala\")}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow'\n }\n }\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n\n this.assertText('[yellow and red striped] [yellow and red striped]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: { gala: 'red and yellow' } }));\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 items 1}}][{{get items 2}}][{{get items 3}}]`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n\n this.assertText('[Qux][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', { 1: 'First', 2: 'Second', 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 numbers 0}}][{{get numbers 1}}][{{get numbers 2}}]`, {\n numbers: [1, 2, 3]\n });\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n\n this.assertText('[3][2][1]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [1, 2, 3]));\n\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 indexes as |index|}}[{{get items index}}]{{/each}}`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n\n this.assertText('[Qux][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', { 1: 'First', 2: 'Second', 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 numbers as |num index|}}[{{get numbers index}}]{{/each}}`, {\n numbers: [1, 2, 3]\n });\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n\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 colors key}}] [{{if true (get colors key)}}]`, {\n colors: { apple: 'red', banana: 'yellow' },\n key: 'apple'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { 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 colors key}}] [{{if true (get colors key)}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n },\n banana: 'yellow'\n },\n key: 'apple.gala'\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.mcintosh'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n\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 colors (concat 'apple' '.' 'gala')}}] [{{if true (get colors (concat 'apple' '.' 'gala'))}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\n },\n key: 'apple.gala'\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n\n this.assertText('[yellow and red striped] [yellow and red striped]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow-redish'));\n\n this.assertText('[yellow-redish] [yellow-redish]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\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 colors (get possibleKeys key)}}] [{{if true (get colors (get possibleKeys key))}}]`, {\n colors: { apple: 'red', banana: 'yellow' },\n key: 'key1',\n possibleKeys: { key1: 'apple', key2: 'banana' }\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key2'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key1'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: 'red', 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 possibleValues objectKey) key}}] [{{if true (get (get possibleValues objectKey) key)}}]`, {\n possibleValues: {\n colors1: { apple: 'red', banana: 'yellow' },\n colors2: { apple: 'green', banana: 'purple' }\n },\n objectKey: 'colors1',\n key: 'apple'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[yellow] [yellow]');\n\n this.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 possibleValues objectKey) (get possibleKeys key)}}] [{{if true (get (get possibleValues objectKey) (get possibleKeys key))}}]`, {\n possibleValues: {\n colors1: { apple: 'red', banana: 'yellow' },\n colors2: { apple: 'green', banana: 'purple' }\n },\n objectKey: 'colors1',\n possibleKeys: {\n key1: 'apple',\n key2: 'banana'\n },\n key: 'key1'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key2'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'objectKey', 'colors1');\n (0, _metal.set)(this.context, 'key', 'key1');\n });\n\n this.assertText('[red] [red]');\n }\n\n ['@test the result of a get helper can be yielded']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.mcintosh = 'red';\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (get colors mcintosh)}}`\n });\n\n this.render(`{{#foo-bar colors=colors as |value|}}{{value}}{{/foo-bar}}`, {\n colors: {\n red: 'banana'\n }\n });\n\n this.assertText('banana');\n\n this.runTask(() => this.rerender());\n\n this.assertText('banana');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'yellow');\n (0, _metal.set)(this.context, 'colors', { yellow: 'bus' });\n });\n\n this.assertText('bus');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'red');\n (0, _metal.set)(this.context, 'colors', { red: 'banana' });\n });\n\n this.assertText('banana');\n }\n\n ['@test should handle object values as nulls']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors 'apple')}}]`, {\n colors: null\n });\n\n this.assertText('[] []');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[] []');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: 'green', banana: 'purple' }));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', null));\n\n this.assertText('[] []');\n }\n\n ['@test should handle object keys as nulls']() {\n this.render(`[{{get colors key}}] [{{if true (get colors key)}}]`, {\n colors: {\n apple: 'red',\n banana: 'yellow'\n },\n key: null\n });\n\n this.assertText('[] []');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[] []');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', null));\n\n this.assertText('[] []');\n }\n\n ['@test should handle object values and keys as nulls']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors key)}}]`, {\n colors: null,\n key: null\n });\n\n this.assertText('[] []');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - static key'](assert) {\n this.render(`{{input type='text' value=(mut (get source 'banana')) id='get-input'}}`, {\n source: {\n banana: 'banana'\n }\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source', { banana: 'banana' }));\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - dynamic key'](assert) {\n this.render(`{{input type='text' value=(mut (get source key)) id='get-input'}}`, {\n source: {\n apple: 'apple',\n banana: 'banana'\n },\n key: 'banana'\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple'));\n\n assert.strictEqual(this.$('#get-input').val(), 'apple');\n\n this.runTask(() => this.$('#get-input').val('some other value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some other value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple'), 'some other value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'key', 'banana');\n (0, _metal.set)(this.context, 'source', { banana: 'banana' });\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - dynamic nested key'](assert) {\n this.render(`{{input type='text' value=(mut (get source key)) id='get-input'}}`, {\n source: {\n apple: {\n gala: 'gala',\n mcintosh: 'mcintosh'\n },\n banana: 'banana'\n },\n key: 'apple.mcintosh'\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.apple.mcintosh', 'red'));\n\n assert.strictEqual(this.$('#get-input').val(), 'red');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple.mcintosh'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n\n assert.strictEqual(this.$('#get-input').val(), 'gala');\n\n this.runTask(() => this.$('#get-input').val('some other value').trigger('change'));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.$('#get-input').val('yet another value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yet another value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'yet another value');\n\n this.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\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/hash-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{hash}}', class extends _testCase.RenderingTest {\n ['@test returns a hash with the right key-value']() {\n this.render(`{{#with (hash name=\\\"Sergio\\\") as |person|}}{{person.name}}{{/with}}`);\n\n this.assertText('Sergio');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio');\n }\n\n ['@test can have more than one key-value']() {\n this.render(`{{#with (hash name=\"Sergio\" lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/with}}`);\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio Arbeo');\n }\n\n ['@test binds values when variables are used']() {\n this.render(`{{#with (hash name=model.firstName lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/with}}`, {\n model: {\n firstName: 'Marisa'\n }\n });\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Marisa' }));\n\n this.assertText('Marisa Arbeo');\n }\n\n ['@test binds multiple values when variables are used']() {\n this.render(`{{#with (hash name=model.firstName lastName=model.lastName) as |person|}}{{person.name}} {{person.lastName}}{{/with}}`, {\n model: {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }\n });\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.lastName', 'Smith'));\n\n this.assertText('Sergio Smith');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }));\n\n this.assertText('Marisa Arbeo');\n }\n\n ['@test hash helpers can be nested']() {\n this.render(`{{#with (hash person=(hash name=model.firstName)) as |ctx|}}{{ctx.person.name}}{{/with}}`, {\n model: { firstName: 'Balint' }\n });\n\n this.assertText('Balint');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Balint');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Chad'));\n\n this.assertText('Chad');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Balint' }));\n\n this.assertText('Balint');\n }\n\n ['@test should yield hash of internal properties']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.model = { firstName: 'Chad' };\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=model.firstName)}}`\n });\n\n this.render(`{{#foo-bar as |values|}}{{values.firstName}}{{/foo-bar}}`);\n\n this.assertText('Chad');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Chad');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey'));\n\n this.assertText('Godfrey');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { firstName: 'Chad' }));\n\n this.assertText('Chad');\n }\n\n ['@test should yield hash of internal and external properties']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.model = { firstName: 'Chad' };\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=model.firstName lastName=lastName)}}`\n });\n\n this.render(`{{#foo-bar lastName=model.lastName as |values|}}{{values.firstName}} {{values.lastName}}{{/foo-bar}}`, {\n model: { lastName: 'Hietala' }\n });\n\n this.assertText('Chad Hietala');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Chad Hietala');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey');\n (0, _metal.set)(this.context, 'model.lastName', 'Chan');\n });\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'model', { firstName: 'Chad' });\n (0, _metal.set)(this.context, 'model', { lastName: 'Hietala' });\n });\n\n this.assertText('Chad Hietala');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/if-unless-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_testCase, _sharedConditionalTests) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: inline {{if}}', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy} ${falsy}}}`;\n }\n\n ['@test it raises when there are more than three arguments']() {\n expectAssertion(() => {\n this.render(`{{if condition 'a' 'b' 'c'}}`, { condition: true });\n }, `The inline form of the 'if' helper expects two or three arguments. ('-top-level' @ L1:C0) `);\n }\n\n ['@test it raises when there are less than two arguments']() {\n expectAssertion(() => {\n this.render(`{{if condition}}`, { condition: true });\n }, `The inline form of the 'if' helper expects two or three arguments. ('-top-level' @ L1:C0) `);\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{if}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if (if ${cond} ${cond} false) ${truthy} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{if}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if (if ${cond} true ${cond}) ${truthy} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{if}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `(if ${cond} ${truthy} ${falsy})`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{if}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
    `;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy} ${falsy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: inline {{if}} and {{unless}} without the inverse argument', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy}}}{{unless ${cond} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: inline {{unless}}', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless ${cond} ${falsy} ${truthy}}}`;\n }\n\n ['@test it raises when there are more than three arguments']() {\n expectAssertion(() => {\n this.render(`{{unless condition 'a' 'b' 'c'}}`, { condition: true });\n }, /The inline form of the `unless` helper expects two or three arguments/);\n }\n\n ['@test it raises when there are less than two arguments']() {\n expectAssertion(() => {\n this.render(`{{unless condition}}`, { condition: true });\n }, /The inline form of the `unless` helper expects two or three arguments/);\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{unless}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless (unless ${cond} false ${cond}) ${falsy} ${truthy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{unless}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless (unless ${cond} ${cond} true) ${falsy} ${truthy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{unless}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `(unless ${cond} ${falsy} ${truthy})`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{unless}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
    `;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `{{unless ${cond} ${falsy} ${truthy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/input-test', ['@ember/polyfills', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/views'], function (_polyfills, _metal, _helpers, _testCase, _internalTestHelpers, _views) {\n 'use strict';\n\n class InputRenderingTest extends _testCase.RenderingTest {\n $input() {\n return this.$('input');\n }\n\n inputID() {\n return this.$input().prop('id');\n }\n\n assertDisabled() {\n this.assert.ok(this.$('input').prop('disabled'), 'The input is disabled');\n }\n\n assertNotDisabled() {\n this.assert.ok(this.$('input').is(':not(:disabled)'), 'The input is not disabled');\n }\n\n assertInputId(expectedId) {\n this.assert.equal(this.inputID(), expectedId, 'the input id should be `expectedId`');\n }\n\n assertSingleInput() {\n this.assert.equal(this.$('input').length, 1, 'A single text field was inserted');\n }\n\n assertSingleCheckbox() {\n this.assert.equal(this.$('input[type=checkbox]').length, 1, 'A single checkbox is added');\n }\n\n assertCheckboxIsChecked() {\n this.assert.equal(this.$input().prop('checked'), true, 'the checkbox is checked');\n }\n\n assertCheckboxIsNotChecked() {\n this.assert.equal(this.$input().prop('checked'), false, 'the checkbox is not checked');\n }\n\n assertValue(expected) {\n this.assert.equal(this.$input().val(), expected, `the input value should be ${expected}`);\n }\n\n assertAttr(name, expected) {\n this.assert.equal(this.$input().attr(name), expected, `the input ${name} attribute has the value '${expected}'`);\n }\n\n assertAllAttrs(names, expected) {\n names.forEach(name => this.assertAttr(name, expected));\n }\n\n assertSelectionRange(start, end) {\n let input = this.$input()[0];\n this.assert.equal(input.selectionStart, start, `the cursor start position should be ${start}`);\n this.assert.equal(input.selectionEnd, end, `the cursor end position should be ${end}`);\n }\n\n triggerEvent(type, options) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n\n let element = this.$input()[0];\n this.runTask(() => {\n element.dispatchEvent(event);\n });\n }\n }\n\n (0, _testCase.moduleFor)('Helpers test: {{input}}', class extends InputRenderingTest {\n ['@test a single text field is inserted into the DOM']() {\n this.render(`{{input type=\"text\" value=value}}`, { value: 'hello' });\n\n let id = this.inputID();\n\n this.assertValue('hello');\n this.assertSingleInput();\n\n this.runTask(() => this.rerender());\n\n this.assertValue('hello');\n this.assertSingleInput();\n this.assertInputId(id);\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'goodbye'));\n\n this.assertValue('goodbye');\n this.assertSingleInput();\n this.assertInputId(id);\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertValue('hello');\n this.assertSingleInput();\n this.assertInputId(id);\n }\n\n ['@test default type']() {\n this.render(`{{input}}`);\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'text');\n }\n\n ['@test dynamic attributes']() {\n this.render(`\n {{input type=\"text\"\n disabled=disabled\n value=value\n placeholder=placeholder\n name=name\n maxlength=maxlength\n minlength=minlength\n size=size\n tabindex=tabindex\n }}`, {\n disabled: false,\n value: 'Original value',\n placeholder: 'Original placeholder',\n name: 'original-name',\n maxlength: 10,\n minlength: 5,\n size: 20,\n tabindex: 30\n });\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'value', 'Updated value');\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'placeholder', 'Updated placeholder');\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'maxlength', 11);\n (0, _metal.set)(this.context, 'minlength', 6);\n // set(this.context, 'size', 21); //NOTE: failing in IE (TEST_SUITE=sauce)\n // set(this.context, 'tabindex', 31); //NOTE: failing in IE (TEST_SUITE=sauce)\n });\n\n this.assertDisabled();\n this.assertValue('Updated value');\n this.assertAttr('placeholder', 'Updated placeholder');\n this.assertAttr('name', 'updated-name');\n this.assertAttr('maxlength', '11');\n this.assertAttr('minlength', '6');\n // this.assertAttr('size', '21'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '31'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'value', 'Original value');\n (0, _metal.set)(this.context, 'disabled', false);\n (0, _metal.set)(this.context, 'placeholder', 'Original placeholder');\n (0, _metal.set)(this.context, 'name', 'original-name');\n (0, _metal.set)(this.context, 'maxlength', 10);\n (0, _metal.set)(this.context, 'minlength', 5);\n // set(this.context, 'size', 20); //NOTE: failing in IE (TEST_SUITE=sauce)\n // set(this.context, 'tabindex', 30); //NOTE: failing in IE (TEST_SUITE=sauce)\n });\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n }\n\n ['@test static attributes']() {\n this.render(`\n {{input type=\"text\"\n disabled=true\n value=\"Original value\"\n placeholder=\"Original placeholder\"\n name=\"original-name\"\n maxlength=10\n minlength=5\n size=20\n tabindex=30\n }}`);\n\n this.assertDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n this.assertDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n }\n\n ['@test cursor selection range']() {\n // Modifying input.selectionStart, which is utilized in the cursor tests,\n // causes an event in Safari.\n (0, _internalTestHelpers.runDestroy)(this.owner.lookup('event_dispatcher:main'));\n\n this.render(`{{input type=\"text\" value=value}}`, { value: 'original' });\n\n let input = this.$input()[0];\n\n // See https://ember-twiddle.com/33e506329f8176ae874422644d4cc08c?openFiles=components.input-component.js%2Ctemplates.components.input-component.hbs\n // this.assertSelectionRange(8, 8); //NOTE: this is (0, 0) on Firefox (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n // this.assertSelectionRange(8, 8); //NOTE: this is (0, 0) on Firefox (TEST_SUITE=sauce)\n\n this.runTask(() => {\n input.selectionStart = 2;\n input.selectionEnd = 4;\n });\n\n this.assertSelectionRange(2, 4);\n\n this.runTask(() => this.rerender());\n\n this.assertSelectionRange(2, 4);\n\n // this.runTask(() => set(this.context, 'value', 'updated'));\n //\n // this.assertSelectionRange(7, 7); //NOTE: this fails in IE, the range is 0 -> 0 (TEST_SUITE=sauce)\n //\n // this.runTask(() => set(this.context, 'value', 'original'));\n //\n // this.assertSelectionRange(8, 8); //NOTE: this fails in IE, the range is 0 -> 0 (TEST_SUITE=sauce)\n }\n\n ['@test [DEPRECATED] sends an action with `{{input enter=\"foo\"}}` when is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input enter='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed.');\n }\n }\n });\n }, 'Please refactor `{{input enter=\"foo\"}}` to `{{input enter=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 13 });\n }, 'Passing actions to components as strings (like {{input enter=\"foo\"}}) is deprecated. Please use closure actions instead ({{input enter=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input enter=(action \"foo\")}}` when is pressed'](assert) {\n assert.expect(2);\n this.render(`{{input enter=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', {\n keyCode: 13\n });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-press=\"foo\"}}` is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input value=value key-press='foo'}}`, {\n value: 'initial',\n\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-press=\"foo\"}}` to `{{input key-press=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keypress', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-press=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-press=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input key-press=(action \"foo\")}}` is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input value=value key-press=(action 'foo')}}`, {\n value: 'initial',\n\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keypress', { keyCode: 65 });\n }\n\n ['@test sends an action to the parent level when `bubbles=true` is provided'](assert) {\n assert.expect(1);\n\n let ParentComponent = _helpers.Component.extend({\n change() {\n assert.ok(true, 'bubbled upwards');\n }\n });\n\n this.registerComponent('x-parent', {\n ComponentClass: ParentComponent,\n template: `{{input bubbles=true}}`\n });\n this.render(`{{x-parent}}`);\n\n this.triggerEvent('change');\n }\n\n ['@test triggers `focus-in` when focused'](assert) {\n let wasFocused = false;\n\n this.render(`{{input focus-in=(action 'foo')}}`, {\n actions: {\n foo() {\n wasFocused = true;\n }\n }\n });\n\n this.runTask(() => {\n this.$input().focus();\n });\n\n assert.ok(wasFocused, 'action was triggered');\n }\n\n ['@test sends `insert-newline` when is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input insert-newline=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', {\n keyCode: 13\n });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input escape-press=\"foo\"}}` when is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input escape-press='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input escape-press=\"foo\"}}` to `{{input escape-press=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 27 });\n }, 'Passing actions to components as strings (like {{input escape-press=\"foo\"}}) is deprecated. Please use closure actions instead ({{input escape-press=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input escape-press=(action \"foo\")}}` when is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input escape-press=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', { keyCode: 27 });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-down=\"foo\"}}` when a key is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input key-down='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-down=\"foo\"}}` to `{{input key-down=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keydown', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-down=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-down=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input key-down=(action \"foo\")}}` when a key is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input key-down=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keydown', { keyCode: 65 });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-up=\"foo\"}}` when a key is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input key-up='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-up=\"foo\"}}` to `{{input key-up=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-up=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-up=(action \"foo\")}})');\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-up=(action \"foo\")}}` when a key is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input key-up=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n this.triggerEvent('keyup', { keyCode: 65 });\n }\n\n ['@test GH#14727 can render a file input after having had render an input of other type']() {\n this.render(`{{input type=\"text\"}}{{input type=\"file\"}}`);\n\n this.assert.equal(this.$input()[0].type, 'text');\n this.assert.equal(this.$input()[1].type, 'file');\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{input}} with dynamic type', class extends InputRenderingTest {\n ['@test a bound property can be used to determine type']() {\n this.render(`{{input type=type}}`, { type: 'password' });\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => (0, _metal.set)(this.context, 'type', 'text'));\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => (0, _metal.set)(this.context, 'type', 'password'));\n\n this.assertAttr('type', 'password');\n }\n\n ['@test a subexpression can be used to determine type']() {\n this.render(`{{input type=(if isTruthy trueType falseType)}}`, {\n isTruthy: true,\n trueType: 'text',\n falseType: 'password'\n });\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isTruthy', false));\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isTruthy', true));\n\n this.assertAttr('type', 'text');\n }\n\n ['@test GH16256 input macro does not modify params in place']() {\n this.registerComponent('my-input', {\n template: `{{input type=inputType}}`\n });\n\n this.render(`{{my-input inputType=firstType}}{{my-input inputType=secondType}}`, {\n firstType: 'password',\n secondType: 'email'\n });\n\n let inputs = this.element.querySelectorAll('input');\n this.assert.equal(inputs.length, 2, 'there are two inputs');\n this.assert.equal(inputs[0].getAttribute('type'), 'password');\n this.assert.equal(inputs[1].getAttribute('type'), 'email');\n }\n });\n\n (0, _testCase.moduleFor)(`Helpers test: {{input type='checkbox'}}`, class extends InputRenderingTest {\n ['@test dynamic attributes']() {\n this.render(`{{input\n type='checkbox'\n disabled=disabled\n name=name\n checked=checked\n tabindex=tabindex\n }}`, {\n disabled: false,\n name: 'original-name',\n checked: false,\n tabindex: 10\n });\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n\n this.runTask(() => this.rerender());\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'tabindex', 11);\n });\n\n this.assertSingleCheckbox();\n this.assertDisabled();\n this.assertAttr('name', 'updated-name');\n this.assertAttr('tabindex', '11');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', false);\n (0, _metal.set)(this.context, 'name', 'original-name');\n (0, _metal.set)(this.context, 'tabindex', 10);\n });\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n }\n\n ['@test `value` property assertion']() {\n expectAssertion(() => {\n this.render(`{{input type=\"checkbox\" value=value}}`, {\n value: 'value'\n });\n }, /you must use `checked=/);\n }\n\n ['@test with a bound type']() {\n this.render(`{{input type=inputType checked=isChecked}}`, {\n inputType: 'checkbox',\n isChecked: true\n });\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsChecked();\n\n this.runTask(() => this.rerender());\n\n this.assertCheckboxIsChecked();\n\n this.runTask(() => (0, _metal.set)(this.context, 'isChecked', false));\n\n this.assertCheckboxIsNotChecked();\n\n this.runTask(() => (0, _metal.set)(this.context, 'isChecked', true));\n\n this.assertCheckboxIsChecked();\n }\n\n ['@test native click changes check property']() {\n this.render(`{{input type=\"checkbox\"}}`);\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.$input()[0].click();\n this.assertCheckboxIsChecked();\n this.$input()[0].click();\n this.assertCheckboxIsNotChecked();\n }\n\n ['@test with static values']() {\n this.render(`{{input type=\"checkbox\" disabled=false tabindex=10 name=\"original-name\" checked=false}}`);\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.assertNotDisabled();\n this.assertAttr('tabindex', '10');\n this.assertAttr('name', 'original-name');\n\n this.runTask(() => this.rerender());\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.assertNotDisabled();\n this.assertAttr('tabindex', '10');\n this.assertAttr('name', 'original-name');\n }\n });\n\n (0, _testCase.moduleFor)(`Helpers test: {{input type='text'}}`, class extends InputRenderingTest {\n ['@test null values']() {\n let attributes = ['disabled', 'placeholder', 'name', 'maxlength', 'size', 'tabindex'];\n\n this.render(`\n {{input type=\"text\"\n disabled=disabled\n value=value\n placeholder=placeholder\n name=name\n maxlength=maxlength\n size=size\n tabindex=tabindex\n }}`, {\n disabled: null,\n value: null,\n placeholder: null,\n name: null,\n maxlength: null,\n size: null,\n tabindex: null\n });\n\n this.assertValue('');\n this.assertAllAttrs(attributes, undefined);\n\n this.runTask(() => this.rerender());\n\n this.assertValue('');\n this.assertAllAttrs(attributes, undefined);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'value', 'Updated value');\n (0, _metal.set)(this.context, 'placeholder', 'Updated placeholder');\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'maxlength', 11);\n (0, _metal.set)(this.context, 'size', 21);\n (0, _metal.set)(this.context, 'tabindex', 31);\n });\n\n this.assertDisabled();\n this.assertValue('Updated value');\n this.assertAttr('placeholder', 'Updated placeholder');\n this.assertAttr('name', 'updated-name');\n this.assertAttr('maxlength', '11');\n this.assertAttr('size', '21');\n this.assertAttr('tabindex', '31');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', null);\n (0, _metal.set)(this.context, 'value', null);\n (0, _metal.set)(this.context, 'placeholder', null);\n (0, _metal.set)(this.context, 'name', null);\n (0, _metal.set)(this.context, 'maxlength', null);\n // set(this.context, 'size', null); //NOTE: this fails with `Error: Failed to set the 'size' property on 'HTMLInputElement': The value provided is 0, which is an invalid size.` (TEST_SUITE=sauce)\n (0, _metal.set)(this.context, 'tabindex', null);\n });\n\n this.assertAttr('disabled', undefined);\n this.assertValue('');\n // this.assertAttr('placeholder', undefined); //NOTE: this fails with a value of \"null\" (TEST_SUITE=sauce)\n // this.assertAttr('name', undefined); //NOTE: this fails with a value of \"null\" (TEST_SUITE=sauce)\n this.assertAttr('maxlength', undefined);\n // this.assertAttr('size', undefined); //NOTE: re-enable once `size` bug above has been addressed\n this.assertAttr('tabindex', undefined);\n }\n });\n\n // These are the permutations of the set:\n // ['type=\"range\"', 'min=\"-5\" max=\"50\"', 'value=\"%x\"']\n ['type=\"range\" min=\"-5\" max=\"50\" value=\"%x\"', 'type=\"range\" value=\"%x\" min=\"-5\" max=\"50\"', 'min=\"-5\" max=\"50\" type=\"range\" value=\"%x\"', 'min=\"-5\" max=\"50\" value=\"%x\" type=\"range\"', 'value=\"%x\" min=\"-5\" max=\"50\" type=\"range\"', 'value=\"%x\" type=\"range\" min=\"-5\" max=\"50\"'].forEach(attrs => {\n (0, _testCase.moduleFor)(`[GH#15675] Helpers test: {{input ${attrs}}}`, class extends InputRenderingTest {\n renderInput(value = 25) {\n this.render(`{{input ${attrs.replace('%x', value)}}}`);\n }\n\n ['@test value over default max but below set max is kept']() {\n this.renderInput('25');\n this.assertValue('25');\n }\n\n ['@test value below default min but above set min is kept']() {\n this.renderInput('-2');\n this.assertValue('-2');\n }\n\n ['@test in the valid default range is kept']() {\n this.renderInput('5');\n this.assertValue('5');\n }\n\n ['@test value above max is reset to max']() {\n this.renderInput('55');\n this.assertValue('50');\n }\n\n ['@test value below min is reset to min']() {\n this.renderInput('-10');\n this.assertValue('-5');\n }\n });\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/loc-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/string'], function (_testCase, _metal, _string) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{loc}}', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n (0, _string._setStrings)({\n 'Hello Friend': 'Hallo Freund',\n Hello: 'Hallo, %@'\n });\n }\n\n teardown() {\n super.teardown();\n (0, _string._setStrings)({});\n }\n\n ['@test it lets the original value through by default']() {\n this.render(`{{loc \"Hiya buddy!\"}}`);\n this.assertText('Hiya buddy!', 'the unlocalized string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hiya buddy!', 'the unlocalized string is correct after rerender');\n }\n\n ['@test it localizes a simple string']() {\n this.render(`{{loc \"Hello Friend\"}}`);\n this.assertText('Hallo Freund', 'the localized string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund', 'the localized string is correct after rerender');\n }\n\n ['@test it takes passed formats into an account']() {\n this.render(`{{loc \"%@, %@\" \"Hello\" \"Mr. Pitkin\"}}`);\n this.assertText('Hello, Mr. Pitkin', 'the formatted string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hello, Mr. Pitkin', 'the formatted string is correct after rerender');\n }\n\n ['@test it updates when bound params change']() {\n this.render(`{{loc simple}} - {{loc personal 'Mr. Pitkin'}}`, {\n simple: 'Hello Friend',\n personal: 'Hello'\n });\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct');\n\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'simple', \"G'day mate\"));\n this.assertText(\"G'day mate - Hallo, Mr. Pitkin\", 'the bound value is correct after update');\n\n this.runTask(() => (0, _metal.set)(this.context, 'simple', 'Hello Friend'));\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after reset');\n }\n\n ['@test it updates when nested bound params change']() {\n this.render(`{{loc greetings.simple}} - {{loc greetings.personal 'Mr. Pitkin'}}`, {\n greetings: {\n simple: 'Hello Friend',\n personal: 'Hello'\n }\n });\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct');\n\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'greetings.simple', \"G'day mate\"));\n this.assertText(\"G'day mate - Hallo, Mr. Pitkin\", 'the bound value is correct after interior mutation');\n\n this.runTask(() => (0, _metal.set)(this.context, 'greetings', {\n simple: 'Hello Friend',\n personal: 'Hello'\n }));\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after replacement');\n }\n\n ['@test it can be overriden']() {\n this.registerHelper('loc', () => 'Yup');\n this.render(`{{loc greeting}}`, {\n greeting: 'Hello Friend'\n });\n this.assertText('Yup', 'the localized string is correct');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/log-test', ['@ember/-internals/glimmer/tests/utils/test-case'], function (_testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{log}}', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n /* eslint-disable no-console */\n this.originalLog = console.log;\n this.logCalls = [];\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 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 (let 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\n this.assertLog(['one', 1, true]);\n }\n\n ['@test correctly logs a property']() {\n this.render(`{{log value}}`, {\n value: 'one'\n });\n\n this.assertLog(['one']);\n }\n\n ['@test correctly logs multiple arguments']() {\n this.render(`{{log \"my variable:\" value}}`, {\n value: 'one'\n });\n\n this.assertLog(['my variable:', 'one']);\n }\n\n ['@test correctly logs `this`']() {\n this.render(`{{log this}}`);\n\n this.assertLog([this.context]);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/mut-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _helpers, _metal, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{mut}}', class extends _testCase.RenderingTest {\n ['@test a simple mutable binding using `mut` propagates properly']() {\n let bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=value}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12', 'the data propagated downwards');\n\n this.assertStableRerender();\n\n this.runTask(() => bottom.attrs.setMe.update(13));\n\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\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test a simple mutable binding using `mut` inserts into the DOM']() {\n let bottom, middle;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut setMe=(mut value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12', 'the data propagated downwards');\n\n this.assertStableRerender();\n\n this.runTask(() => bottom.attrs.setMe.update(13));\n\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\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test passing a literal results in a assertion']() {\n this.registerComponent('bottom-mut', { template: '{{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', { template: '{{setMe}}' });\n\n expectAssertion(() => {\n this.render('{{bottom-mut setMe=(mut (concat \"foo\" \" \" \"bar\"))}}');\n }, 'You can only pass a path to mut');\n }\n\n // See https://github.com/emberjs/ember.js/commit/807a0cd for an explanation of this test\n ['@test using a string value through middle tier does not trigger assertion (due to the auto-mut transform)']() {\n let bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{stuff}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut stuff=value}}'\n });\n\n this.render('{{middle-mut value=\"foo\"}}');\n\n this.assert.equal((0, _metal.get)(bottom, 'stuff'), 'foo', 'the data propagated');\n this.assertText('foo');\n\n this.assertStableRerender();\n\n // No U-R for this test\n }\n\n ['@test {{readonly}} of a {{mut}} is converted into an immutable binding']() {\n let middle, bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut setMe=(readonly value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => middle.attrs.value.update(13));\n\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\n this.runTask(() => (0, _metal.set)(middle, 'value', 14));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\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\n this.registerComponent('middle-mut', {\n template: '{{#bottom-mut}}{{model.name}}{{/bottom-mut}}'\n });\n\n this.render('{{middle-mut model=(mut model)}}', {\n model: { name: 'Matthew Beale' }\n });\n\n this.assertText('Matthew Beale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'Joel Kang'));\n\n this.assertText('Joel Kang');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'Matthew Beale' }));\n\n this.assertText('Matthew Beale');\n }\n\n ['@test a simple mutable binding using {{mut}} is available in hooks']() {\n let bottom;\n let willRender = [];\n let didInsert = [];\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n willRender() {\n willRender.push((0, _metal.get)(this, 'setMe'));\n },\n didInsertElement() {\n didInsert.push((0, _metal.get)(this, 'setMe'));\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=(mut value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assert.deepEqual(willRender, [12], 'willReceive is [12]');\n this.assert.deepEqual(didInsert, [12], 'didInsert is [12]');\n this.assertText('12');\n\n this.assertStableRerender();\n\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\n this.runTask(() => bottom.attrs.setMe.update(13));\n\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\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\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 let bottom, middle;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n thingy: null,\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{thingy}}'\n });\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 didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut thingy=(mut val)}}'\n });\n\n this.render('{{middle-mut}}');\n\n this.assert.strictEqual((0, _metal.get)(bottom, 'thingy'), 12, 'data propagated');\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(middle, 'baseValue', 13));\n\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\n this.runTask(() => (0, _metal.set)(middle, 'baseValue', 12));\n\n this.assertText('12');\n }\n\n ['@test automatic mutable bindings exposes a mut cell in attrs']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: '{{foo}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner foo=bar}}'\n });\n\n this.render('{{x-outer bar=baz}}', { baz: 'foo' });\n\n this.assertText('foo');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.foo.update('bar'));\n\n this.assert.equal(inner.attrs.foo.value, 'bar');\n this.assert.equal((0, _metal.get)(inner, 'foo'), 'bar');\n this.assertText('bar');\n\n this.runTask(() => inner.attrs.foo.update('foo'));\n\n this.assertText('foo');\n }\n\n ['@test automatic mutable bindings tolerate undefined non-stream inputs and attempts to set them']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: '{{model}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner model=nonexistent}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.model.update(42));\n\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('42');\n\n this.runTask(() => inner.attrs.model.update(undefined));\n\n this.assertText('');\n }\n\n ['@test automatic mutable bindings tolerate constant non-stream inputs and attempts to set them']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: 'hello{{model}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner model=x}}'\n });\n\n this.render('{{x-outer x=\"foo\"}}');\n\n this.assertText('hellofoo');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.model.update(42));\n\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('hello42');\n\n this.runTask(() => inner.attrs.model.update('foo'));\n\n this.assertText('hellofoo');\n }\n });\n\n (0, _testCase.moduleFor)('Mutable Bindings used in Computed Properties that are bound as attributeBindings', class extends _testCase.RenderingTest {\n ['@test an attribute binding of a computed property of a 2-way bound attr recomputes when the attr changes']() {\n let input, output;\n\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 didInsertElement() {\n output = this;\n },\n style: (0, _metal.computed)('height', function () {\n let height = this.get('height');\n return (0, _helpers.htmlSafe)(`height: ${height}px;`);\n }),\n height: 20\n }),\n template: '{{height}}'\n });\n\n this.render('{{x-output height=height}}{{x-input height=(mut height)}}', {\n height: 60\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 60px;') },\n content: '60'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => input.attrs.height.update(35));\n\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: { style: (0, _testHelpers.styles)('height: 35px;') },\n content: '35'\n });\n\n this.runTask(() => (0, _metal.set)(input, 'height', 36));\n\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: { style: (0, _testHelpers.styles)('height: 36px;') },\n content: '36'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'height', 60));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 60px;') },\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 let input, output;\n\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 didInsertElement() {\n output = this;\n },\n style: (0, _metal.computed)('height', 'width', function () {\n let height = this.get('height');\n let 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 set(keyName, width) {\n this.set('height', width / 2);\n return width;\n }\n })\n }),\n template: '{{width}}x{{height}}'\n });\n\n this.render('{{x-output width=width}}{{x-input width=(mut width)}}', {\n width: 70\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 35px; width: 70px;') },\n content: '70x35'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(input, 'width', 80));\n\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: { style: (0, _testHelpers.styles)('height: 40px; width: 80px;') },\n content: '80x40'\n });\n\n this.runTask(() => input.attrs.width.update(90));\n\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: { style: (0, _testHelpers.styles)('height: 45px; width: 90px;') },\n content: '90x45'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'width', 70));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 35px; width: 70px;') },\n content: '70x35'\n });\n this.assert.strictEqual((0, _metal.get)(input, 'width'), 70);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/partial-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _metal, _runtime, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{partial}}', class extends _testCase.RenderingTest {\n ['@test should render other templates registered with the container']() {\n this.registerPartial('_subTemplateFromContainer', 'sub-template');\n\n this.render(`This {{partial \"subTemplateFromContainer\"}} is pretty great.`);\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test should render other slash-separated templates registered with the container']() {\n this.registerPartial('child/_subTemplateFromContainer', 'sub-template');\n\n this.render(`This {{partial \"child/subTemplateFromContainer\"}} is pretty great.`);\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test should use the current context']() {\n this.registerPartial('_person_name', '{{model.firstName}} {{model.lastName}}');\n\n this.render('Who is {{partial \"person_name\"}}?', {\n model: {\n firstName: 'Kris',\n lastName: 'Selden'\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('Who is Kris Selden?');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Kelly'));\n\n this.assertText('Who is Kelly Selden?');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Kris', lastName: 'Selden' }));\n\n this.assertText('Who is Kris Selden?');\n }\n\n ['@test Quoteless parameters passed to {{partial}} perform a bound property lookup of the partial name']() {\n this.registerPartial('_subTemplate', 'sub-template');\n this.registerPartial('_otherTemplate', 'other-template');\n\n this.render('This {{partial templates.partialName}} is pretty {{partial nonexistent}}great.', {\n templates: { partialName: 'subTemplate' }\n });\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates.partialName', 'otherTemplate'));\n\n this.assertText('This other-template is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates.partialName', null));\n\n this.assertText('This is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates', { partialName: 'subTemplate' }));\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test partial using data from {{#each}}']() {\n this.registerPartial('show-item', '{{item}}');\n\n this.render(_abstractTestCase.strip`\n {{#each model.items as |item|}}\n {{item}}: {{partial 'show-item'}} |\n {{/each}}`, {\n model: {\n items: (0, _runtime.A)(['apple', 'orange', 'banana'])\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('apple: apple |orange: orange |banana: banana |');\n\n this.runTask(() => this.context.model.items.pushObject('strawberry'));\n\n this.assertText('apple: apple |orange: orange |banana: banana |strawberry: strawberry |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n items: (0, _runtime.A)(['apple', 'orange', 'banana'])\n }));\n\n this.assertText('apple: apple |orange: orange |banana: banana |');\n }\n\n ['@test partial using `{{get` on data from {{#with}}']() {\n this.registerPartial('show-id', '{{get item \"id\"}}');\n\n this.render(_abstractTestCase.strip`\n {{#with model as |item|}}\n {{item.name}}: {{partial 'show-id'}}\n {{/with}}`, {\n model: { id: 1, name: 'foo' }\n });\n\n this.assertStableRerender();\n\n this.assertText('foo: 1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.id', 2));\n\n this.assertText('foo: 2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'bar'));\n\n this.assertText('bar: 2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { id: 1, name: 'foo' }));\n\n this.assertText('foo: 1');\n }\n\n ['@test partial using `{{get` on data from {{#each}}']() {\n this.registerPartial('show-item', '{{get item \"id\"}}');\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{item.id}}: {{partial 'show-item'}} |\n {{/each}}`, {\n items: (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }])\n });\n\n this.assertStableRerender();\n\n this.assertText('1: 1 |2: 2 |3: 3 |');\n\n this.runTask(() => this.context.items.pushObject({ id: 4 }));\n\n this.assertText('1: 1 |2: 2 |3: 3 |4: 4 |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }])));\n\n this.assertText('1: 1 |2: 2 |3: 3 |');\n }\n\n ['@test partial using conditional on data from {{#each}}']() {\n this.registerPartial('show-item', '{{#if item}}{{item}}{{/if}}');\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{item}}: {{partial 'show-item'}} |\n {{/each}}`, {\n items: (0, _runtime.A)(['apple', null, 'orange', 'banana'])\n });\n\n this.assertStableRerender();\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |');\n\n this.runTask(() => this.context.items.pushObject('strawberry'));\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |strawberry: strawberry |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)(['apple', null, 'orange', 'banana'])));\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |');\n }\n\n ['@test nested partials using data from {{#each}}']() {\n this.registerPartial('_outer-partial', _abstractTestCase.strip`\n [outer: {{name}}] {{partial 'inner-partial'}}\n `);\n\n this.registerPartial('inner-partial', '[inner: {{name}}]');\n\n this.render(_abstractTestCase.strip`\n {{#each names as |name i|}}\n {{i}}: {{partial 'outer-partial'}}\n {{/each}}`, {\n names: (0, _runtime.A)(['Alex', 'Ben'])\n });\n\n this.assertStableRerender();\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]');\n\n this.runTask(() => this.context.names.pushObject('Sophie'));\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]2: [outer: Sophie] [inner: Sophie]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'names', (0, _runtime.A)(['Alex', 'Ben'])));\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]');\n }\n\n ['@test nested partials within nested `{{#with}}` blocks']() {\n this.registerPartial('_person2-partial', _abstractTestCase.strip`\n {{#with 'Ben' as |person2|}}\n Hi {{person1}} (aged {{age}}) and {{person2}}. {{partial 'person3-partial'}}\n {{/with}}\n `);\n\n this.registerPartial('_person3-partial', _abstractTestCase.strip`\n {{#with 'Alex' as |person3|}}\n Hi {{person1}} (aged {{age}}), {{person2}} and {{person3}}. {{partial 'person4-partial'}}\n {{/with}}\n `);\n\n this.registerPartial('_person4-partial', _abstractTestCase.strip`\n {{#with 'Sarah' as |person4|}}\n Hi {{person1}} (aged {{age}}), {{person2}}, {{person3}} and {{person4}}.\n {{/with}}\n `);\n\n this.render(_abstractTestCase.strip`\n {{#with 'Sophie' as |person1|}}\n Hi {{person1}} (aged {{age}}). {{partial 'person2-partial'}}\n {{/with}}`, { age: 0 });\n\n this.assertStableRerender();\n\n this.assertText('Hi Sophie (aged 0). Hi Sophie (aged 0) and Ben. Hi Sophie (aged 0), Ben and Alex. Hi Sophie (aged 0), Ben, Alex and Sarah.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 1));\n\n this.assertText('Hi Sophie (aged 1). Hi Sophie (aged 1) and Ben. Hi Sophie (aged 1), Ben and Alex. Hi Sophie (aged 1), Ben, Alex and Sarah.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 0));\n\n this.assertText('Hi Sophie (aged 0). Hi Sophie (aged 0) and Ben. Hi Sophie (aged 0), Ben and Alex. Hi Sophie (aged 0), Ben, Alex and Sarah.');\n }\n\n ['@test dynamic partials in {{#each}}']() {\n this.registerPartial('_odd', 'ODD{{i}}');\n this.registerPartial('_even', 'EVEN{{i}}');\n\n this.render(_abstractTestCase.strip`\n {{#each model.items as |template i|}}\n {{model.type}}: {{partial template}}\n {{/each}}`, {\n model: {\n items: ['even', 'odd', 'even', 'odd'],\n type: 'number'\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('number: EVEN0number: ODD1number: EVEN2number: ODD3');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.type', 'integer'));\n\n this.assertText('integer: EVEN0integer: ODD1integer: EVEN2integer: ODD3');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n items: ['even', 'odd', 'even', 'odd'],\n type: 'number'\n }));\n\n this.assertText('number: EVEN0number: ODD1number: EVEN2number: ODD3');\n }\n\n ['@test dynamic partials in {{#with}}']() {\n this.registerPartial('_thing', '{{t}}');\n\n this.render(_abstractTestCase.strip`\n {{#with item.thing as |t|}}\n {{partial t}}\n {{else}}\n Nothing!\n {{/with}}`, {\n item: { thing: false }\n });\n\n this.assertStableRerender();\n\n this.assertText('Nothing!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'item.thing', 'thing'));\n\n this.assertText('thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'item', { thing: false }));\n\n this.assertText('Nothing!');\n }\n\n ['@test partials which contain contextual components']() {\n this.registerComponent('outer-component', {\n template: '{{yield (hash inner=(component \"inner-component\" name=name))}}'\n });\n\n this.registerComponent('inner-component', {\n template: '{{yield (hash name=name)}}'\n });\n\n this.registerPartial('_some-partial', _abstractTestCase.strip`\n {{#outer.inner as |inner|}}\n inner.name: {{inner.name}}\n {{/outer.inner}}\n `);\n\n this.render(_abstractTestCase.strip`\n {{#outer-component name=name as |outer|}}\n {{partial 'some-partial'}}\n {{/outer-component}}`, { name: 'Sophie' });\n\n this.assertStableRerender();\n\n this.assertText('inner.name: Sophie');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertText('inner.name: Ben');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Sophie'));\n\n this.assertText('inner.name: Sophie');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/readonly-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{readonly}}', class extends _testCase.RenderingTest {\n ['@test {{readonly}} of a path should work']() {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly val)}}', {\n val: 12\n });\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(component, 'value', 13));\n this.assert.notOk(component.attrs.value.update);\n\n this.assertText('13', 'local property is updated');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'upstream attribute is not updated');\n\n // No U-R\n }\n\n '@test passing an action to {{readonly}} avoids mutable cell wrapping'(assert) {\n assert.expect(4);\n let outer, inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n inner = this;\n }\n })\n });\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n }),\n template: '{{x-inner onClick=(readonly onClick)}}'\n });\n\n this.render('{{x-outer onClick=(action 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\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 let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly thing)}}', {\n thing: 'initial'\n });\n\n this.assertText('initial');\n\n this.assertStableRerender();\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'thing', 'updated!'));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'thing', 'initial'));\n\n this.assertText('initial');\n }\n\n '@test updating a nested path of a {{readonly}}'(assert) {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value.prop}}'\n });\n\n this.render('{{foo-bar value=(readonly thing)}}', {\n thing: {\n prop: 'initial'\n }\n });\n\n this.assertText('initial');\n\n this.assertStableRerender();\n\n assert.notOk(component.attrs.value.update, 'no update available');\n assert.deepEqual((0, _metal.get)(component, 'value'), { prop: 'initial' });\n assert.deepEqual(this.context.thing, { prop: 'initial' });\n\n this.runTask(() => (0, _metal.set)(component, 'value.prop', 'updated!'));\n\n this.assertText('updated!', 'nested path is updated');\n assert.deepEqual((0, _metal.get)(component, 'value'), { prop: 'updated!' });\n assert.deepEqual(this.context.thing, { prop: 'updated!' });\n\n this.runTask(() => (0, _metal.set)(component, 'value.prop', 'initial'));\n\n this.assertText('initial');\n }\n\n ['@test {{readonly}} of a string renders correctly']() {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly \"12\")}}');\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.assert.notOk(component.attrs.value.update);\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '12');\n\n this.runTask(() => (0, _metal.set)(component, 'value', '13'));\n\n this.assertText('13', 'local property is updated');\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '13');\n\n this.runTask(() => (0, _metal.set)(component, 'value', '12'));\n\n this.assertText('12');\n }\n\n ['@test {{mut}} of a {{readonly}} mutates only the middle and bottom tiers']() {\n let middle, bottom;\n\n this.registerComponent('x-bottom', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{bar}}'\n });\n\n this.registerComponent('x-middle', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{foo}} {{x-bottom bar=(mut foo)}}'\n });\n\n this.render('{{x-middle foo=(readonly val)}}', {\n val: 12\n });\n\n this.assertText('12 12');\n\n this.assertStableRerender();\n\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\");\n\n // updating the mut-cell directly\n this.runTask(() => bottom.attrs.bar.update(13));\n\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\n this.runTask(() => (0, _metal.set)(bottom, 'bar', 14));\n\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\n this.assert.notOk(middle.attrs.foo.update, \"middle's foo attr is not a mutable cell\");\n this.runTask(() => (0, _metal.set)(middle, 'foo', 15));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 10));\n\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\");\n\n // setting as a normal property\n this.runTask(() => (0, _metal.set)(bottom, 'bar', undefined));\n\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\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12 12', 'bottom and middle were both reset');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/text-area-test', ['@ember/polyfills', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_polyfills, _metal, _testCase, _testHelpers, _abstractTestCase) {\n 'use strict';\n\n class TextAreaRenderingTest extends _testCase.RenderingTest {\n assertTextArea({ attrs, value } = {}) {\n let mergedAttrs = (0, _polyfills.assign)({ class: (0, _testHelpers.classes)('ember-view ember-text-area') }, attrs);\n this.assertComponentElement(this.firstChild, {\n tagName: 'textarea',\n attrs: mergedAttrs\n });\n\n if (value) {\n this.assert.strictEqual(value, this.firstChild.value);\n }\n }\n\n triggerEvent(type, options = {}) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n\n this.firstChild.dispatchEvent(event);\n }\n }\n\n class BoundTextAreaAttributes {\n constructor(cases) {\n this.cases = cases;\n }\n\n generate({ attribute, first, second }) {\n return {\n [`@test ${attribute}`]() {\n this.render(`{{textarea ${attribute}=value}}`, {\n value: first\n });\n this.assertTextArea({ attrs: { [attribute]: first } });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', second));\n this.assertTextArea({ attrs: { [attribute]: second } });\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', first));\n this.assertTextArea({ attrs: { [attribute]: first } });\n }\n };\n }\n }\n\n (0, _abstractTestCase.applyMixins)(TextAreaRenderingTest, new BoundTextAreaAttributes([{ attribute: 'placeholder', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'name', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'title', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'maxlength', first: '1', second: '2' }, { attribute: 'rows', first: '1', second: '2' }, { attribute: 'cols', first: '1', second: '2' }, { attribute: 'tabindex', first: '1', second: '2' }]));\n\n (0, _testCase.moduleFor)('Helpers test: {{textarea}}', class extends TextAreaRenderingTest {\n ['@test Should insert a textarea'](assert) {\n this.render('{{textarea}}');\n\n assert.equal(this.$('textarea').length, 1);\n\n this.assertStableRerender();\n }\n\n ['@test Should respect disabled'](assert) {\n this.render('{{textarea disabled=disabled}}', {\n disabled: true\n });\n assert.ok(this.$('textarea').is(':disabled'));\n }\n\n ['@test Should respect disabled when false'](assert) {\n this.render('{{textarea disabled=disabled}}', {\n disabled: false\n });\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n }\n\n ['@test Should become disabled when the context changes'](assert) {\n this.render('{{textarea disabled=disabled}}');\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'disabled', true));\n assert.ok(this.$('textarea').is(':disabled'));\n\n this.runTask(() => (0, _metal.set)(this.context, 'disabled', false));\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n }\n\n ['@test Should bind its contents to the specified value']() {\n this.render('{{textarea value=model.val}}', {\n model: { val: 'A beautiful day in Seattle' }\n });\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.val', 'Auckland'));\n this.assertTextArea({ value: 'Auckland' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { val: 'A beautiful day in Seattle' }));\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n }\n\n ['@test GH#14001 Should correctly handle an empty string bound value']() {\n this.render('{{textarea value=message}}', { message: '' });\n\n this.assert.strictEqual(this.firstChild.value, '');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assert.strictEqual(this.firstChild.value, 'hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', ''));\n\n this.assert.strictEqual(this.firstChild.value, '');\n }\n\n ['@test should update the value for `cut` / `input` / `change` events']() {\n this.render('{{textarea value=model.val}}', {\n model: { val: 'A beautiful day in Seattle' }\n });\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.firstChild.value = 'Auckland';\n this.triggerEvent('cut');\n });\n this.assertTextArea({ value: 'Auckland' });\n\n this.runTask(() => {\n this.firstChild.value = 'Hope';\n this.triggerEvent('paste');\n });\n this.assertTextArea({ value: 'Hope' });\n\n this.runTask(() => {\n this.firstChild.value = 'Boston';\n this.triggerEvent('input');\n });\n this.assertTextArea({ value: 'Boston' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { val: 'A beautiful day in Seattle' }));\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/unbound-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/runtime'], function (_testCase, _abstractTestCase, _metal, _helpers, _runtime) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{unbound}}', class extends _testCase.RenderingTest {\n ['@test should be able to output a property without binding']() {\n this.render(`
    {{unbound content.anUnboundString}}
    `, {\n content: {\n anUnboundString: 'No spans here, son.'\n }\n });\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'content.anUnboundString', 'HEY'));\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'content', {\n anUnboundString: 'No spans here, son.'\n }));\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 items as |item|}}
    • {{unbound item}}
    • {{/each}}
    `, {\n items: (0, _runtime.A)(['a', 'b', 'c', 1, 2, 3])\n });\n\n this.assertText('abc123');\n\n this.runTask(() => this.rerender());\n\n this.assertText('abc123');\n }\n\n ['@test should be able to use unbound helper in #each helper (with objects)']() {\n this.render(`
      {{#each items as |item|}}
    • {{unbound item.wham}}
    • {{/each}}
    `, {\n items: (0, _runtime.A)([{ wham: 'bam' }, { wham: 1 }])\n });\n\n this.assertText('bam1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bam1');\n\n this.runTask(() => this.context.items.setEach('wham', 'HEY'));\n\n this.assertText('bam1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)([{ wham: 'bam' }, { wham: 1 }])));\n\n this.assertText('bam1');\n }\n\n ['@test it should assert unbound cannot be called with multiple arguments']() {\n let willThrow = () => {\n this.render(`{{unbound foo 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: { foo: 'BORK' }\n });\n\n this.assertHTML('');\n\n this.runTask(() => this.rerender());\n\n this.assertHTML('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'OOF'));\n\n this.assertHTML('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'BORK' }));\n\n this.assertHTML('');\n }\n\n ['@test should property escape unsafe hrefs']() {\n let unsafeUrls = (0, _runtime.A)([{\n name: 'Bob',\n url: 'javascript:bob-is-cool' // jshint ignore:line\n }, {\n name: 'James',\n url: 'vbscript:james-is-cool' // jshint ignore:line\n }, {\n name: 'Richard',\n url: 'javascript:richard-is-cool' // jshint ignore:line\n }]);\n\n this.render(``, {\n people: unsafeUrls\n });\n\n let escapedHtml = _abstractTestCase.strip`\n \n `;\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => this.context.people.setEach('url', 'http://google.com'));\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => (0, _metal.set)(this.context, 'people', unsafeUrls));\n\n this.assertHTML(escapedHtml);\n }\n\n ['@skip helper form updates on parent re-render']() {\n this.render(`{{unbound foo}}`, {\n foo: 'BORK'\n });\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'OOF'));\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('OOF');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', ''));\n\n this.assertText('OOF');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'BORK'));\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n }\n\n // semantics here is not guaranteed\n ['@test sexpr form does not update no matter what']() {\n this.registerHelper('capitalize', args => args[0].toUpperCase());\n\n this.render(`{{capitalize (unbound foo)}}`, {\n foo: 'bork'\n });\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n\n this.assertText('BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n\n this.assertText('BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\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\n this.registerHelper('doublize', params => `${params[0]} ${params[0]}`);\n\n this.render(`{{capitalize (unbound (doublize foo))}}`, {\n foo: 'bork'\n });\n\n this.assertText('BORK BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n\n this.assertText('BORK BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n\n this.assertText('BORK BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\n\n this.assertText('BORK BORK');\n }\n\n ['@test should be able to render an unbound helper invocation']() {\n this.registerHelper('repeat', ([value], { count }) => {\n let a = [];\n while (a.length < count) {\n a.push(value);\n }\n return a.join('');\n });\n\n this.render(`{{unbound (repeat foo count=bar)}} {{repeat foo count=bar}} {{unbound (repeat foo count=2)}} {{repeat foo count=4}}`, {\n foo: 'X',\n bar: 5\n });\n\n this.assertText('XXXXX XXXXX XX XXXX');\n\n this.runTask(() => this.rerender());\n\n this.assertText('XXXXX XXXXX XX XXXX');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 1));\n\n this.assertText('XXXXX X XX XXXX');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 5));\n\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\n this.render(_abstractTestCase.strip`\n {{unbound (surround model.prefix model.value \"bar\")}} {{surround model.prefix model.value \"bar\"}} {{unbound (surround \"bar\" model.value model.suffix)}} {{surround \"bar\" model.value model.suffix}}`, {\n model: {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n }\n });\n\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n\n this.runTask(() => this.rerender());\n\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n\n this.runTask(() => {\n (0, _metal.setProperties)(this.context.model, {\n prefix: 'beforeChanged',\n value: 'coreChanged',\n suffix: 'afterChanged'\n });\n });\n\n this.assertText('before-core-bar beforeChanged-coreChanged-bar bar-core-after bar-coreChanged-afterChanged');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n });\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\n this.render(`{{fauxconcat model.foo model.bar model.bing}} {{unbound (fauxconcat model.foo model.bar model.bing)}}`, {\n model: {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }\n });\n\n this.assertText('abc abc');\n\n this.runTask(() => this.rerender());\n\n this.assertText('abc abc');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', 'X'));\n\n this.assertText('aXc abc');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }));\n\n this.assertText('abc abc');\n }\n\n ['@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 this._super(...arguments);\n },\n\n compute([value]) {\n if (this.get('value')) {\n this.removeObserver('value.firstName', this, this.recompute);\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 this._super(...arguments);\n },\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n compute([value]) {\n if (this.get('value')) {\n this.teardown();\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 person}} {{unbound (capitalizeName person)}} {{concatNames person}} {{unbound (concatNames person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\n\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\n this.render(`{{#each 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\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n\n this.runTask(() => this.context.people.setEach('firstName', 'chad'));\n\n this.assertText('CHAD SHOOBYCHAD CINDY');\n\n this.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\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n }\n\n ['@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 this._super(...arguments);\n },\n\n compute([value]) {\n if (this.get('value')) {\n this.removeObserver('value.firstName', this, this.recompute);\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 this._super(...arguments);\n },\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n compute([value]) {\n if (this.get('value')) {\n this.teardown();\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 person}} {{unbound (capitalizeName person)}} {{concatNames person}} {{unbound (concatNames person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\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(_abstractTestCase.strip`\n {{#if (unbound model.foo)}}\n {{#if model.bar}}true{{/if}}\n {{#unless model.bar}}false{{/unless}}\n {{/if}}\n {{#unless (unbound model.notfoo)}}\n {{#if model.bar}}true{{/if}}\n {{#unless model.bar}}false{{/unless}}\n {{/unless}}`, {\n model: {\n foo: true,\n notfoo: false,\n bar: true\n }\n });\n\n this.assertText('truetrue');\n\n this.runTask(() => this.rerender());\n\n this.assertText('truetrue');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', false));\n\n this.assertText('falsefalse');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: true,\n notfoo: false,\n bar: true\n }));\n\n this.assertText('truetrue');\n }\n\n ['@test yielding unbound does not update']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n fooBarInstance = this;\n },\n model: { foo: 'bork' }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound model.foo)}}`\n });\n\n this.render(`{{#foo-bar as |value|}}{{value}}{{/foo-bar}}`);\n\n this.assertText('bork');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { foo: 'bork' }));\n\n this.assertText('bork');\n }\n\n ['@test yielding unbound hash does not update']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n fooBarInstance = this;\n },\n model: { foo: 'bork' }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound (hash foo=model.foo))}}`\n });\n\n this.render(`{{#foo-bar as |value|}}{{value.foo}}{{/foo-bar}}`);\n\n this.assertText('bork');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { foo: 'bork' }));\n\n this.assertText('bork');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/yield-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers'], function (_testCase, _metal, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{yield}} helper', class extends _testCase.RenderingTest {\n ['@test can yield to block']() {\n this.registerComponent('yield-comp', {\n template: '[In layout:] {{yield}}'\n });\n\n this.render('{{#yield-comp}}[In Block:] {{object.title}}{{/yield-comp}}', {\n object: { title: 'Seattle' }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n\n this.runTask(() => (0, _metal.set)(this.context, 'object', { title: 'Seattle' }));\n this.assertText('[In layout:] [In Block:] Seattle');\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:] {{object.title}}{{/outer-comp}}'\n });\n\n this.render('{{inner-comp object=object}}', {\n object: { title: 'Seattle' }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n\n this.runTask(() => (0, _metal.set)(this.context, 'object', { title: 'Seattle' }));\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 let list = [1, 2, 3];\n\n this.registerComponent('outer-comp', {\n template: '{{#each list as |item|}}{{yield}}{{/each}}'\n });\n\n this.render('{{#outer-comp list=list}}Hello{{/outer-comp}}', {\n list: list\n });\n this.assertText('HelloHelloHello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'list', [4, 5]));\n this.assertText('HelloHello');\n\n this.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 boolean}}{{yield}}{{/if}}'\n });\n\n this.render('{{#outer-comp boolean=boolean}}Hello{{/outer-comp}}', {\n boolean: true\n });\n this.assertText('Hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boolean', false));\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boolean', true));\n this.assertText('Hello');\n }\n\n ['@test simple curlies inside of a yielded clock should work when the yield is nested inside of another view']() {\n this.registerComponent('kiwi-comp', {\n template: '{{#if falsy}}{{else}}{{yield}}{{/if}}'\n });\n\n this.render('{{#kiwi-comp}}{{text}}{{/kiwi-comp}}', { text: 'ohai' });\n this.assertText('ohai');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n\n this.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 falsy}}{{else}}{{yield}}{{/if}}'\n });\n this.registerComponent('child-comp', {\n template: '{{#if falsy}}{{else}}{{text}}{{/if}}'\n });\n\n this.render('{{#parent-comp}}{{child-comp text=text}}{{/parent-comp}}', {\n text: 'ohai'\n });\n this.assertText('ohai');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n\n this.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', { template: 'Hello:{{yield}}' });\n this.registerComponent('outer-comp', {\n template: '{{yielding-comp}} {{title}}'\n });\n\n this.render('{{outer-comp title=title}}', { title: 'Mr. Selden' });\n\n this.assertText('Hello: Mr. Selden');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'title', 'Mr. Chag'));\n this.assertText('Hello: Mr. Chag');\n\n this.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 let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '

    {{boundText}}

    {{yield}}

    '\n });\n\n this.render('{{#kiwi-comp}}{{boundText}}{{/kiwi-comp}}', {\n boundText: 'Original'\n });\n this.assertText('InnerOriginal');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.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 let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '

    {{boundText}}

    {{yield}}

    '\n });\n\n this.render('{{#with boundText as |item|}}{{#kiwi-comp}}{{item}}{{/kiwi-comp}}{{/with}}', {\n boundText: 'Outer'\n });\n this.assertText('InnerOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.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 let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '{{#with boundText as |item|}}

    {{item}}

    {{yield}}

    {{/with}}'\n });\n\n this.render('{{#kiwi-comp}}{{item}}{{/kiwi-comp}}', { item: 'Outer' });\n this.assertText('InnerOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'item', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.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: '

    {{content}}

    {{yield}}

    '\n });\n\n this.render('{{#with boundText as |item|}}{{#kiwi-comp content=item}}{{item}}{{/kiwi-comp}}{{/with}}', { boundText: 'Outer' });\n this.assertText('OuterOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Update'));\n this.assertText('UpdateUpdate');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Outer'));\n this.assertText('OuterOuter');\n }\n\n // INUR not need with no data update\n ['@test yield should not introduce a view'](assert) {\n let ParentCompComponent = _helpers.Component.extend({ isParentComponent: true });\n\n let ChildCompComponent = _helpers.Component.extend({\n didReceiveAttrs() {\n this._super();\n let parentView = this.get('parentView');\n\n assert.ok(parentView.get('isParentComponent'));\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\n this.render('{{#parent-comp}}{{child-comp}}{{/parent-comp}}');\n }\n\n ['@test yield with nested components (#3220)']() {\n this.registerComponent('inner-component', { template: '{{yield}}' });\n this.registerComponent('outer-component', {\n template: '{{#inner-component}}{{yield}}{{/inner-component}}'\n });\n\n this.render('{{#outer-component}}Hello {{boundText}}{{/outer-component}}', {\n boundText: 'world'\n });\n this.assertText('Hello world');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'update'));\n this.assertText('Hello update');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'world'));\n this.assertText('Hello world');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/input-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Input element tests', class extends _testCase.RenderingTest {\n runAttributeTest(attributeName, values) {\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on noop rerender`);\n\n this.setComponentValue(values[1]);\n this.assertAttributeHasValue(attributeName, values[1], `${attributeName} is set on rerender`);\n\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 let attributeName = propertyName;\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on noop rerender`);\n\n this.setComponentValue(values[1]);\n this.assertPropertyHasValue(propertyName, values[1], `${propertyName} is set on rerender`);\n\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 let value = 'value';\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertPropertyHasValue(value, '', `${value} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertPropertyHasValue(value, '', `${value} is set on noop rerender`);\n this.setComponentValue(values[1]);\n\n this.assertPropertyHasValue(value, values[1], `${value} is set on rerender`);\n\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 let model = { model: { value: false } };\n\n this.render(``, model);\n\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n\n this.runTask(() => this.context.set('model.value', true));\n\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(''); // Note the DOM output is \n\n this.runTask(() => this.context.set('model.value', 'wat'));\n\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(''); // Note the DOM output is \n\n this.runTask(() => this.context.set('model', { 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 let template = ``;\n this.render(template, { value: 'hola' });\n\n this.setDOMValue('hello');\n this.setSelectionRange(1, 3);\n\n this.setComponentValue('hello');\n\n this.assertSelectionRange(1, 3);\n\n // 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 let template = ``;\n this.render(template, { value: 'hola' });\n\n this.assertValue('hola', 'Value is initialised');\n\n this.setComponentValue('');\n this.assertValue('', 'Value is set in the DOM');\n\n this.setDOMValue('hola');\n this.setComponentValue('hola');\n this.assertValue('hola', 'Value is updated the first time');\n\n this.setComponentValue('');\n this.assertValue('', 'Value is updated the second time');\n }\n\n ['@test DOM is SSOT if value is set']() {\n let template = ``;\n this.render(template, { value: 'hola' });\n\n this.assertValue('hola', 'Value is initialised');\n\n this.setComponentValue('hello');\n\n this.assertValue('hello', 'Value is initialised');\n\n this.setDOMValue('hola');\n\n this.assertValue('hola', 'DOM is used');\n\n this.setComponentValue('bye');\n\n this.assertValue('bye', 'Value is used');\n\n // Simulates setting the input to the same value as it already is which won't cause a rerender\n\n this.setDOMValue('hola');\n\n this.assertValue('hola', 'DOM is used');\n\n this.setComponentValue('hola');\n\n this.assertValue('hola', 'Value is used');\n }\n\n // private helpers and assertions\n setDOMValue(value) {\n this.inputElement().value = value;\n }\n\n setComponentValue(value) {\n this.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});","enifed('@ember/-internals/glimmer/tests/integration/mount-test', ['@ember/-internals/owner', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/metal', '@ember/engine', '@ember/canary-features'], function (_owner, _testCase, _helpers, _controller, _metal, _engine, _canaryFeatures) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_ENGINES_MOUNT_PARAMS) {\n (0, _testCase.moduleFor)('{{mount}} single param assertion', class extends _testCase.RenderingTest {\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 } else {\n (0, _testCase.moduleFor)('{{mount}} single param assertion', class extends _testCase.RenderingTest {\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 argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}./i);\n }\n });\n }\n\n (0, _testCase.moduleFor)('{{mount}} assertions', class extends _testCase.RenderingTest {\n ['@test it asserts when an invalid engine name is provided']() {\n expectAssertion(() => {\n this.render('{{mount engineName}}', { engineName: {} });\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, _testCase.moduleFor)('{{mount}} test', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n let engineRegistrations = this.engineRegistrations = {};\n\n this.add('engine:chat', _engine.default.extend({\n router: null,\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, {{username}}

    ', { moduleName: 'my-app/templates/application.hbs' });\n\n let controller;\n\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n username: 'dgeb',\n\n init() {\n this._super();\n controller = this;\n }\n });\n\n return this.visit('/').then(() => {\n assert.ok(controller, \"engine's application controller has been instantiated\");\n\n let engineInstance = (0, _owner.getOwner)(controller);\n assert.strictEqual((0, _engine.getEngineParent)(engineInstance), this.applicationInstance, 'engine instance has the application instance as its parent');\n\n this.assertInnerHTML('

    Chat here, dgeb

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'username', 'chancancode'));\n\n this.assertInnerHTML('

    Chat here, chancancode

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'username', 'dgeb'));\n\n this.assertInnerHTML('

    Chat here, dgeb

    ');\n });\n }\n\n ['@test it emits a useful backtracking re-render assertion message']() {\n this.router.map(function () {\n this.route('route-with-mount');\n });\n\n this.addTemplate('index', '');\n this.addTemplate('route-with-mount', '{{mount \"chat\"}}');\n\n this.engineRegistrations['template:application'] = (0, _helpers.compile)('hi {{person.name}} [{{component-with-backtracking-set person=person}}]', { moduleName: 'my-app/templates/application.hbs' });\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n person: { name: 'Alex' }\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 this.set('person.name', 'Ben');\n }\n });\n\n let expectedBacktrackingMessage = /modified \"person\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"template:my-app\\/templates\\/route-with-mount.hbs\" \\(in \"engine:chat\"\\) and modified in \"component:component-with-backtracking-set\" \\(in \"engine:chat\"\\)/;\n\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/route-with-mount');\n }, expectedBacktrackingMessage);\n });\n }\n\n ['@test it renders with a bound engine name']() {\n this.router.map(function () {\n this.route('bound-engine-name');\n });\n let controller;\n this.add('controller:bound-engine-name', _controller.default.extend({\n engineName: null,\n init() {\n this._super();\n controller = this;\n }\n }));\n this.addTemplate('bound-engine-name', '{{mount engineName}}');\n\n this.add('engine:foo', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('

    Foo Engine

    ', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n this.add('engine:bar', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\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\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

    Foo Engine

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', undefined));\n\n this.assertInnerHTML('');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

    Foo Engine

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'bar'));\n\n this.assertInnerHTML('

    Bar Engine

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

    Foo Engine

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', null));\n\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\n let controller;\n let component;\n\n this.add('controller:engine-event-dispatcher-singleton', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n }\n }));\n this.addTemplate('engine-event-dispatcher-singleton', '{{mount \"foo\"}}');\n\n this.add('engine:foo', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\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 init() {\n this._super(...arguments);\n component = this;\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\n let controllerOwnerEventDispatcher = (0, _owner.getOwner)(controller).lookup('event_dispatcher:main');\n let taglessComponentOwnerEventDispatcher = (0, _owner.getOwner)(component).lookup('event_dispatcher:main');\n\n this.assert.strictEqual(controllerOwnerEventDispatcher, taglessComponentOwnerEventDispatcher);\n });\n }\n });\n\n if (_canaryFeatures.EMBER_ENGINES_MOUNT_PARAMS) {\n (0, _testCase.moduleFor)('{{mount}} params tests', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.add('engine:paramEngine', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\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 ['@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\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 let controller;\n this.add('controller:engine-params-bound', _controller.default.extend({\n boundParamValue: null,\n init() {\n this._super();\n controller = this;\n }\n }));\n this.addTemplate('engine-params-bound', '{{mount \"paramEngine\" model=(hash foo=boundParamValue)}}');\n\n return this.visit('/engine-params-bound').then(() => {\n this.assertInnerHTML('

    Param Engine:

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

    Param Engine: bar

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', undefined));\n\n this.assertInnerHTML('

    Param Engine:

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

    Param Engine: bar

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'baz'));\n\n this.assertInnerHTML('

    Param Engine: baz

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

    Param Engine: bar

    ');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', null));\n\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\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({ tagName: '' }),\n template: 'rendered app-bar-component from the app'\n });\n this.add('engine:componentParamEngine', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('{{model.foo}}', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n this.addTemplate('engine-params-contextual-component', '{{mount \"componentParamEngine\" model=(hash foo=(component \"foo-component\"))}}');\n\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});","enifed('@ember/-internals/glimmer/tests/integration/outlet-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/metal'], function (_testCase, _internalTestHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('outlet view', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n let CoreOutlet = this.owner.factoryFor('view:-outlet');\n\n this.component = CoreOutlet.create();\n }\n\n ['@test should not error when initial rendered template is undefined']() {\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('');\n }\n\n ['@test should render the outlet when set after DOM insertion']() {\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('');\n\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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test should render the outlet when set before DOM insertion']() {\n this.registerTemplate('application', 'HI{{outlet}}');\n let 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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test should support an optional name']() {\n this.registerTemplate('application', '

    HI

    {{outlet \"special\"}}');\n let 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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('special', '

    BYE

    ');\n outletState.outlets.special = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'special',\n controller: {},\n template: this.owner.lookup('template:special')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test does not default outlet name when positional argument is present']() {\n this.registerTemplate('application', '

    HI

    {{outlet someUndefinedThing}}');\n let 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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('special', '

    BYE

    ');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'special',\n controller: {},\n template: this.owner.lookup('template:special')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HI');\n }\n\n ['@test should support bound outlet name']() {\n let controller = { outletName: 'foo' };\n this.registerTemplate('application', '

    HI

    {{outlet outletName}}');\n let 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')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('foo', '

    FOO

    ');\n outletState.outlets.foo = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'foo',\n controller: {},\n template: this.owner.lookup('template:foo')\n },\n outlets: Object.create(null)\n };\n\n this.registerTemplate('bar', '

    BAR

    ');\n outletState.outlets.bar = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'bar',\n controller: {},\n template: this.owner.lookup('template:bar')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIFOO');\n\n this.runTask(() => (0, _metal.set)(controller, 'outletName', 'bar'));\n\n this.assertText('HIBAR');\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');\n\n // 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 this.registerHelper('identity', ([a]) => a);\n\n let 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')\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')\n },\n outlets: Object.create(null)\n }\n }\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('ABCDE');\n\n this.assertStableRerender();\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/refinements-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal'], function (_testCase, _abstractTestCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('syntax refinements', class extends _testCase.RenderingTest {\n ['@test block params should not be refined']() {\n this.registerHelper('foo', () => 'bar helper');\n\n this.render(_abstractTestCase.strip`\n {{#with var as |foo|}}\n {{foo}}\n {{/with}}\n\n ---\n\n {{#with var as |outlet|}}\n {{outlet}}\n {{/with}}\n\n ---\n\n {{#with var as |mount|}}\n {{mount}}\n {{/with}}\n\n ---\n\n {{#with var as |component|}}\n {{component}}\n {{/with}}\n\n ---\n\n {{#with var as |input|}}\n {{input}}\n {{/with}}\n\n ---\n\n {{#with var as |-with-dynamic-vars|}}\n {{-with-dynamic-vars}}\n {{/with}}\n\n ---\n\n {{#with var as |-in-element|}}\n {{-in-element}}\n {{/with}}`, { var: 'var' });\n\n this.assertText('var---var---var---var---var---var---var');\n\n this.runTask(() => (0, _metal.set)(this.context, 'var', 'RARRR!!!'));\n\n this.assertText('RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'var', 'var'));\n\n this.assertText('var---var---var---var---var---var---var');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/render-settled-test', ['internal-test-helpers', '@ember/-internals/glimmer', 'rsvp', '@ember/runloop'], function (_internalTestHelpers, _glimmer, _rsvp, _runloop) {\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(_internalTestHelpers.strip`{{foo}}`, { 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 let first = (0, _glimmer.renderSettled)();\n let second = (0, _glimmer.renderSettled)();\n\n assert.strictEqual(first, second);\n\n return (0, _rsvp.all)([first, second]);\n }\n\n ['@test resolves when rendering has completed (after property update)']() {\n this.render(_internalTestHelpers.strip`{{foo}}`, { foo: 'bar' });\n\n this.assertText('bar');\n this.component.set('foo', 'baz');\n this.assertText('bar');\n\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\n this.render(_internalTestHelpers.strip`{{foo}}`, { foo: 'bar' });\n\n this.assertText('bar');\n let promise;\n\n return (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', null, () => {\n this.component.set('foo', 'set in actions');\n\n promise = (0, _glimmer.renderSettled)().then(() => {\n this.assertText('set in afterRender');\n });\n\n (0, _runloop.schedule)('afterRender', null, () => {\n this.component.set('foo', 'set in afterRender');\n });\n });\n\n // still not updated here\n this.assertText('bar');\n\n return promise;\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/svg-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _metal, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('SVG element tests', class extends _testCase.RenderingTest {\n ['@test unquoted viewBox property is output'](assert) {\n let viewBoxString = '0 0 100 100';\n\n this.render('
    ', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n\n assert.equal(this.firstChild.getAttribute('svg'), null);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n }\n\n ['@test quoted viewBox property is output'](assert) {\n let viewBoxString = '0 0 100 100';\n\n this.render('
    ', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n\n assert.equal(this.firstChild.getAttribute('svg'), null);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n }\n\n ['@test quoted viewBox property is concat']() {\n let viewBoxString = '100 100';\n\n this.render('
    ', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', '200 200'));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n }\n\n ['@test class is output']() {\n this.render(\"
    \", {\n model: {\n color: 'blue'\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.color', 'yellow'));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { color: 'blue' }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
    \n \n
    \n `);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/each-in-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/utils', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_metal, _testCase, _runtime, _abstractTestCase, _utils, _sharedConditionalTests) {\n 'use strict';\n\n function EmptyFunction() {}\n function NonEmptyFunction() {}\n NonEmptyFunction.foo = 'bar';\n class EmptyConstructor {}\n class NonEmptyConstructor {}\n NonEmptyConstructor.foo = 'bar';\n\n class TogglingEachInTest extends _sharedConditionalTests.TogglingSyntaxConditionalsTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each-in ${cond} as |key|}}${truthy}{{else}}${falsy}{{/each-in}}`;\n }\n }\n class BasicEachInTest extends TogglingEachInTest {}\n\n class BasicSyntaxTest extends BasicEachInTest {\n get truthyValue() {\n return { 'Not Empty': 1 };\n }\n\n get falsyValue() {\n return {};\n }\n }\n\n class EachInProxyTest extends TogglingEachInTest {}\n\n (0, _abstractTestCase.applyMixins)(BasicEachInTest, new _sharedConditionalTests.TruthyGenerator([{ foo: 1 }, _runtime.Object.create({ 'Not Empty': 1 }), [1], NonEmptyFunction, NonEmptyConstructor]), new _sharedConditionalTests.FalsyGenerator([null, undefined, false, '', 0, [], EmptyFunction, EmptyConstructor, {}, Object.create(null), Object.create({}), Object.create({ 'Not Empty': 1 }), _runtime.Object.create()]));\n\n (0, _abstractTestCase.applyMixins)(EachInProxyTest, new _sharedConditionalTests.TruthyGenerator([_runtime.ObjectProxy.create({ content: { 'Not empty': 1 } })]), new _sharedConditionalTests.FalsyGenerator([_runtime.ObjectProxy.create(), _runtime.ObjectProxy.create({ content: null }), _runtime.ObjectProxy.create({ content: {} }), _runtime.ObjectProxy.create({ content: Object.create(null) }), _runtime.ObjectProxy.create({ content: Object.create({}) }), _runtime.ObjectProxy.create({ content: Object.create({ 'Not Empty': 1 }) }), _runtime.ObjectProxy.create({ content: _runtime.Object.create() })]));\n\n // Truthy/Falsy tests\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with `ObjectProxy`', class extends EachInProxyTest {\n get truthyValue() {\n return _runtime.ObjectProxy.create({ content: { 'Not Empty': 1 } });\n }\n\n get falsyValue() {\n return _runtime.ObjectProxy.create({ content: null });\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}}', BasicSyntaxTest);\n\n // Rendering tests\n class AbstractEachInTest extends _testCase.RenderingTest {\n createHash() /* hash */{\n throw new Error('Not implemented: `createHash`');\n }\n\n makeHash(obj) {\n let { hash, delegate } = this.createHash(obj);\n\n this.hash = hash;\n this.delegate = delegate;\n return hash;\n }\n\n replaceHash(hash) {\n this.runTask(() => (0, _metal.set)(this.context, 'hash', this.createHash(hash).hash));\n }\n\n clear() {\n return this.runTask(() => (0, _metal.set)(this.context, 'hash', this.createHash({}).hash));\n }\n\n setProp(key, value) {\n return this.runTask(() => this.delegate.setProp(this.context, key, value));\n }\n\n updateNestedValue(key, innerKey, value) {\n return this.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 if (this.type !== undefined) {\n context.type = this.type;\n }\n context.secretKey = 'asd';\n\n return super.render(template, context);\n }\n }\n\n class EachInTest extends AbstractEachInTest {\n [`@test it repeats the given block for each item in the hash`]() {\n this.makeHash({ Smartphones: 8203, 'JavaScript Frameworks': Infinity });\n\n this.render(`
      {{#each-in hash as |category count|}}
    • {{category}}: {{count}}
    • {{else}}Empty!{{/each-in}}
    `);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\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\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n this.clear();\n\n this.assertText('Empty!');\n }\n\n [`@test it can render sub-paths of each item`](assert) {\n this.makeHash({\n Smartphones: { reports: { unitsSold: 8203 } },\n 'JavaScript Frameworks': { reports: { unitsSold: Infinity } }\n });\n\n this.render(`
      {{#each-in hash as |category data|}}
    • {{category}}: {{data.reports.unitsSold}}
    • {{else}}Empty!{{/each-in}}
    `);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n this.setProp('Tweets', { reports: { unitsSold: 100 } });\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n this.runTask(() => this.updateNestedValue('Smartphones', 'reports.unitsSold', 8204));\n\n assert.ok(this.textValue().indexOf('Smartphones: 8204') > -1);\n\n this.clear();\n\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\n this.render(`
      {{#each-in hash key='@identity' as |category count|}}
    • {{category}}: {{count}}
    • {{/each-in}}
    `);\n\n this.assertText('Smartphones: 8203Tablets: 8203JavaScript Frameworks: InfinityBugs: Infinity');\n\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\n this.assertText('');\n }\n\n [`@test it repeats the given block when the hash is dynamic`]() {\n let { hash: categories } = this.createHash({\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n let { hash: otherCategories } = this.createHash({\n Emberinios: 533462,\n Tweets: 7323\n });\n let context = {\n hashes: {\n categories,\n otherCategories,\n type: 'categories'\n }\n };\n this.render(`
      {{#each-in (get hashes hashes.type) as |category count|}}
    • {{category}}: {{count}}
    • {{else}}Empty!{{/each-in}}
    `, context);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'otherCategories'));\n\n this.assertText('Emberinios: 533462Tweets: 7323');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'nonExistent'));\n\n this.clear();\n\n this.assertText('Empty!');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n }\n\n ['@test keying off of `undefined` does not render']() {\n this.makeHash({});\n\n this.render(`{{#each-in hash as |key value|}}{{key}}: {{value.baz}}{{else}}Empty!{{/each-in}}`);\n\n this.assertText('Empty!');\n\n this.assertStableRerender();\n\n this.replaceHash({ bar: { baz: 'Here!' } });\n\n this.assertText('bar: Here!');\n\n this.clear();\n\n this.assertText('Empty!');\n }\n\n [`@test it can render items with a key of empty string`]() {\n this.makeHash({ '': 'empty-string', a: 'a' });\n\n this.render(`
      {{#each-in hash as |key value|}}
    • {{key}}: {{value}}
    • {{else}}Empty!{{/each-in}}
    `);\n\n this.assertText(': empty-stringa: a');\n\n this.assertStableRerender();\n\n this.clear();\n\n this.assertText('Empty!');\n }\n }\n\n (0, _testCase.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 updateNestedValue(context, key, innerKey, value) {\n let target = context.hash[key];\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n [`@test it only iterates over an object's own properties`]() {\n let protoCategories = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n\n let categories = Object.create(protoCategories);\n categories['Televisions'] = 183;\n categories['Alarm Clocks'] = 999;\n\n this.render(`
      {{#each-in categories as |category count|}}
    • {{category}}: {{count}}
    • {{else}}Empty!{{/each-in}}
    `, { categories });\n\n this.assertText('Televisions: 183Alarm Clocks: 999');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(protoCategories, 'Robots', 666);\n (0, _metal.set)(categories, 'Tweets', 443115);\n });\n\n this.assertText('Televisions: 183Alarm Clocks: 999Tweets: 443115');\n\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(_abstractTestCase.strip`\n
      \n {{#each-in categories as |category count|}}\n
    • {{category}}: {{count}}
    • \n {{/each-in}}\n
    \n `, {\n categories: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 8203
    • \n
    • JavaScript Frameworks: Infinity
    • \n
    \n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let categories = (0, _metal.get)(this.context, 'categories');\n delete categories.Smartphones;\n });\n\n this.assertInvariants();\n\n this.runTask(() => {\n let categories = (0, _metal.get)(this.context, 'categories');\n categories['Emberinios'] = 123456;\n });\n\n this.assertInvariants();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'categories', {\n Emberinios: 123456\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Emberinios: 123456
    • \n
    \n `);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'categories', {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 8203
    • \n
    • JavaScript Frameworks: Infinity
    • \n
    \n `);\n }\n\n ['@test it skips holes in sparse arrays']() {\n let arr = [];\n arr[5] = 'foo';\n arr[6] = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each-in arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, { arr });\n\n this.assertText('[5:foo][6:bar]');\n\n this.assertStableRerender();\n }\n\n ['@test it iterate over array with `in` instead of walking over elements']() {\n let arr = [1, 2, 3];\n arr.foo = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each-in arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, { arr });\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n\n this.runTask(() => {\n (0, _metal.set)(arr, 'zomg', 'lol');\n });\n\n this.assertText('[0:1][1:2][2:3][foo:bar][zomg:lol]');\n\n arr = [1, 2, 3];\n arr.foo = 'bar';\n\n this.runTask(() => (0, _metal.set)(this.context, 'arr', arr));\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with EmberObjects', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n createHash(pojo) {\n let hash = _runtime.Object.create(pojo);\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n updateNestedValue(context, key, innerKey, value) {\n let target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with object proxies', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n createHash(pojo) {\n let hash = _runtime.ObjectProxy.create({ content: pojo });\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n updateNestedValue(context, key, innerKey, value) {\n let target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n ['@test it iterates over the content, not the proxy']() {\n let content = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n\n let proxy = _runtime.ObjectProxy.create({\n content,\n foo: 'bar'\n });\n\n this.render(_abstractTestCase.strip`\n
      \n {{#each-in categories as |category count|}}\n
    • {{category}}: {{count}}
    • \n {{/each-in}}\n
    \n `, { categories: proxy });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 8203
    • \n
    • JavaScript Frameworks: Infinity
    • \n
    \n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(proxy, 'content.Smartphones', 100);\n (0, _metal.set)(proxy, 'content.Tweets', 443115);\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 100
    • \n
    • JavaScript Frameworks: Infinity
    • \n
    • Tweets: 443115
    • \n
    \n `);\n\n this.runTask(() => {\n (0, _metal.set)(proxy, 'content', {\n Smartphones: 100,\n Tablets: 20\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 100
    • \n
    • Tablets: 20
    • \n
    \n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'categories', _runtime.ObjectProxy.create({\n content: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n })));\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • Smartphones: 8203
    • \n
    • JavaScript Frameworks: Infinity
    • \n
    \n `);\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with ES6 Maps', class extends EachInTest {\n createHash(pojo) {\n let 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 let target = context.hash.get(key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n [`@test it supports having objects as keys on ES6 Maps`]() {\n let map = new Map();\n map.set({ name: 'one' }, 'foo');\n map.set({ name: 'two' }, 'bar');\n\n this.render(_abstractTestCase.strip`\n
      \n {{#each-in map key=\"@identity\" as |key value|}}\n
    • {{key.name}}: {{value}}
    • \n {{/each-in}}\n
    `, { map });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • one: foo
    • \n
    • two: bar
    • \n
    \n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let map = new Map();\n map.set({ name: 'three' }, 'qux');\n (0, _metal.set)(this.context, 'map', map);\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
      \n
    • three: qux
    • \n
    \n `);\n }\n });\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with custom iterables', class extends EachInTest {\n createHash(pojo) {\n let ary = Object.keys(pojo).reduce((accum, key) => {\n return accum.concat([[key, pojo[key]]]);\n }, []);\n let iterable = {\n [Symbol.iterator]: () => makeIterator(ary)\n };\n return {\n hash: iterable,\n delegate: {\n updateNestedValue(context, key, innerKey, value) {\n let ary = Array.from(context.hash);\n let target = ary.find(([k]) => k === key)[1];\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n });\n }\n\n // Utils\n function makeIterator(ary) {\n var index = 0;\n\n return {\n next() {\n return index < ary.length ? { value: ary[index++], done: false } : { done: true };\n }\n };\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/each-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/utils', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_metal, _abstractTestCase, _testCase, _runtime, _helpers, _utils, _sharedConditionalTests) {\n 'use strict';\n\n class ArrayDelegate {\n constructor(content, target) {\n this._array = content;\n this._target = target || this;\n }\n\n // The following methods are APIs used by the tests\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 this.arrayContentDidChange();\n }\n\n unshiftObject(obj) {\n this._array.unshift(obj);\n this.arrayContentDidChange();\n }\n\n unshiftObjects(arr) {\n this._array.unshift(...arr);\n this.arrayContentDidChange();\n }\n\n pushObject(obj) {\n this._array.push(obj);\n this.arrayContentDidChange();\n }\n\n pushObjects(arr) {\n this._array.push(...arr);\n this.arrayContentDidChange();\n }\n\n shiftObject() {\n let obj = this._array.shift();\n this.arrayContentDidChange();\n return obj;\n }\n\n popObject() {\n let obj = this._array.pop();\n this.arrayContentDidChange();\n return obj;\n }\n\n insertAt(idx, obj) {\n this._array.splice(idx, 0, obj);\n this.arrayContentDidChange();\n }\n\n removeAt(idx, len = 1) {\n this._array.splice(idx, len);\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 const makeSet = (() => {\n // IE11 does not support `new Set(items);`\n let set = new Set([1, 2, 3]);\n\n if (set.size === 3) {\n return items => new Set(items);\n } else {\n return items => {\n let 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 let 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 this._array.forEach(value => this._set.add(value));\n super.arrayContentDidChange();\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 let ArrayIterable;\n\n if (_utils.HAS_NATIVE_SYMBOL) {\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 get falsyValue() {\n return [];\n }\n }\n\n class BasicEachTest extends TogglingEachTest {}\n\n const TRUTHY_CASES = [['hello'], (0, _runtime.A)(['hello']), makeSet(['hello']), new ForEachable(['hello']), _runtime.ArrayProxy.create({ content: ['hello'] }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) })];\n\n const FALSY_CASES = [null, undefined, false, '', 0, [], (0, _runtime.A)([]), makeSet([]), new ForEachable([]), _runtime.ArrayProxy.create({ content: [] }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)([]) })];\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n TRUTHY_CASES.push(new ArrayIterable(['hello']));\n FALSY_CASES.push(new ArrayIterable([]));\n }\n\n (0, _abstractTestCase.applyMixins)(BasicEachTest, new _sharedConditionalTests.TruthyGenerator(TRUTHY_CASES), new _sharedConditionalTests.FalsyGenerator(FALSY_CASES), _sharedConditionalTests.ArrayTestCases);\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each}}', class extends BasicEachTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each as}}', class extends BasicEachTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n class EachEdgeCasesTest extends TogglingEachTest {}\n\n (0, _abstractTestCase.applyMixins)(EachEdgeCasesTest, new _sharedConditionalTests.FalsyGenerator([true, 'hello', 1, Object, function () {}, {}, { foo: 'bar' }, Object.create(null), Object.create({}), Object.create({ foo: 'bar' })]));\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each}}', class extends EachEdgeCasesTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each as}}', class extends EachEdgeCasesTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n class AbstractEachTest extends _testCase.RenderingTest {\n /* abstract */\n createList() /* items */{\n throw new Error('Not implemented: `createList`');\n }\n\n makeList(items) {\n let { list, delegate } = this.createList(items);\n\n this.list = list;\n this.delegate = delegate;\n }\n\n replaceList(list) {\n this.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 class EachTest extends AbstractEachTest {\n /* single each */\n\n ['@test it repeats the given block for each item in the array']() {\n this.makeList([{ text: 'hello' }]);\n\n this.render(`{{#each list as |item|}}{{item.text}}{{else}}Empty{{/each}}`);\n\n this.assertText('hello');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'text', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => {\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'World' });\n });\n\n this.assertText('Hello World');\n\n this.runTask(() => {\n this.pushObject({ text: 'Earth' });\n this.removeAt(1);\n this.insertAt(1, { text: 'Globe' });\n });\n\n this.assertText('HelloGlobeWorldEarth');\n\n this.runTask(() => {\n this.pushObject({ text: 'Planet' });\n this.removeAt(1);\n this.insertAt(1, { text: ' ' });\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'Earth' });\n this.removeAt(3);\n });\n\n this.assertText('Hello WorldPlanet Earth');\n\n this.runTask(() => {\n this.pushObject({ text: 'Globe' });\n this.removeAt(1);\n this.insertAt(1, { text: ' ' });\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'World' });\n this.removeAt(2);\n });\n\n this.assertText('Hello Planet EarthGlobe World');\n\n this.runTask(() => this.replace(2, 4, [{ text: 'my' }]));\n\n this.assertText('Hello my World');\n\n this.runTask(() => this.clear());\n\n this.assertText('Empty');\n\n this.replaceList([{ text: 'hello' }]);\n\n this.assertText('hello');\n }\n\n ['@test it receives the index as the second parameter']() {\n this.makeList([{ text: 'hello' }, { text: 'world' }]);\n\n this.render(`{{#each list as |item index|}}[{{index}}. {{item.text}}]{{/each}}`);\n\n this.assertText('[0. hello][1. world]');\n\n this.assertStableRerender();\n\n this.runTask(() => this.insertAt(1, { text: 'my' }));\n\n this.assertText('[0. hello][1. my][2. world]');\n\n this.replaceList([{ text: 'hello' }, { text: 'world' }]);\n\n this.assertText('[0. hello][1. world]');\n }\n\n ['@test it accepts a string key']() {\n this.makeList([{ text: 'hello' }, { text: 'world' }]);\n\n this.render(`{{#each list key='text' as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('helloworld');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ text: 'again' }));\n\n this.assertText('helloworldagain');\n\n this.replaceList([{ text: 'hello' }, { text: 'world' }]);\n\n this.assertText('helloworld');\n }\n\n ['@test it accepts a numeric key']() {\n this.makeList([{ id: 1 }, { id: 2 }]);\n\n this.render(`{{#each list key='id' as |item|}}{{item.id}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ id: 3 }));\n\n this.assertText('123');\n\n this.replaceList([{ id: 1 }, { id: 2 }]);\n\n this.assertText('12');\n }\n\n ['@test it can specify @index as the key']() {\n this.makeList([{ id: 1 }, { id: 2 }]);\n\n this.render(`{{#each list key='@index' as |item|}}{{item.id}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ id: 3 }));\n\n this.assertText('123');\n\n this.replaceList([{ id: 1 }, { 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\n this.render(`{{#each list key='@identity' as |item|}}{{item}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject(3));\n\n this.assertText('123');\n\n this.replaceList([1, 2]);\n\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, { id: 2 }, 3]);\n\n this.render(`{{#each list key='@identity' as |item|}}{{if item.id item.id item}}{{/each}}`);\n\n this.assertText('123');\n\n this.assertStableRerender();\n\n this.runTask(() => this.insertAt(2, { id: 4 }));\n\n this.assertText('1243');\n\n this.replaceList([1, { id: 2 }, 3]);\n\n this.assertText('123');\n }\n\n ['@test it can render duplicate primitive items']() {\n this.makeList(['a', 'a', 'a']);\n\n this.render(`{{#each list as |item|}}{{item}}{{/each}}`);\n\n this.assertText('aaa');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject('a'));\n\n this.assertText('aaaa');\n\n this.runTask(() => this.pushObject('a'));\n\n this.assertText('aaaaa');\n\n this.replaceList(['a', 'a', 'a']);\n\n this.assertText('aaa');\n }\n\n [`@test updating and setting within #each`]() {\n this.makeList([{ value: 1 }, { value: 2 }, { value: 3 }]);\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\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 this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{#if isEven}}{{item.value}}{{/if}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#each list as |item|}}\n
  • Prev
  • \n {{foo-bar item=item}}\n
  • Next
  • \n {{/each}}\n `);\n\n this.assertText('Prev1NextPrev2NextPrev3Next');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'value', 3));\n\n this.assertText('PrevNextPrev2NextPrev3Next');\n\n this.replaceList([{ value: 1 }, { value: 2 }, { value: 3 }]);\n\n this.assertText('Prev1NextPrev2NextPrev3Next');\n }\n\n ['@test it can render duplicate objects']() {\n let duplicateItem = { text: 'foo' };\n\n this.makeList([duplicateItem, duplicateItem, { text: 'bar' }, { text: 'baz' }]);\n\n this.render(`{{#each list as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('foofoobarbaz');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject(duplicateItem));\n\n this.assertText('foofoobarbazfoo');\n\n this.runTask(() => this.pushObject(duplicateItem));\n\n this.assertText('foofoobarbazfoofoo');\n\n this.replaceList([duplicateItem, duplicateItem, { text: 'bar' }, { 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([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('Hello world');\n\n this.takeSnapshot();\n\n this.runTask(() => {\n this.popObject();\n this.popObject();\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'world' });\n });\n\n this.assertText('Hello world');\n\n this.assertInvariants();\n\n this.replaceList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.assertText('Hello world');\n\n this.assertInvariants();\n }\n\n [`@test it maintains DOM stability for stable keys when list is updated`]() {\n this.makeList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('Hello world');\n\n this.assertStableRerender();\n\n let oldSnapshot = this.takeSnapshot();\n\n this.runTask(() => {\n this.unshiftObject({ text: ', ' });\n this.unshiftObject({ text: 'Hi' });\n this.pushObject({ text: '!' });\n this.pushObject({ text: 'earth' });\n });\n\n this.assertText('Hi, Hello world!earth');\n\n this.assertPartialInvariants(2, 5);\n\n this.replaceList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.assertText('Hello world');\n\n this.assertInvariants(oldSnapshot, this.takeSnapshot());\n }\n\n [`@test it renders all items with duplicate key values`]() {\n this.makeList([{ text: 'Hello' }, { text: 'Hello' }, { text: 'Hello' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('HelloHelloHello');\n\n this.runTask(() => {\n this.forEach(hash => (0, _metal.set)(hash, 'text', 'Goodbye'));\n });\n\n this.assertText('GoodbyeGoodbyeGoodbye');\n\n this.replaceList([{ text: 'Hello' }, { text: 'Hello' }, { 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([{ name: 'Chad' }, { name: 'Zack' }, { name: 'Asa' }]);\n\n this.render(`{{name}}-{{#each list as |person|}}{{name}}{{/each}}-{{name}}`, {\n name: 'Joel'\n });\n\n this.assertText('Joel-JoelJoelJoel-Joel');\n\n this.assertStableRerender();\n\n this.runTask(() => this.shiftObject());\n\n this.assertText('Joel-JoelJoel-Joel');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Godfrey'));\n\n this.assertText('Godfrey-GodfreyGodfrey-Godfrey');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Joel'));\n this.replaceList([{ name: 'Chad' }, { name: 'Zack' }, { name: 'Asa' }]);\n\n this.assertText('Joel-JoelJoelJoel-Joel');\n }\n\n ['@test can access the item and the original scope']() {\n this.makeList([{ name: 'Tom Dale' }, { name: 'Yehuda Katz' }, { name: 'Godfrey Chan' }]);\n\n this.render(`{{#each list key=\"name\" as |person|}}[{{title}}: {{person.name}}]{{/each}}`, {\n title: 'Señor Engineer'\n });\n\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n\n this.runTask(() => {\n (0, _metal.set)(this.objectAt(1), 'name', 'Stefan Penner');\n this.removeAt(0);\n this.pushObject({ name: 'Tom Dale' });\n this.insertAt(1, { name: 'Chad Hietala' });\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('[Principal Engineer: Stefan Penner][Principal Engineer: Chad Hietala][Principal Engineer: Godfrey Chan][Principal Engineer: Tom Dale]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'title', 'Señor Engineer'));\n this.replaceList([{ name: 'Tom Dale' }, { name: 'Yehuda Katz' }, { 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 this.makeList(['Yehuda']);\n\n this.render(`{{name}}-{{#each list as |name|}}{{name}}{{/each}}-{{name}}`, {\n name: 'Stef'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.pushObjects([' ', 'Katz']));\n\n this.assertText('Stef-Yehuda Katz-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Yehuda Katz-Tom');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Stef'));\n this.replaceList(['Yehuda']);\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test inverse template is displayed with context']() {\n this.makeList([]);\n\n this.render(`{{#each list as |thing|}}Has Thing{{else}}No Thing {{otherThing}}{{/each}}`, {\n otherThing: 'bar'\n });\n\n this.assertText('No Thing bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Thing bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'biz'));\n\n this.assertText('No Thing biz');\n\n this.runTask(() => this.pushObject('non-empty'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'baz'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'bar'));\n this.replaceList([]);\n\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\n this.registerComponent('x-wrapper', { template: '{{yield}}' });\n\n this.makeList([]);\n\n this.render(`{{#x-wrapper}}{{#each list as |obj|}}[{{obj.text}}]{{/each}}{{/x-wrapper}}`);\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.pushObject({ text: 'foo' }));\n\n this.assertText('[foo]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'text', 'FOO'));\n\n this.assertText('[FOO]');\n\n this.runTask(() => this.pushObject({ text: 'bar' }));\n\n this.assertText('[FOO][bar]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(1), 'text', 'BAR'));\n\n this.assertText('[FOO][BAR]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(1), 'text', 'baz'));\n\n this.assertText('[FOO][baz]');\n\n this.runTask(() => this.replace(1, 1, [{ text: 'BAZ' }]));\n\n this.assertText('[FOO][BAZ]');\n\n this.replaceList([]);\n\n this.assertText('');\n }\n\n ['@test empty trusted content clears properly [GH#16314]']() {\n this.makeList(['hello']);\n\n this.render(`before {{#each list as |value|}}{{{value}}}{{/each}} after`);\n\n this.assertText('before hello after');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObjects([null, ' world']));\n\n this.assertText('before hello world after');\n\n this.runTask(() => this.replace(1, 2, [undefined, ' world!']));\n\n this.assertText('before hello world! after');\n\n this.runTask(() => this.replace(1, 2, [(0, _helpers.htmlSafe)(''), ' world!!']));\n\n this.assertText('before hello world!! after');\n\n this.replaceList(['hello']);\n\n this.assertText('before hello after');\n }\n\n /* multi each */\n\n ['@test re-using the same variable with different {{#each}} blocks does not override each other']() {\n let admins = this.createList([{ name: 'Tom Dale' }]);\n let users = this.createList([{ name: 'Yehuda Katz' }]);\n\n this.render(`Admin: {{#each admins key=\"name\" as |person|}}[{{person.name}}]{{/each}} User: {{#each users key=\"name\" as |person|}}[{{person.name}}]{{/each}}`, {\n admins: admins.list,\n users: users.list\n });\n\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n\n this.runTask(() => {\n admins.delegate.pushObject({ name: 'Godfrey Chan' });\n (0, _metal.set)(users.delegate.objectAt(0), 'name', 'Stefan Penner');\n });\n\n this.assertText('Admin: [Tom Dale][Godfrey Chan] User: [Stefan Penner]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admins', this.createList([{ name: 'Tom Dale' }]).list);\n (0, _metal.set)(this.context, 'users', this.createList([{ name: 'Yehuda Katz' }]).list);\n });\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 let content = this.createList(['X', 'Y']);\n let options = this.createList([{ label: 'One', value: 1 }, { label: 'Two', value: 2 }]);\n\n this.render(_abstractTestCase.strip`\n {{#each content as |value|}}\n {{value}}-\n {{#each options as |option|}}\n {{option.value}}:{{option.label}}\n {{/each}}\n {{/each}}\n `, {\n content: content.list,\n options: options.list\n });\n\n this.assertText('X-1:One2:TwoY-1:One2:Two');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n content.delegate.pushObject('Z');\n (0, _metal.set)(options.delegate.objectAt(0), 'value', 0);\n });\n\n this.assertText('X-0:One2:TwoY-0:One2:TwoZ-0:One2:Two');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'content', this.createList(['X', 'Y']).list);\n (0, _metal.set)(this.context, 'options', this.createList([{ label: 'One', value: 1 }, { label: 'Two', value: 2 }]).list);\n });\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 let first = this.createList(['Limbo']);\n let fifth = this.createList(['Wrath']);\n let ninth = this.createList(['Treachery']);\n\n this.render(`{{ring}}-{{#each first as |ring|}}{{ring}}-{{#each fifth as |ring|}}{{ring}}-{{#each 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\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n fifth.delegate.insertAt(0, 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Wrath-Treachery-Wrath-Limbo-O');\n\n this.runTask(() => {\n first.delegate.pushObject('I');\n ninth.delegate.replace(0, 1, ['K']);\n });\n\n this.assertText('O-Limbo-D-K-D-Wrath-K-Wrath-Limbo-I-D-K-D-Wrath-K-Wrath-I-O');\n\n this.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\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#each name as |foo|}}, then {{#each foo as |bar|}}']() {\n let inner = this.createList(['caterpillar']);\n let outer = this.createList([inner.list]);\n\n this.render(`{{#each name key=\"@index\" as |foo|}}{{#each foo as |bar|}}{{bar}}{{/each}}{{/each}}`, {\n name: outer.list\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => {\n inner.delegate.replace(0, 1, ['lady']);\n outer.delegate.pushObject(this.createList(['bird']).list);\n });\n\n this.assertText('ladybird');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', this.createList([this.createList(['caterpillar']).list]).list));\n\n this.assertText('caterpillar');\n }\n }\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with native arrays', class extends EachTest {\n createList(items) {\n return { list: items, delegate: new ArrayDelegate(items, items) };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with emberA-wrapped arrays', class extends EachTest {\n createList(items) {\n let wrapped = (0, _runtime.A)(items);\n return { list: wrapped, delegate: wrapped };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with native Set', class extends EachTest {\n createList(items) {\n let set = makeSet(items);\n return { list: set, delegate: new SetDelegate(set) };\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, _testCase.moduleFor)('Syntax test: {{#each}} with array-like objects implementing forEach', class extends EachTest {\n createList(items) {\n let forEachable = new ForEachable(items);\n return { list: forEachable, delegate: forEachable };\n }\n });\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array-like objects implementing Symbol.iterator', class extends EachTest {\n createList(items) {\n let iterable = new ArrayIterable(items);\n return { list: iterable, delegate: iterable };\n }\n });\n }\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array proxies, modifying itself', class extends EachTest {\n createList(items) {\n let proxty = _runtime.ArrayProxy.create({ content: (0, _runtime.A)(items) });\n return { list: proxty, delegate: proxty };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array proxies, replacing its content', class extends EachTest {\n createList(items) {\n let wrapped = (0, _runtime.A)(items);\n return {\n list: wrapped,\n delegate: _runtime.ArrayProxy.create({ content: wrapped })\n };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each as}} undefined path', class extends _testCase.RenderingTest {\n ['@test keying off of `undefined` does not render']() {\n this.render(_abstractTestCase.strip`\n {{#each foo.bar.baz as |thing|}}\n {{thing}}\n {{/each}}`, { foo: {} });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: ['Here!'] } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with sparse arrays', class extends _testCase.RenderingTest {\n ['@test it should itterate over holes']() {\n let sparseArray = [];\n sparseArray[3] = 'foo';\n sparseArray[4] = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each list as |value key|}}\n [{{key}}:{{value}}]\n {{/each}}`, { list: (0, _runtime.A)(sparseArray) });\n\n this.assertText('[0:][1:][2:][3:foo][4:bar]');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let list = (0, _metal.get)(this.context, 'list');\n list.pushObject('baz');\n });\n\n this.assertText('[0:][1:][2:][3:foo][4:bar][5:baz]');\n }\n });\n\n /* globals MutationObserver: false */\n if (typeof MutationObserver === 'function') {\n (0, _testCase.moduleFor)('Syntax test: {{#each as}} DOM mutation test', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.observer = null;\n }\n\n observe(element) {\n let observer = this.observer = new MutationObserver(function () {});\n observer.observe(element, { childList: true, characterData: true });\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 let page = { title: 'Blog Posts' };\n\n let model = [{ title: 'Rails is omakase' }, { title: 'Ember is omakase' }];\n\n this.render(_abstractTestCase.strip`\n

    {{page.title}}

    \n\n
      \n {{#each model as |post|}}\n
    • {{post.title}}
    • \n {{/each}}\n
    \n `, { page, model });\n\n this.assertHTML(_abstractTestCase.strip`\n

    Blog Posts

    \n\n
      \n
    • Rails is omakase
    • \n
    • Ember is omakase
    • \n
    \n `);\n\n this.observe(this.$('#posts')[0]);\n\n // MutationObserver is async\n return _runtime.RSVP.Promise.resolve(() => {\n this.assertStableRerender();\n }).then(() => {\n this.assertNoMutation();\n\n this.runTask(() => (0, _metal.set)(this.context, 'page', { title: 'Essays' }));\n\n this.assertHTML(_abstractTestCase.strip`\n

    Essays

    \n\n
      \n
    • Rails is omakase
    • \n
    • Ember is omakase
    • \n
    \n `);\n }).then(() => {\n this.assertNoMutation();\n\n this.runTask(() => (0, _metal.set)(this.context.page, 'title', 'Think Pieces™'));\n\n this.assertHTML(_abstractTestCase.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});","enifed('@ember/-internals/glimmer/tests/integration/syntax/experimental-syntax-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer'], function (_testCase, _abstractTestCase, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('registerMacros', class extends _testCase.RenderingTest {\n constructor() {\n let originalMacros = _glimmer._experimentalMacros.slice();\n\n (0, _glimmer._registerMacros)(blocks => {\n blocks.add('-let', (params, hash, _default, inverse, builder) => {\n builder.compileParams(params);\n builder.invokeStaticBlock(_default, params.length);\n });\n });\n\n super(...arguments);\n this.originalMacros = originalMacros;\n }\n\n teardown() {\n _glimmer._experimentalMacros.length = 0;\n this.originalMacros.forEach(macro => _glimmer._experimentalMacros.push(macro));\n\n super.teardown();\n }\n\n ['@test allows registering custom syntax via private API']() {\n this.render(_abstractTestCase.strip`\n {{#-let obj as |bar|}}\n {{bar}}\n {{/-let}}\n `, { obj: 'hello world!' });\n\n this.assertText('hello world!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/if-unless-test', ['@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/runtime', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_helpers, _runtime, _metal, _abstractTestCase, _testCase, _sharedConditionalTests) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#unless}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#unless ${cond}}}${falsy}{{else}}${truthy}{{/unless}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}} and {{#unless}} without inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#if ${cond}}}${truthy}{{/if}}{{#unless ${cond}}}${falsy}{{/unless}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}}', class extends _testCase.RenderingTest {\n ['@test using `if` with an `{{each}}` destroys components when transitioning to and from inverse (GH #12267)'](assert) {\n let destroyedChildrenCount = 0;\n\n this.registerComponent('foo-bar', {\n template: '{{number}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyedChildrenCount++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond}}\n {{#each numbers as |number|}}\n {{foo-bar number=number}}\n {{/each}}\n {{else}}\n Nothing Here!\n {{/if}}`, { cond: true, numbers: (0, _runtime.A)([1, 2, 3]) });\n\n this.assertText('123');\n\n this.runTask(() => this.rerender());\n\n this.assertText('123');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Nothing Here!');\n assert.equal(destroyedChildrenCount, 3, 'the children were properly destroyed');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('123');\n }\n\n ['@test looking up `undefined` property defaults to false']() {\n this.render(_abstractTestCase.strip`\n {{#if foo.bar.baz}}\n Here!\n {{else}}\n Nothing Here!\n {{/if}}`, { foo: {} });\n\n this.assertText('Nothing Here!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nothing Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: true } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('Nothing Here!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/in-element-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer', '@ember/-internals/metal'], function (_testCase, _testHelpers, _abstractTestCase, _glimmer, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('{{-in-element}}', class extends _testCase.RenderingTest {\n ['@test using {{#in-element whatever}} asserts']() {\n // the in-element keyword is not yet public API this test should be removed\n // once https://github.com/emberjs/rfcs/pull/287 lands and is enabled\n\n let el = document.createElement('div');\n expectAssertion(() => {\n this.render(_abstractTestCase.strip`{{#in-element el}}{{/in-element}}`, { el });\n }, /The {{in-element}} helper cannot be used. \\('-top-level' @ L1:C0\\)/);\n }\n\n ['@test allows rendering into an external element']() {\n let someElement = document.createElement('div');\n\n this.render(_abstractTestCase.strip`\n {{#-in-element someElement}}\n {{text}}\n {{/-in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Whoop!');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Huzzah!!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Huzzah!!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Whoop!');\n }\n\n ['@test components are cleaned up properly'](assert) {\n let hooks = [];\n\n let someElement = document.createElement('div');\n\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: `{{text}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#if showModal}}\n {{#-in-element someElement}}\n {{modal-display text=text}}\n {{/-in-element}}\n {{/if}}\n `, {\n someElement,\n text: 'Whoop!',\n showModal: false\n });\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, '');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'showModal', true));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Huzzah!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Huzzah!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'showModal', false));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, '');\n\n assert.deepEqual(hooks, ['didInsertElement', 'willDestroyElement']);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/let-test', ['@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/canary-features'], function (_metal, _runtime, _testCase, _abstractTestCase, _canaryFeatures) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_TEMPLATE_BLOCK_LET_HELPER) {\n (0, _testCase.moduleFor)('Syntax test: {{#let as}}', class extends _testCase.RenderingTest {\n templateFor({ cond, truthy, falsy }) {\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(_abstractTestCase.strip`\n {{#let foo.bar.baz as |thing|}}\n value: \"{{thing}}\"\n {{/let}}`, { foo: {} });\n\n this.assertText('value: \"\"');\n\n this.runTask(() => this.rerender());\n\n this.assertText('value: \"\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: 'Here!' } }));\n\n this.assertText('value: \"Here!\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('value: \"\"');\n }\n\n ['@test it renders the block if arguments are falsey']() {\n this.render(`{{#let cond1 cond2 as |cond|}}value: \"{{cond1}}\"{{/let}}`, {\n cond1: false\n });\n\n this.assertText('value: \"false\"');\n\n this.runTask(() => this.rerender());\n\n this.assertText('value: \"false\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', ''));\n\n this.assertText('value: \"\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', 0));\n\n this.assertText('value: \"0\"');\n }\n\n ['@test it yields multiple arguments in order']() {\n this.render(`{{#let foo bar baz.name as |a b c|}}{{a}} {{b}} {{c}}{{/let}}`, {\n foo: 'Señor Engineer',\n bar: '',\n baz: { name: 'Dale' }\n });\n\n this.assertText('Señor Engineer Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 'Tom'));\n\n this.assertText('Señor Engineer Tom Dale');\n }\n\n ['@test can access alias and original scope']() {\n this.render(`{{#let person as |tom|}}{{title}}: {{tom.name}}{{/let}}`, {\n title: 'Señor Engineer',\n person: { name: 'Tom Dale' }\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person.name', 'Yehuda Katz');\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('Principal Engineer: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'title', 'Señor Engineer');\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n }\n\n ['@test the scoped variable is not available outside the {{#let}} block.']() {\n this.render(`{{name}}-{{#let other as |name|}}{{name}}{{/let}}-{{name}}`, {\n name: 'Stef',\n other: 'Yehuda'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'other', 'Chad'));\n\n this.assertText('Stef-Chad-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Chad-Tom');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'Stef');\n (0, _metal.set)(this.context, 'other', 'Yehuda');\n });\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test can access alias of a proxy']() {\n this.render(`{{#let proxy as |person|}}{{person.name}}{{/let}}`, {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertText('Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Tom Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Yehuda Katz'));\n\n this.assertText('Yehuda Katz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Stefan Penner'));\n\n this.assertText('Stefan Penner');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertText('Tom Dale');\n }\n\n ['@test can access alias of an array']() {\n this.render(`{{#let arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/let}}`, {\n arrayThing: (0, _runtime.A)(['Hello', ' ', 'world'])\n });\n\n this.assertText('Hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello world');\n\n this.runTask(() => {\n let 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\n this.assertText('Goodbye, world!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'arrayThing', ['Hello', ' ', 'world']));\n\n this.assertText('Hello world');\n }\n\n ['@test `attrs` can be used as a block param [GH#14678]']() {\n this.render('{{#let hash as |attrs|}}[{{hash.foo}}-{{attrs.foo}}]{{/let}}', {\n hash: { foo: 'foo' }\n });\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.context.set('hash.foo', 'FOO'));\n\n this.assertText('[FOO-FOO]');\n\n this.runTask(() => this.context.set('hash.foo', 'foo'));\n\n this.assertText('[foo-foo]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: Multiple {{#let as}} helpers', class extends _testCase.RenderingTest {\n ['@test re-using the same variable with different {{#let}} blocks does not override each other']() {\n this.render(`Admin: {{#let admin as |person|}}{{person.name}}{{/let}} User: {{#let user as |person|}}{{person.name}}{{/let}}`, {\n admin: { name: 'Tom Dale' },\n user: { name: 'Yehuda Katz' }\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin.name', 'Godfrey Chan');\n (0, _metal.set)(this.context, 'user.name', 'Stefan Penner');\n });\n\n this.assertText('Admin: Godfrey Chan User: Stefan Penner');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'user', { 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 this.render(`{{ring}}-{{#let first as |ring|}}{{ring}}-{{#let fifth as |ring|}}{{ring}}-{{#let ninth as |ring|}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}`, {\n ring: 'Greed',\n first: 'Limbo',\n fifth: 'Wrath',\n ninth: 'Treachery'\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n (0, _metal.set)(this.context, 'fifth', 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Limbo-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'I');\n (0, _metal.set)(this.context, 'ninth', 'K');\n });\n\n this.assertText('O-I-D-K-D-I-O');\n\n this.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\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 name as |foo|}}{{#let foo as |bar|}}{{bar}}{{/let}}{{/let}}`, {\n name: 'caterpillar'\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'butterfly'));\n\n this.assertText('butterfly');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'caterpillar'));\n\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\n this.assertText('Los Pivots');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Los Pivots');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', \"l'Pivots\"));\n\n this.assertText(\"l'Pivots\");\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Los Pivots'));\n\n this.assertText('Los Pivots');\n }\n\n ['@test nested {{#let}} blocks should have access to root context']() {\n this.render(_abstractTestCase.strip`\n {{name}}\n {{#let committer1.name as |name|}}\n [{{name}}\n {{#let committer2.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n {{#let committer2.name as |name|}}\n [{{name}}\n {{#let committer1.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n `, {\n name: 'ebryn',\n committer1: { name: 'trek' },\n committer2: { name: 'machty' }\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'chancancode'));\n\n this.assertText('chancancode[trek[machty]trek]chancancode[machty[trek]machty]chancancode');\n\n this.runTask(() => (0, _metal.set)(this.context, 'committer1', { name: 'krisselden' }));\n\n this.assertText('chancancode[krisselden[machty]krisselden]chancancode[machty[krisselden]machty]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'committer1.name', 'wycats');\n (0, _metal.set)(this.context, 'committer2', { name: 'rwjblue' });\n });\n\n this.assertText('chancancode[wycats[rwjblue]wycats]chancancode[rwjblue[wycats]rwjblue]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'ebryn');\n (0, _metal.set)(this.context, 'committer1', { name: 'trek' });\n (0, _metal.set)(this.context, 'committer2', { name: 'machty' });\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/with-dynamic-var-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('{{-with-dynamic-var}}', class extends _testCase.RenderingTest {\n ['@test does not allow setting values other than outletState']() {\n expectAssertion(() => {\n this.render(_abstractTestCase.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(_abstractTestCase.strip`\n {{#-with-dynamic-vars outletState=\"bar\"}}\n {{-get-dynamic-var 'outletState'}}\n {{/-with-dynamic-vars}}\n `);\n\n this.assertText('bar');\n }\n\n ['@test does not allow setting 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});","enifed('@ember/-internals/glimmer/tests/integration/syntax/with-test', ['@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_metal, _runtime, _testCase, _sharedConditionalTests, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Syntax test: {{#with}}', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#with ${cond}}}${truthy}{{else}}${falsy}{{/with}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#with as}}', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#with ${cond} as |test|}}${truthy}{{else}}${falsy}{{/with}}`;\n }\n\n ['@test keying off of `undefined` does not render']() {\n this.render(_abstractTestCase.strip`\n {{#with foo.bar.baz as |thing|}}\n {{thing}}\n {{/with}}`, { foo: {} });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: 'Here!' } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n\n ['@test it renders and hides the given block based on the conditional']() {\n this.render(`{{#with cond1 as |cond|}}{{cond.greeting}}{{else}}False{{/with}}`, {\n cond1: { greeting: 'Hello' }\n });\n\n this.assertText('Hello');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.greeting', 'Hello world'));\n\n this.assertText('Hello world');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', false));\n\n this.assertText('False');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', { greeting: 'Hello' }));\n\n this.assertText('Hello');\n }\n\n ['@test can access alias and original scope']() {\n this.render(`{{#with person as |tom|}}{{title}}: {{tom.name}}{{/with}}`, {\n title: 'Señor Engineer',\n person: { name: 'Tom Dale' }\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person.name', 'Yehuda Katz');\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('Principal Engineer: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'title', 'Señor Engineer');\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n }\n\n ['@test the scoped variable is not available outside the {{#with}} block.']() {\n this.render(`{{name}}-{{#with other as |name|}}{{name}}{{/with}}-{{name}}`, {\n name: 'Stef',\n other: 'Yehuda'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'other', 'Chad'));\n\n this.assertText('Stef-Chad-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Chad-Tom');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'Stef');\n (0, _metal.set)(this.context, 'other', 'Yehuda');\n });\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test inverse template is displayed with context']() {\n this.render(`{{#with falsyThing as |thing|}}Has Thing{{else}}No Thing {{otherThing}}{{/with}}`, {\n falsyThing: null,\n otherThing: 'bar'\n });\n\n this.assertText('No Thing bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Thing bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'biz'));\n\n this.assertText('No Thing biz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'falsyThing', true));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'baz'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'otherThing', 'bar');\n (0, _metal.set)(this.context, 'falsyThing', null);\n });\n\n this.assertText('No Thing bar');\n }\n\n ['@test can access alias of a proxy']() {\n this.render(`{{#with proxy as |person|}}{{person.name}}{{/with}}`, {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertText('Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Tom Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Yehuda Katz'));\n\n this.assertText('Yehuda Katz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Stefan Penner'));\n\n this.assertText('Stefan Penner');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertText('Tom Dale');\n }\n\n ['@test can access alias of an array']() {\n this.render(`{{#with arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/with}}`, {\n arrayThing: (0, _runtime.A)(['Hello', ' ', 'world'])\n });\n\n this.assertText('Hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello world');\n\n this.runTask(() => {\n let 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\n this.assertText('Goodbye, world!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'arrayThing', ['Hello', ' ', 'world']));\n\n this.assertText('Hello world');\n }\n\n ['@test `attrs` can be used as a block param [GH#14678]']() {\n this.render('{{#with hash as |attrs|}}[{{hash.foo}}-{{attrs.foo}}]{{/with}}', {\n hash: { foo: 'foo' }\n });\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.context.set('hash.foo', 'FOO'));\n\n this.assertText('[FOO-FOO]');\n\n this.runTask(() => this.context.set('hash.foo', 'foo'));\n\n this.assertText('[foo-foo]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: Multiple {{#with as}} helpers', class extends _testCase.RenderingTest {\n ['@test re-using the same variable with different {{#with}} blocks does not override each other']() {\n this.render(`Admin: {{#with admin as |person|}}{{person.name}}{{/with}} User: {{#with user as |person|}}{{person.name}}{{/with}}`, {\n admin: { name: 'Tom Dale' },\n user: { name: 'Yehuda Katz' }\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin.name', 'Godfrey Chan');\n (0, _metal.set)(this.context, 'user.name', 'Stefan Penner');\n });\n\n this.assertText('Admin: Godfrey Chan User: Stefan Penner');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'user', { 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 {{#with}} block']() {\n this.render(`{{ring}}-{{#with first as |ring|}}{{ring}}-{{#with fifth as |ring|}}{{ring}}-{{#with ninth as |ring|}}{{ring}}-{{/with}}{{ring}}-{{/with}}{{ring}}-{{/with}}{{ring}}`, {\n ring: 'Greed',\n first: 'Limbo',\n fifth: 'Wrath',\n ninth: 'Treachery'\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n (0, _metal.set)(this.context, 'fifth', 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Limbo-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'I');\n (0, _metal.set)(this.context, 'ninth', 'K');\n });\n\n this.assertText('O-I-D-K-D-I-O');\n\n this.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\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#with name as |foo|}}, then {{#with foo as |bar|}}']() {\n this.render(`{{#with name as |foo|}}{{#with foo as |bar|}}{{bar}}{{/with}}{{/with}}`, {\n name: 'caterpillar'\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'butterfly'));\n\n this.assertText('butterfly');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'caterpillar'));\n\n this.assertText('caterpillar');\n }\n\n ['@test updating the context should update the alias']() {\n this.render(`{{#with this as |person|}}{{person.name}}{{/with}}`, {\n name: 'Los Pivots'\n });\n\n this.assertText('Los Pivots');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Los Pivots');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', \"l'Pivots\"));\n\n this.assertText(\"l'Pivots\");\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Los Pivots'));\n\n this.assertText('Los Pivots');\n }\n\n ['@test nested {{#with}} blocks should have access to root context']() {\n this.render(_abstractTestCase.strip`\n {{name}}\n {{#with committer1.name as |name|}}\n [{{name}}\n {{#with committer2.name as |name|}}\n [{{name}}]\n {{/with}}\n {{name}}]\n {{/with}}\n {{name}}\n {{#with committer2.name as |name|}}\n [{{name}}\n {{#with committer1.name as |name|}}\n [{{name}}]\n {{/with}}\n {{name}}]\n {{/with}}\n {{name}}\n `, {\n name: 'ebryn',\n committer1: { name: 'trek' },\n committer2: { name: 'machty' }\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'chancancode'));\n\n this.assertText('chancancode[trek[machty]trek]chancancode[machty[trek]machty]chancancode');\n\n this.runTask(() => (0, _metal.set)(this.context, 'committer1', { name: 'krisselden' }));\n\n this.assertText('chancancode[krisselden[machty]krisselden]chancancode[machty[krisselden]machty]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'committer1.name', 'wycats');\n (0, _metal.set)(this.context, 'committer2', { name: 'rwjblue' });\n });\n\n this.assertText('chancancode[wycats[rwjblue]wycats]chancancode[rwjblue[wycats]rwjblue]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'ebryn');\n (0, _metal.set)(this.context, 'committer1', { name: 'trek' });\n (0, _metal.set)(this.context, 'committer2', { name: 'machty' });\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/unit/outlet-test', ['@ember/-internals/glimmer', '@ember/runloop', 'internal-test-helpers'], function (_glimmer, _runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Glimmer OutletView', class extends _internalTestHelpers.AbstractTestCase {\n ['@test render in the render queue'](assert) {\n let didAppendOutletView = 0;\n let expectedOutlet = '#foo.bar';\n\n let renderer = {\n appendOutletView(view, target) {\n didAppendOutletView++;\n assert.equal(view, outletView);\n assert.equal(target, expectedOutlet);\n }\n };\n\n let outletView = new _glimmer.OutletView({}, renderer);\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\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});","enifed('@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', 'internal-test-helpers'], function (_testCase, _helpers, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('ember-glimmer runtime resolver cache', class extends _testCase.RenderingTest {\n '@test a helper definition is only generated once'(assert) {\n this.registerHelper('foo-bar', () => 'foo-bar helper!');\n this.registerHelper('baz-qux', () => 'baz-qux helper!');\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n this.render(`\n {{~#if cond~}}\n {{foo-bar}}\n {{~else~}}\n {{baz-qux}}\n {{~/if}}`, {\n cond: true\n });\n\n this.assertText('foo-bar helper!');\n state = this.expectCacheChanges({ helperDefinitionCount: 1 }, state, 'calculate foo-bar helper only');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('baz-qux helper!');\n state = this.expectCacheChanges({\n helperDefinitionCount: 1\n }, state, 'calculate baz-qux helper, misses cache');\n\n // show foo-bar again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('foo-bar helper!');\n state = this.expectCacheChanges({}, state, 'toggle back to foo-bar cache hit');\n\n // show baz-qux again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('baz-qux helper!');\n state = this.expectCacheChanges({}, state, 'toggle back to baz-qux cache hit');\n }\n\n '@test a component definition is only generated once'(assert) {\n // static layout\n this.registerComponent('component-one', { template: 'One' });\n this.registerComponent('component-two', {\n ComponentClass: _helpers.Component.extend(),\n template: 'Two'\n });\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n // show component-one for the first time\n this.render(`{{component componentName}}`, {\n componentName: 'component-one'\n });\n\n this.assertText('One');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'test case component and component-one no change');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n\n this.assertText('Two');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'component-two first render');\n\n // show component-one again\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-one'));\n\n this.assertText('One');\n state = this.expectCacheChanges({}, state, 'toggle back to component-one no change');\n\n // show component-two again\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n\n this.assertText('Two');\n state = this.expectCacheChanges({}, state, 'toggle back to component-two no change');\n }\n\n ['@test each template is only compiled once'](assert) {\n // static layout\n this.registerComponent('component-one', { template: 'One' });\n\n // test directly import template factory onto late bound layout\n let Two = _helpers.Component.extend({\n layout: this.compile('Two')\n });\n this.registerComponent('component-two', { ComponentClass: Two });\n\n // inject layout onto component, share layout with component-one\n this.registerComponent('root-component', { ComponentClass: _helpers.Component });\n this.owner.inject('component:root-component', 'layout', 'template:components/component-one');\n\n // template instance shared between to template managers\n let rootFactory = this.owner.factoryFor('component:root-component');\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n // show component-one for the first time\n this.render(`\n {{~#if cond~}}\n {{component-one}}\n {{~else~}}\n {{component-two}}\n {{~/if}}`, {\n cond: true\n });\n\n this.assertText('One');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'test case component and component-one no change');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Two');\n state = this.expectCacheChanges({\n templateCacheMisses: 1,\n componentDefinitionCount: 1\n }, state, 'component-two first render misses template cache');\n\n // show component-one again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('One');\n state = this.expectCacheChanges({}, state, 'toggle back to component-one no change');\n\n // show component-two again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Two');\n state = this.expectCacheChanges({\n templateCacheHits: 1\n }, state, 'toggle back to component-two hits template cache');\n\n // render new root append\n let root = rootFactory.create();\n try {\n (0, _internalTestHelpers.runAppend)(root);\n this.assertText('TwoOne');\n // roots have different capabilities so this will hit\n state = this.expectCacheChanges({}, state, 'append root with component-one no change');\n\n // render new root append\n let root2 = rootFactory.create();\n try {\n (0, _internalTestHelpers.runAppend)(root2);\n this.assertText('TwoOneOne');\n state = this.expectCacheChanges({}, state, '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 let {\n templateCacheHits,\n templateCacheMisses,\n componentDefinitionCount,\n helperDefinitionCount\n } = this.runtimeResolver;\n\n return {\n templateCacheHits,\n templateCacheMisses,\n componentDefinitionCount,\n helperDefinitionCount\n };\n }\n\n expectCacheChanges(expected, lastState, message) {\n let state = this.getCacheCounters();\n let actual = diff(state, lastState);\n this.assert.deepEqual(actual, expected, message);\n return state;\n }\n });\n\n function diff(state, lastState) {\n let res = {};\n Object.keys(state).forEach(key => {\n let delta = state[key] - lastState[key];\n if (delta !== 0) {\n res[key] = state[key] - lastState[key];\n }\n });\n return res;\n }\n});","enifed('@ember/-internals/glimmer/tests/unit/template-factory-test', ['ember-template-compiler', '@ember/-internals/glimmer', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_emberTemplateCompiler, _glimmer, _testCase, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Template factory test', class extends _testCase.RenderingTest {\n ['@test the template factory returned from precompile is the same as compile'](assert) {\n let { owner } = this;\n let { runtimeResolver } = this;\n\n let templateStr = 'Hello {{name}}';\n let options = { moduleName: 'my-app/templates/some-module.hbs' };\n\n let spec = (0, _emberTemplateCompiler.precompile)(templateStr, options);\n let body = `exports.default = template(${spec});`;\n let module = new Function('exports', 'template', body);\n let exports = {};\n module(exports, _glimmer.template);\n let Precompiled = exports['default'];\n\n let Compiled = (0, _emberTemplateCompiler.compile)(templateStr, options);\n\n assert.equal(typeof Precompiled.create, 'function', 'precompiled is a factory');\n assert.ok(Precompiled.id, 'precompiled has id');\n\n assert.equal(typeof Compiled.create, 'function', 'compiled is a factory');\n assert.ok(Compiled.id, 'compiled has id');\n\n assert.equal(runtimeResolver.templateCacheMisses, 0, 'misses 0');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n let precompiled = runtimeResolver.createTemplate(Precompiled, owner);\n\n assert.equal(runtimeResolver.templateCacheMisses, 1, 'misses 1');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n let compiled = runtimeResolver.createTemplate(Compiled, owner);\n\n assert.equal(runtimeResolver.templateCacheMisses, 2, 'misses 2');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n assert.ok(typeof precompiled.spec !== 'string', 'Spec has been parsed');\n assert.ok(typeof compiled.spec !== 'string', 'Spec has been parsed');\n\n this.registerComponent('x-precompiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Precompiled\n })\n });\n\n this.registerComponent('x-compiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Compiled\n })\n });\n\n this.render('{{x-precompiled name=\"precompiled\"}} {{x-compiled name=\"compiled\"}}');\n\n assert.equal(runtimeResolver.templateCacheMisses, 2, 'misses 2');\n assert.equal(runtimeResolver.templateCacheHits, 2, 'hits 2');\n\n this.assertText('Hello precompiled Hello compiled');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/unit/utils/debug-stack-test', ['@ember/-internals/glimmer', '@glimmer/env', 'internal-test-helpers'], function (_glimmer, _env, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Glimmer DebugStack', class extends _internalTestHelpers.AbstractTestCase {\n ['@test pushing and popping'](assert) {\n if (_env.DEBUG) {\n let stack = new _glimmer.DebugStack();\n\n assert.equal(stack.peek(), undefined);\n\n stack.push('template:application');\n\n assert.equal(stack.peek(), '\"template:application\"');\n\n stack.push('component:top-level-component');\n\n assert.equal(stack.peek(), '\"component:top-level-component\"');\n\n stack.pushEngine('engine:my-engine');\n stack.push('component:component-in-engine');\n\n assert.equal(stack.peek(), '\"component:component-in-engine\" (in \"engine:my-engine\")');\n\n stack.pop();\n stack.pop();\n let item = stack.pop();\n\n assert.equal(item, 'component:top-level-component');\n assert.equal(stack.peek(), '\"template:application\"');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/abstract-test-case', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'TestCase', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.AbstractTestCase;\n }\n });\n Object.defineProperty(exports, 'applyMixins', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.applyMixins;\n }\n });\n Object.defineProperty(exports, 'strip', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.strip;\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/helpers', ['exports', 'ember-template-compiler', '@ember/-internals/glimmer'], function (exports, _emberTemplateCompiler, _glimmer) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'compile', {\n enumerable: true,\n get: function () {\n return _emberTemplateCompiler.compile;\n }\n });\n Object.defineProperty(exports, 'precompile', {\n enumerable: true,\n get: function () {\n return _emberTemplateCompiler.precompile;\n }\n });\n Object.defineProperty(exports, 'INVOKE', {\n enumerable: true,\n get: function () {\n return _glimmer.INVOKE;\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, 'LinkComponent', {\n enumerable: true,\n get: function () {\n return _glimmer.LinkComponent;\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});","enifed('@ember/-internals/glimmer/tests/utils/shared-conditional-tests', ['exports', '@ember/polyfills', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers'], function (exports, _polyfills, _abstractTestCase, _testCase, _metal, _runtime, _helpers) {\n 'use strict';\n\n exports.__esModule = true;\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 = undefined;\n\n\n class AbstractConditionalsTest extends _testCase.RenderingTest {\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\n /* abstract */\n templateFor() /* { cond, truthy, falsy } */{\n // e.g. `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`\n throw new Error('Not implemented: `templateFor`');\n }\n\n /* abstract */\n renderValues() /* ...values */{\n throw new Error('Not implemented: `renderValues`');\n }\n }\n\n class AbstractGenerator {\n constructor(cases) {\n this.cases = cases;\n }\n\n /* abstract */\n generate() /* value, idx */{\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 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\n this.assertText('T1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('T1');\n }\n };\n }\n }\n\n exports.TruthyGenerator = TruthyGenerator;\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\n this.assertText('F1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('F1');\n }\n };\n }\n }\n\n exports.FalsyGenerator = FalsyGenerator;\n class StableTruthyGenerator extends TruthyGenerator {\n generate(value, idx) {\n return (0, _polyfills.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\n this.assertText('T1');\n\n this.takeSnapshot();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n\n this.assertText('T1');\n\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('T1');\n\n this.assertInvariants();\n }\n });\n }\n }\n\n exports.StableTruthyGenerator = StableTruthyGenerator;\n class StableFalsyGenerator extends FalsyGenerator {\n generate(value, idx) {\n return (0, _polyfills.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\n this.assertText('F1');\n\n this.takeSnapshot();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1');\n\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('F1');\n\n this.assertInvariants();\n }\n });\n }\n }\n\n exports.StableFalsyGenerator = StableFalsyGenerator;\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({ content: value }));\n\n this.assertText('T1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.content', this.falsyValue));\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ content: value })));\n\n this.assertText('T1');\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({ content: value }));\n\n this.assertText('F1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.content', this.truthyValue));\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ 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 // {{#with}}, {{#each}}, {{#each-in}}, (if) and (unless)\n class BasicConditionalsTest extends AbstractConditionalsTest {\n ['@test it renders the corresponding block based on the conditional']() {\n this.renderValues(this.truthyValue, this.falsyValue);\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n }\n\n exports.BasicConditionalsTest = BasicConditionalsTest;\n // Testing behaviors related to ember objects, object proxies, etc\n const ObjectTestCases = exports.ObjectTestCases = {\n ['@test it considers object proxies without content falsy']() {\n this.renderValues(_runtime.ObjectProxy.create({ content: {} }), _runtime.ObjectProxy.create({ content: _runtime.Object.create() }), _runtime.ObjectProxy.create({ content: null }));\n\n this.assertText('T1T2F3');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1T2F3');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n\n this.assertText('F1F2F3');\n\n this.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', { foo: 'bar' });\n });\n\n this.assertText('T1T2T3');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ content: {} }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ObjectProxy.create({ content: _runtime.Object.create() }));\n (0, _metal.set)(this.context, 'cond3', _runtime.ObjectProxy.create({ content: null }));\n });\n\n this.assertText('T1T2F3');\n }\n };\n\n // Testing behaviors related to arrays and array proxies\n const ArrayTestCases = exports.ArrayTestCases = {\n ['@test it considers empty arrays falsy']() {\n this.renderValues((0, _runtime.A)(['hello']), (0, _runtime.A)());\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1'), 0));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.get)(this.context, 'cond1').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2').pushObjects([1]);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', (0, _runtime.A)(['hello']));\n (0, _metal.set)(this.context, 'cond2', (0, _runtime.A)());\n });\n\n this.assertText('T1F2');\n },\n\n ['@test it considers array proxies without content falsy']() {\n this.renderValues(_runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }), _runtime.ArrayProxy.create({ content: null }));\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n\n this.assertText('F1F2');\n\n this.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\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({ 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({ content: (0, _runtime.A)(['hello']) }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)() }));\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1.content'), 0));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.get)(this.context, 'cond1.content').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2.content').pushObjects([1]);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({ content: (0, _runtime.A)() }));\n });\n\n this.assertText('T1F2');\n }\n };\n\n const IfUnlessWithTestCases = [new StableTruthyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), {}, { foo: 'bar' }, _runtime.Object.create(), _runtime.Object.create({ foo: 'bar' }), _runtime.ObjectProxy.create({ content: true }), Object, function () {},\n /*jshint -W053 */\n new String('hello'), new String(''), new Boolean(true), new Boolean(false),\n /*jshint +W053 */\n new Date()]), new StableFalsyGenerator([false, null, undefined, '', 0, [], (0, _runtime.A)(), _runtime.ObjectProxy.create({ content: undefined })]), new ObjectProxyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), _runtime.ArrayProxy.create({ content: ['hello'] }), _runtime.ArrayProxy.create({ content: [] }), {}, { foo: 'bar' }, _runtime.Object.create(), _runtime.Object.create({ foo: 'bar' }), _runtime.ObjectProxy.create({ content: true }), _runtime.ObjectProxy.create({ content: undefined }),\n /*jshint -W053 */\n new String('hello'), new String(''), new Boolean(true), new Boolean(false),\n /*jshint +W053 */\n new Date(), false, null, undefined, '', 0, [], (0, _runtime.A)()]), ObjectTestCases, ArrayTestCases];\n\n // Testing behaviors shared across the \"toggling\" conditionals, i.e. {{#if}},\n // {{#unless}}, {{#with}}, {{#each}}, {{#each-in}}, (if) and (unless)\n class TogglingConditionalsTest extends BasicConditionalsTest {}\n\n exports.TogglingConditionalsTest = TogglingConditionalsTest;\n // Testing behaviors shared across the (if) and (unless) helpers\n class TogglingHelperConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n let templates = [];\n let context = {};\n\n for (let i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({ cond: `cond${i}`, truthy: `t${i}`, falsy: `f${i}` }));\n context[`t${i}`] = `T${i}`;\n context[`f${i}`] = `F${i}`;\n context[`cond${i}`] = values[i - 1];\n }\n\n let wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, context);\n }\n\n ['@test it has access to the outer scope from both templates']() {\n let template = this.wrapperFor([this.templateFor({ cond: 'cond1', truthy: 'truthy', falsy: 'falsy' }), this.templateFor({ cond: 'cond2', truthy: 'truthy', falsy: 'falsy' })]);\n\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n\n this.assertText('YESNO');\n\n this.runTask(() => this.rerender());\n\n this.assertText('YESNO');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n\n this.assertText('YASSNOPE');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('NOPEYASS');\n\n this.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\n this.assertText('YESNO');\n }\n\n ['@test it does not update when the unbound helper is used']() {\n let template = this.wrapperFor([this.templateFor({\n cond: '(unbound cond1)',\n truthy: '\"T1\"',\n falsy: '\"F1\"'\n }), this.templateFor({\n cond: '(unbound cond2)',\n truthy: '\"T2\"',\n falsy: '\"F2\"'\n })]);\n\n this.render(template, { cond1: this.truthyValue, cond2: this.falsyValue });\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n\n ['@test evaluation should be lazy'](assert) {\n let truthyEvaluated;\n let falsyEvaluated;\n\n let withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n let 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 let template = this.wrappedTemplateFor({\n cond: 'cond',\n truthy: '(x-truthy)',\n falsy: '(x-falsy)'\n });\n\n withoutEvaluatingFalsy(() => this.render(template, { cond: this.truthyValue }));\n\n this.assertText('T');\n\n withoutEvaluatingFalsy(() => this.runTask(() => this.rerender()));\n\n this.assertText('T');\n\n withoutEvaluatingTruthy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n\n this.assertText('F');\n\n withoutEvaluatingTruthy(() => this.runTask(() => this.rerender()));\n\n this.assertText('F');\n\n withoutEvaluatingFalsy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n\n this.assertText('T');\n }\n }\n\n exports.TogglingHelperConditionalsTest = TogglingHelperConditionalsTest;\n class IfUnlessHelperTest extends TogglingHelperConditionalsTest {}\n\n exports.IfUnlessHelperTest = IfUnlessHelperTest;\n (0, _abstractTestCase.applyMixins)(IfUnlessHelperTest, ...IfUnlessWithTestCases);\n\n // Testing behaviors shared across the \"toggling\" syntatical constructs,\n // i.e. {{#if}}, {{#unless}}, {{#with}}, {{#each}} and {{#each-in}}\n class TogglingSyntaxConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n let templates = [];\n let context = {};\n\n for (let i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({\n cond: `cond${i}`,\n truthy: `{{t}}${i}`,\n falsy: `{{f}}${i}`\n }));\n context[`cond${i}`] = values[i - 1];\n }\n\n let wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, (0, _polyfills.assign)({ t: 'T', f: 'F' }, context));\n }\n\n ['@test it does not update when the unbound helper is used']() {\n let template = `${this.templateFor({\n cond: '(unbound cond1)',\n truthy: 'T1',\n falsy: 'F1'\n })}${this.templateFor({\n cond: '(unbound cond2)',\n truthy: 'T2',\n falsy: 'F2'\n })}`;\n\n this.render(template, { cond1: this.truthyValue, cond2: this.falsyValue });\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n\n ['@test it has access to the outer scope from both templates']() {\n let template = this.wrapperFor([this.templateFor({\n cond: 'cond1',\n truthy: '{{truthy}}',\n falsy: '{{falsy}}'\n }), this.templateFor({\n cond: 'cond2',\n truthy: '{{truthy}}',\n falsy: '{{falsy}}'\n })]);\n\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n\n this.assertText('YESNO');\n\n this.runTask(() => this.rerender());\n\n this.assertText('YESNO');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n\n this.assertText('YASSNOPE');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('NOPEYASS');\n\n this.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\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 let inner = this.templateFor({\n cond: 'inner',\n truthy: 'T-inner',\n falsy: 'F-inner'\n });\n let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: inner,\n falsy: 'F-outer'\n });\n\n this.render(template, { outer: this.truthyValue, inner: this.truthyValue });\n\n this.assertText('T-inner');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T-inner');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', this.falsyValue));\n\n this.assertText('F-inner');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\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 let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: '{{#each inner as |text|}}{{text}}{{/each}}',\n falsy: 'F-outer'\n });\n\n this.render(template, {\n outer: this.truthyValue,\n inner: ['inner', '-', 'before']\n });\n\n this.assertText('inner-before');\n\n this.runTask(() => this.rerender());\n\n this.assertText('inner-before');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', ['inner-after']));\n\n this.assertText('inner-after');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n\n // Reset\n this.runTask(() => {\n (0, _metal.set)(this.context, 'inner', ['inner-again']);\n (0, _metal.set)(this.context, 'outer', this.truthyValue);\n });\n\n this.assertText('inner-again');\n\n // Now clear the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', []));\n\n this.assertText('');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\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 let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: '{{{inner}}}',\n falsy: 'F-outer'\n });\n\n this.render(template, {\n outer: this.truthyValue,\n inner: 'inner-before'\n });\n\n this.assertText('inner-before');\n\n this.runTask(() => this.rerender());\n\n this.assertText('inner-before');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', '

    inner-after

    '));\n\n this.assertText('inner-after');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n }\n\n ['@test child conditional should not render children if parent conditional becomes false'](assert) {\n let childCreated = false;\n\n this.registerComponent('foo-bar', {\n template: 'foo-bar',\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n childCreated = true;\n }\n })\n });\n\n let innerTemplate = this.templateFor({\n cond: 'cond2',\n truthy: '{{foo-bar}}',\n falsy: ''\n });\n let wrappedTemplate = this.wrappedTemplateFor({\n cond: 'cond1',\n truthy: innerTemplate,\n falsy: ''\n });\n\n this.render(wrappedTemplate, {\n cond1: this.truthyValue,\n cond2: this.falsyValue\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n }\n\n ['@test evaluation should be lazy'](assert) {\n let truthyEvaluated;\n let falsyEvaluated;\n\n let withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n let 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 let template = this.wrappedTemplateFor({\n cond: 'cond',\n truthy: '{{x-truthy}}',\n falsy: '{{x-falsy}}'\n });\n\n withoutEvaluatingFalsy(() => this.render(template, { cond: this.truthyValue }));\n\n this.assertText('T');\n\n withoutEvaluatingFalsy(() => this.runTask(() => this.rerender()));\n\n this.assertText('T');\n\n withoutEvaluatingTruthy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n\n this.assertText('F');\n\n withoutEvaluatingTruthy(() => this.runTask(() => this.rerender()));\n\n this.assertText('F');\n\n withoutEvaluatingFalsy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n\n this.assertText('T');\n }\n }\n\n exports.TogglingSyntaxConditionalsTest = TogglingSyntaxConditionalsTest;\n class IfUnlessWithSyntaxTest extends TogglingSyntaxConditionalsTest {}\n\n exports.IfUnlessWithSyntaxTest = IfUnlessWithSyntaxTest;\n (0, _abstractTestCase.applyMixins)(IfUnlessWithSyntaxTest, ...IfUnlessWithTestCases);\n});","enifed('@ember/-internals/glimmer/tests/utils/string-test', ['@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case'], function (_helpers, _abstractTestCase, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('SafeString', class extends _abstractTestCase.TestCase {\n ['@test htmlSafe should return an instance of SafeString']() {\n let safeString = (0, _helpers.htmlSafe)('you need to be more bold');\n\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 let safeString = (0, _helpers.htmlSafe)(null);\n\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']() {\n let safeString = (0, _helpers.htmlSafe)();\n\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, _testCase.moduleFor)('SafeString isHTMLSafe', class extends _abstractTestCase.TestCase {\n ['@test isHTMLSafe should detect SafeString']() {\n let safeString = (0, _helpers.htmlSafe)('Emphasize the important things.');\n\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});","enifed('@ember/-internals/glimmer/tests/utils/test-case', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'TestCase', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.AbstractTestCase;\n }\n });\n Object.defineProperty(exports, 'ApplicationTest', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.ApplicationTestCase;\n }\n });\n Object.defineProperty(exports, 'RenderingTest', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.RenderingTestCase;\n }\n });\n Object.defineProperty(exports, 'moduleFor', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.moduleFor;\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/test-helpers', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'styles', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.styles;\n }\n });\n Object.defineProperty(exports, 'classes', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.classes;\n }\n });\n Object.defineProperty(exports, 'equalTokens', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.equalTokens;\n }\n });\n Object.defineProperty(exports, 'equalsElement', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.equalsElement;\n }\n });\n});","enifed('@ember/-internals/meta/index', ['exports', '@ember/-internals/meta/lib/meta'], function (exports, _meta) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'counters', {\n enumerable: true,\n get: function () {\n return _meta.counters;\n }\n });\n Object.defineProperty(exports, 'deleteMeta', {\n enumerable: true,\n get: function () {\n return _meta.deleteMeta;\n }\n });\n Object.defineProperty(exports, 'descriptorFor', {\n enumerable: true,\n get: function () {\n return _meta.descriptorFor;\n }\n });\n Object.defineProperty(exports, 'isDescriptor', {\n enumerable: true,\n get: function () {\n return _meta.isDescriptor;\n }\n });\n Object.defineProperty(exports, 'Meta', {\n enumerable: true,\n get: function () {\n return _meta.Meta;\n }\n });\n Object.defineProperty(exports, 'meta', {\n enumerable: true,\n get: function () {\n return _meta.meta;\n }\n });\n Object.defineProperty(exports, 'peekMeta', {\n enumerable: true,\n get: function () {\n return _meta.peekMeta;\n }\n });\n Object.defineProperty(exports, 'setMeta', {\n enumerable: true,\n get: function () {\n return _meta.setMeta;\n }\n });\n Object.defineProperty(exports, 'UNDEFINED', {\n enumerable: true,\n get: function () {\n return _meta.UNDEFINED;\n }\n });\n});","enifed('@ember/-internals/meta/lib/meta', ['exports', '@ember/-internals/utils', '@ember/debug', '@glimmer/env'], function (exports, _utils, _debug, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.counters = exports.meta = exports.Meta = exports.UNDEFINED = undefined;\n exports.setMeta = setMeta;\n exports.peekMeta = peekMeta;\n exports.deleteMeta = deleteMeta;\n exports.descriptorFor = descriptorFor;\n exports.isDescriptor = isDescriptor;\n\n const objectPrototype = Object.prototype;\n let counters;\n if (_env.DEBUG) {\n exports.counters = counters = {\n peekCalls: 0,\n peekPrototypeWalks: 0,\n setCalls: 0,\n deleteCalls: 0,\n metaCalls: 0,\n metaInstantiated: 0,\n matchingListenersCalls: 0,\n addToListenersCalls: 0,\n removeFromListenersCalls: 0,\n removeAllListenersCalls: 0,\n listenersInherited: 0,\n listenersFlattened: 0,\n parentListenersUsed: 0,\n flattenedListenersCalls: 0,\n reopensAfterFlatten: 0\n };\n }\n /**\n @module ember\n */\n const UNDEFINED = exports.UNDEFINED = (0, _utils.symbol)('undefined');\n let currentListenerVersion = 1;\n class Meta {\n constructor(obj) {\n this._listenersVersion = 1;\n this._inheritedEnd = -1;\n this._flattenedVersion = 0;\n if (_env.DEBUG) {\n counters.metaInstantiated++;\n this._values = undefined;\n }\n this._parent = undefined;\n this._descriptors = undefined;\n this._watching = undefined;\n this._mixins = undefined;\n this._deps = undefined;\n this._chainWatchers = undefined;\n this._chains = undefined;\n this._tag = undefined;\n this._tags = undefined;\n // initial value for all flags right now is false\n // see FLAGS const for detailed list of flags used\n this._flags = 0 /* NONE */;\n // used only internally\n this.source = obj;\n this.proto = obj.constructor === undefined ? undefined : obj.constructor.prototype;\n this._listeners = undefined;\n }\n get parent() {\n let parent = this._parent;\n if (parent === undefined) {\n let proto = getPrototypeOf(this.source);\n this._parent = parent = proto === null || proto === objectPrototype ? null : meta(proto);\n }\n return parent;\n }\n setInitializing() {\n this._flags |= 8 /* INITIALIZING */;\n }\n unsetInitializing() {\n this._flags ^= 8 /* INITIALIZING */;\n }\n isInitializing() {\n return this._hasFlag(8 /* INITIALIZING */);\n }\n isPrototypeMeta(obj) {\n return this.proto === this.source && this.source === obj;\n }\n destroy() {\n if (this.isMetaDestroyed()) {\n return;\n }\n this.setMetaDestroyed();\n // remove chainWatchers to remove circular references that would prevent GC\n let chains = this.readableChains();\n if (chains !== undefined) {\n chains.destroy();\n }\n }\n isSourceDestroying() {\n return this._hasFlag(1 /* SOURCE_DESTROYING */);\n }\n setSourceDestroying() {\n this._flags |= 1 /* SOURCE_DESTROYING */;\n }\n isSourceDestroyed() {\n return this._hasFlag(2 /* SOURCE_DESTROYED */);\n }\n setSourceDestroyed() {\n this._flags |= 2 /* SOURCE_DESTROYED */;\n }\n isMetaDestroyed() {\n return this._hasFlag(4 /* META_DESTROYED */);\n }\n setMetaDestroyed() {\n this._flags |= 4 /* META_DESTROYED */;\n }\n _hasFlag(flag) {\n return (this._flags & flag) === flag;\n }\n _getOrCreateOwnMap(key) {\n return this[key] || (this[key] = Object.create(null));\n }\n _getOrCreateOwnSet(key) {\n return this[key] || (this[key] = new Set());\n }\n _findInherited1(key) {\n let pointer = this;\n while (pointer !== null) {\n let map = pointer[key];\n if (map !== undefined) {\n return map;\n }\n pointer = pointer.parent;\n }\n }\n _findInherited2(key, subkey) {\n let pointer = this;\n while (pointer !== null) {\n let map = pointer[key];\n if (map !== undefined) {\n let value = map[subkey];\n if (value !== undefined) {\n return value;\n }\n }\n pointer = pointer.parent;\n }\n }\n _findInherited3(key, subkey, subsubkey) {\n let pointer = this;\n while (pointer !== null) {\n let map = pointer[key];\n if (map !== undefined) {\n let submap = map[subkey];\n if (submap !== undefined) {\n let value = submap[subsubkey];\n if (value !== undefined) {\n return value;\n }\n }\n }\n pointer = pointer.parent;\n }\n }\n _hasInInheritedSet(key, value) {\n let pointer = this;\n while (pointer !== null) {\n let set = pointer[key];\n if (set !== undefined && set.has(value)) {\n return true;\n }\n pointer = pointer.parent;\n }\n return false;\n }\n // Implements a member that provides a lazily created map of maps,\n // with inheritance at both levels.\n writeDeps(subkey, itemkey, count) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot modify dependent keys for \\`${itemkey}\\` on \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let outerMap = this._getOrCreateOwnMap('_deps');\n let innerMap = outerMap[subkey];\n if (innerMap === undefined) {\n innerMap = outerMap[subkey] = Object.create(null);\n }\n innerMap[itemkey] = count;\n }\n peekDeps(subkey, itemkey) {\n let val = this._findInherited3('_deps', subkey, itemkey);\n return val === undefined ? 0 : val;\n }\n hasDeps(subkey) {\n let val = this._findInherited2('_deps', subkey);\n return val !== undefined;\n }\n forEachInDeps(subkey, fn) {\n let pointer = this;\n let seen;\n let calls;\n while (pointer !== null) {\n let map = pointer._deps;\n if (map !== undefined) {\n let innerMap = map[subkey];\n if (innerMap !== undefined) {\n for (let innerKey in innerMap) {\n seen = seen === undefined ? new Set() : seen;\n if (!seen.has(innerKey)) {\n seen.add(innerKey);\n if (innerMap[innerKey] > 0) {\n calls = calls || [];\n calls.push(innerKey);\n }\n }\n }\n }\n }\n pointer = pointer.parent;\n }\n if (calls !== undefined) {\n for (let i = 0; i < calls.length; i++) {\n fn(calls[i]);\n }\n }\n }\n writableTags() {\n return this._getOrCreateOwnMap('_tags');\n }\n readableTags() {\n return this._tags;\n }\n writableTag(create) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot create a new tag for \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let ret = this._tag;\n if (ret === undefined) {\n ret = this._tag = create(this.source);\n }\n return ret;\n }\n readableTag() {\n return this._tag;\n }\n writableChainWatchers(create) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot create a new chain watcher for \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let ret = this._chainWatchers;\n if (ret === undefined) {\n ret = this._chainWatchers = create(this.source);\n }\n return ret;\n }\n readableChainWatchers() {\n return this._chainWatchers;\n }\n writableChains(create) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot create a new chains for \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let { _chains: ret } = this;\n if (ret === undefined) {\n this._chains = ret = create(this.source);\n let { parent } = this;\n if (parent !== null) {\n let parentChains = parent.writableChains(create);\n parentChains.copyTo(ret);\n }\n }\n return ret;\n }\n readableChains() {\n return this._findInherited1('_chains');\n }\n writeWatching(subkey, value) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot update watchers for \\`${subkey}\\` on \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let map = this._getOrCreateOwnMap('_watching');\n map[subkey] = value;\n }\n peekWatching(subkey) {\n let count = this._findInherited2('_watching', subkey);\n return count === undefined ? 0 : count;\n }\n addMixin(mixin) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot add mixins of \\`${(0, _utils.toString)(mixin)}\\` on \\`${(0, _utils.toString)(this.source)}\\` call addMixin after it has been destroyed.` : '', !this.isMetaDestroyed());\n let set = this._getOrCreateOwnSet('_mixins');\n set.add(mixin);\n }\n hasMixin(mixin) {\n return this._hasInInheritedSet('_mixins', mixin);\n }\n forEachMixins(fn) {\n let pointer = this;\n let seen;\n while (pointer !== null) {\n let set = pointer._mixins;\n if (set !== undefined) {\n seen = seen === undefined ? new Set() : seen;\n // TODO cleanup typing here\n set.forEach(mixin => {\n if (!seen.has(mixin)) {\n seen.add(mixin);\n fn(mixin);\n }\n });\n }\n pointer = pointer.parent;\n }\n }\n writeDescriptors(subkey, value) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot update descriptors for \\`${subkey}\\` on \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let map = this._getOrCreateOwnMap('_descriptors');\n map[subkey] = value;\n }\n peekDescriptors(subkey) {\n let possibleDesc = this._findInherited2('_descriptors', subkey);\n return possibleDesc === UNDEFINED ? undefined : possibleDesc;\n }\n removeDescriptors(subkey) {\n this.writeDescriptors(subkey, UNDEFINED);\n }\n forEachDescriptors(fn) {\n let pointer = this;\n let seen;\n while (pointer !== null) {\n let map = pointer._descriptors;\n if (map !== undefined) {\n for (let key in map) {\n seen = seen === undefined ? new Set() : seen;\n if (!seen.has(key)) {\n seen.add(key);\n let value = map[key];\n if (value !== UNDEFINED) {\n fn(key, value);\n }\n }\n }\n }\n pointer = pointer.parent;\n }\n }\n addToListeners(eventName, target, method, once) {\n if (_env.DEBUG) {\n counters.addToListenersCalls++;\n }\n this.pushListener(eventName, target, method, once ? 1 /* ONCE */ : 0 /* ADD */);\n }\n removeFromListeners(eventName, target, method) {\n if (_env.DEBUG) {\n counters.removeFromListenersCalls++;\n }\n this.pushListener(eventName, target, method, 2 /* REMOVE */);\n }\n removeAllListeners(event) {\n (0, _debug.deprecate)('The remove all functionality of removeListener and removeObserver has been deprecated. Remove each listener/observer individually instead.', false, {\n id: 'events.remove-all-listeners',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_events-remove-all-listeners'\n });\n if (_env.DEBUG) {\n counters.removeAllListenersCalls++;\n }\n let listeners = this.writableListeners();\n let inheritedEnd = this._inheritedEnd;\n // remove all listeners of event name\n // adjusting the inheritedEnd if listener is below it\n for (let i = listeners.length - 1; i >= 0; i--) {\n let listener = listeners[i];\n if (listener.event === event) {\n listeners.splice(i, 1);\n if (i < inheritedEnd) {\n inheritedEnd--;\n }\n }\n }\n this._inheritedEnd = inheritedEnd;\n // we put remove alls at start because rare and easy to check there\n listeners.splice(inheritedEnd, 0, {\n event,\n target: null,\n method: null,\n kind: 3 /* REMOVE_ALL */\n });\n }\n pushListener(event, target, method, kind) {\n let listeners = this.writableListeners();\n let i = indexOfListener(listeners, event, target, method);\n // remove if found listener was inherited\n if (i !== -1 && i < this._inheritedEnd) {\n listeners.splice(i, 1);\n this._inheritedEnd--;\n i = -1;\n }\n // if not found, push. Note that we must always push if a listener is not\n // found, even in the case of a function listener remove, because we may be\n // attempting to add or remove listeners _before_ flattening has occured.\n if (i === -1) {\n (0, _debug.deprecate)('Adding function listeners to prototypes has been deprecated. Convert the listener to a string listener, or add it to the instance instead.', !(this.isPrototypeMeta(this.source) && typeof method === 'function'), {\n id: 'events.inherited-function-listeners',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_events-inherited-function-listeners'\n });\n (0, _debug.deprecate)('You attempted to remove a function listener which did not exist on the instance, which means it was an inherited prototype listener, or you attempted to remove it before it was added. Prototype function listeners have been deprecated, and attempting to remove a non-existent function listener this will error in the future.', !(!this.isPrototypeMeta(this.source) && typeof method === 'function' && kind === 2 /* REMOVE */), {\n id: 'events.inherited-function-listeners',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_events-inherited-function-listeners'\n });\n listeners.push({\n event,\n target,\n method,\n kind\n });\n } else {\n let listener = listeners[i];\n // If the listener is our own function listener and we are trying to\n // remove it, we want to splice it out entirely so we don't hold onto a\n // reference.\n if (kind === 2 /* REMOVE */ && listener.kind !== 2 /* REMOVE */ && typeof method === 'function') {\n listeners.splice(i, 1);\n } else {\n // update own listener\n listener.kind = kind;\n // TODO: Remove this when removing REMOVE_ALL, it won't be necessary\n listener.target = target;\n listener.method = method;\n }\n }\n }\n writableListeners() {\n // Check if we need to invalidate and reflatten. We need to do this if we\n // have already flattened (flattened version is the current version) and\n // we are either writing to a prototype meta OR we have never inherited, and\n // may have cached the parent's listeners.\n if (this._flattenedVersion === currentListenerVersion && (this.source === this.proto || this._inheritedEnd === -1)) {\n if (_env.DEBUG) {\n counters.reopensAfterFlatten++;\n }\n currentListenerVersion++;\n }\n // Inherited end has not been set, then we have never created our own\n // listeners, but may have cached the parent's\n if (this._inheritedEnd === -1) {\n this._inheritedEnd = 0;\n this._listeners = [];\n }\n return this._listeners;\n }\n /**\n Flattening is based on a global revision counter. If the revision has\n bumped it means that somewhere in a class inheritance chain something has\n changed, so we need to reflatten everything. This can only happen if:\n 1. A meta has been flattened (listener has been called)\n 2. The meta is a prototype meta with children who have inherited its\n listeners\n 3. A new listener is subsequently added to the meta (e.g. via `.reopen()`)\n This is a very rare occurence, so while the counter is global it shouldn't\n be updated very often in practice.\n */\n flattenedListeners() {\n if (_env.DEBUG) {\n counters.flattenedListenersCalls++;\n }\n if (this._flattenedVersion < currentListenerVersion) {\n if (_env.DEBUG) {\n counters.listenersFlattened++;\n }\n let parent = this.parent;\n if (parent !== null) {\n // compute\n let parentListeners = parent.flattenedListeners();\n if (parentListeners !== undefined) {\n if (this._listeners === undefined) {\n // If this instance doesn't have any of its own listeners (writableListeners\n // has never been called) then we don't need to do any flattening, return\n // the parent's listeners instead.\n if (_env.DEBUG) {\n counters.parentListenersUsed++;\n }\n this._listeners = parentListeners;\n } else {\n let listeners = this._listeners;\n if (this._inheritedEnd > 0) {\n listeners.splice(0, this._inheritedEnd);\n this._inheritedEnd = 0;\n }\n for (let i = 0; i < parentListeners.length; i++) {\n let listener = parentListeners[i];\n let index = indexOfListener(listeners, listener.event, listener.target, listener.method);\n if (index === -1) {\n if (_env.DEBUG) {\n counters.listenersInherited++;\n }\n listeners.unshift(listener);\n this._inheritedEnd++;\n }\n }\n }\n }\n }\n this._flattenedVersion = currentListenerVersion;\n }\n return this._listeners;\n }\n matchingListeners(eventName) {\n let listeners = this.flattenedListeners();\n let result;\n if (_env.DEBUG) {\n counters.matchingListenersCalls++;\n }\n if (listeners !== undefined) {\n for (let index = 0; index < listeners.length; index++) {\n let listener = listeners[index];\n // REMOVE and REMOVE_ALL listeners are placeholders that tell us not to\n // inherit, so they never match. Only ADD and ONCE can match.\n if (listener.event === eventName && (listener.kind === 0 /* ADD */ || listener.kind === 1 /* ONCE */)) {\n if (result === undefined) {\n // we create this array only after we've found a listener that\n // matches to avoid allocations when no matches are found.\n result = [];\n }\n result.push(listener.target, listener.method, listener.kind === 1 /* ONCE */);\n }\n }\n }\n return result;\n }\n }\n exports.Meta = Meta;\n if (_env.DEBUG) {\n Meta.prototype.writeValues = function (subkey, value) {\n (0, _debug.assert)(this.isMetaDestroyed() ? `Cannot set the value of \\`${subkey}\\` on \\`${(0, _utils.toString)(this.source)}\\` after it has been destroyed.` : '', !this.isMetaDestroyed());\n let map = this._getOrCreateOwnMap('_values');\n map[subkey] = value;\n };\n Meta.prototype.peekValues = function (subkey) {\n return this._findInherited2('_values', subkey);\n };\n Meta.prototype.deleteFromValues = function (subkey) {\n delete this._getOrCreateOwnMap('_values')[subkey];\n };\n Meta.prototype.readInheritedValue = function (key, subkey) {\n let internalKey = `_${key}`;\n let pointer = this;\n while (pointer !== null) {\n let map = pointer[internalKey];\n if (map !== undefined) {\n let value = map[subkey];\n if (value !== undefined || subkey in map) {\n return value;\n }\n }\n pointer = pointer.parent;\n }\n return UNDEFINED;\n };\n Meta.prototype.writeValue = function (obj, key, value) {\n let descriptor = (0, _utils.lookupDescriptor)(obj, key);\n let isMandatorySetter = descriptor !== null && descriptor.set && descriptor.set.isMandatorySetter;\n if (isMandatorySetter) {\n this.writeValues(key, value);\n } else {\n obj[key] = value;\n }\n };\n }\n const getPrototypeOf = Object.getPrototypeOf;\n const metaStore = new WeakMap();\n function setMeta(obj, meta) {\n (0, _debug.assert)('Cannot call `setMeta` on null', obj !== null);\n (0, _debug.assert)('Cannot call `setMeta` on undefined', obj !== undefined);\n (0, _debug.assert)(`Cannot call \\`setMeta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function');\n if (_env.DEBUG) {\n counters.setCalls++;\n }\n metaStore.set(obj, meta);\n }\n function peekMeta(obj) {\n (0, _debug.assert)('Cannot call `peekMeta` on null', obj !== null);\n (0, _debug.assert)('Cannot call `peekMeta` on undefined', obj !== undefined);\n (0, _debug.assert)(`Cannot call \\`peekMeta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function');\n if (_env.DEBUG) {\n counters.peekCalls++;\n }\n let meta = metaStore.get(obj);\n if (meta !== undefined) {\n return meta;\n }\n let pointer = getPrototypeOf(obj);\n while (pointer !== undefined && pointer !== null) {\n if (_env.DEBUG) {\n counters.peekPrototypeWalks++;\n }\n meta = metaStore.get(pointer);\n if (meta !== undefined) {\n if (meta.proto !== pointer) {\n // The meta was a prototype meta which was not marked as initializing.\n // This can happen when a prototype chain was created manually via\n // Object.create() and the source object does not have a constructor.\n meta.proto = pointer;\n }\n return meta;\n }\n pointer = getPrototypeOf(pointer);\n }\n }\n /**\n Tears down the meta on an object so that it can be garbage collected.\n Multiple calls will have no effect.\n \n @method deleteMeta\n @for Ember\n @param {Object} obj the object to destroy\n @return {void}\n @private\n */\n function deleteMeta(obj) {\n (0, _debug.assert)('Cannot call `deleteMeta` on null', obj !== null);\n (0, _debug.assert)('Cannot call `deleteMeta` on undefined', obj !== undefined);\n (0, _debug.assert)(`Cannot call \\`deleteMeta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function');\n if (_env.DEBUG) {\n counters.deleteCalls++;\n }\n let meta = peekMeta(obj);\n if (meta !== undefined) {\n meta.destroy();\n }\n }\n /**\n Retrieves the meta hash for an object. If `writable` is true ensures the\n hash is writable for this object as well.\n \n The meta object contains information about computed property descriptors as\n well as any watched properties and other information. You generally will\n not access this information directly but instead work with higher level\n methods that manipulate this hash indirectly.\n \n @method meta\n @for Ember\n @private\n \n @param {Object} obj The object to retrieve meta for\n @param {Boolean} [writable=true] Pass `false` if you do not intend to modify\n the meta hash, allowing the method to avoid making an unnecessary copy.\n @return {Object} the meta hash for an object\n */\n const meta = exports.meta = function meta(obj) {\n (0, _debug.assert)('Cannot call `meta` on null', obj !== null);\n (0, _debug.assert)('Cannot call `meta` on undefined', obj !== undefined);\n (0, _debug.assert)(`Cannot call \\`meta\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function');\n if (_env.DEBUG) {\n counters.metaCalls++;\n }\n let maybeMeta = peekMeta(obj);\n // remove this code, in-favor of explicit parent\n if (maybeMeta !== undefined && maybeMeta.source === obj) {\n return maybeMeta;\n }\n let newMeta = new Meta(obj);\n setMeta(obj, newMeta);\n return newMeta;\n };\n if (_env.DEBUG) {\n meta._counters = counters;\n }\n /**\n Returns the CP descriptor assocaited with `obj` and `keyName`, if any.\n \n @method descriptorFor\n @param {Object} obj the object to check\n @param {String} keyName the key to check\n @return {Descriptor}\n @private\n */\n function descriptorFor(obj, keyName, _meta) {\n (0, _debug.assert)('Cannot call `descriptorFor` on null', obj !== null);\n (0, _debug.assert)('Cannot call `descriptorFor` on undefined', obj !== undefined);\n (0, _debug.assert)(`Cannot call \\`descriptorFor\\` on ${typeof obj}`, typeof obj === 'object' || typeof obj === 'function');\n let meta = _meta === undefined ? peekMeta(obj) : _meta;\n if (meta !== undefined) {\n return meta.peekDescriptors(keyName);\n }\n }\n /**\n Check whether a value is a CP descriptor.\n \n @method descriptorFor\n @param {any} possibleDesc the value to check\n @return {boolean}\n @private\n */\n function isDescriptor(possibleDesc) {\n // TODO make this return `possibleDesc is Descriptor`\n return possibleDesc !== undefined && possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor === true;\n }\n exports.counters = counters;\n\n function indexOfListener(listeners, event, target, method) {\n for (let i = listeners.length - 1; i >= 0; i--) {\n let listener = listeners[i];\n if (listener.event === event && (listener.target === target && listener.method === method || listener.kind === 3 /* REMOVE_ALL */)) {\n return i;\n }\n }\n return -1;\n }\n});","enifed('@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 let t = {};\n let m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n let 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 let target = {};\n let parent = {};\n let parentMeta = (0, _meta.meta)(parent);\n parentMeta.addToListeners('hello', target, 'm', 0);\n\n let child = Object.create(parent);\n let m = (0, _meta.meta)(child);\n\n let matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], target);\n assert.equal(matching[1], 'm');\n assert.equal(matching[2], 0);\n m.removeFromListeners('hello', target, 'm');\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n matching = parentMeta.matchingListeners('hello');\n assert.equal(matching.length, 3);\n }\n\n ['@test deduplication'](assert) {\n let t = {};\n let m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n m.addToListeners('hello', t, 'm', 0);\n let matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n }\n\n ['@test parent caching'](assert) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n\n class Class {}\n let classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n\n let instance = new Class();\n let m = (0, _meta.meta)(instance);\n\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n\n matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 3);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n }\n\n ['@test parent cache invalidation'](assert) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n _meta.counters.listenersInherited = 0;\n\n class Class {}\n let classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n\n let instance = new Class();\n let m = (0, _meta.meta)(instance);\n\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 0);\n\n m.addToListeners('hello', null, 'm2');\n\n matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 6);\n assert.equal(_meta.counters.flattenedListenersCalls, 4);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 1);\n }\n\n ['@test reopen after flatten'](assert) {\n // Ensure counter is zeroed\n _meta.counters.reopensAfterFlatten = 0;\n\n class Class1 {}\n let class1Meta = (0, _meta.meta)(Class1.prototype);\n class1Meta.addToListeners('hello', null, 'm', 0);\n\n let instance1 = new Class1();\n let m1 = (0, _meta.meta)(instance1);\n\n class Class2 {}\n let class2Meta = (0, _meta.meta)(Class2.prototype);\n class2Meta.addToListeners('hello', null, 'm', 0);\n\n let instance2 = new Class2();\n let m2 = (0, _meta.meta)(instance2);\n\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 0, 'no reopen calls yet');\n\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'reopen calls after invalidating parent cache');\n\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'no reopen calls after mutating leaf nodes');\n\n class1Meta.removeFromListeners('hello', null, 'm');\n class2Meta.removeFromListeners('hello', null, 'm');\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 2, 'one reopen call after mutating parents');\n\n class1Meta.addToListeners('hello', null, 'm', 0);\n m1.matchingListeners('hello');\n class2Meta.addToListeners('hello', null, 'm', 0);\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 3, 'one reopen call after mutating parents and flattening out of order');\n }\n\n ['@test REMOVE_ALL does not interfere with future adds'](assert) {\n expectDeprecation(() => {\n let t = {};\n let m = (0, _meta.meta)({});\n\n m.addToListeners('hello', t, 'm', 0);\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n\n // Remove all listeners\n m.removeAllListeners('hello');\n\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n\n m.addToListeners('hello', t, 'm', 0);\n matching = m.matchingListeners('hello');\n\n // listener was added back successfully\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n });\n }\n });\n});","enifed('@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 let obj = {};\n\n (0, _meta.meta)(obj).foo = 'bar';\n\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 let proto, obj, props, prop;\n proto = { foo: 'bar' };\n (0, _meta.meta)(proto);\n obj = Object.create(proto);\n (0, _meta.meta)(obj);\n obj.bar = 'baz';\n props = [];\n for (prop in obj) {\n props.push(prop);\n }\n assert.deepEqual(props.sort(), ['bar', 'foo']);\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 ['@test meta.writeWatching issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeWatching('hello', 1);\n }, 'Cannot update watchers for `hello` on `` after it has been destroyed.');\n }\n\n ['@test meta.writableTag issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableTag(() => {});\n }, 'Cannot create a new tag for `` after it has been destroyed.');\n }\n\n ['@test meta.writableChainWatchers issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableChainWatchers(() => {});\n }, 'Cannot create a new chain watcher for `` after it has been destroyed.');\n }\n\n ['@test meta.writableChains issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableChains(() => {});\n }, 'Cannot create a new chains for `` after it has been destroyed.');\n }\n\n ['@test meta.writeValues issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeValues('derp', 'ohai');\n }, 'Cannot set the value of `derp` on `` after it has been destroyed.');\n }\n\n ['@test meta.writeDeps issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeDeps('derp', 'ohai', 1);\n }, 'Cannot modify dependent keys for `ohai` on `` after it has been destroyed.');\n }\n });\n});","enifed('@ember/-internals/metal/index', ['exports', '@ember/-internals/metal/lib/computed', '@ember/-internals/metal/lib/computed_cache', '@ember/-internals/metal/lib/alias', '@ember/-internals/metal/lib/deprecate_property', '@ember/-internals/metal/lib/property_get', '@ember/-internals/metal/lib/property_set', '@ember/-internals/metal/lib/array', '@ember/-internals/metal/lib/array_events', '@ember/-internals/metal/lib/each_proxy', '@ember/-internals/metal/lib/each_proxy_events', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/is_none', '@ember/-internals/metal/lib/is_empty', '@ember/-internals/metal/lib/is_blank', '@ember/-internals/metal/lib/is_present', '@ember/-internals/metal/lib/property_events', '@ember/-internals/metal/lib/properties', '@ember/-internals/metal/lib/watch_key', '@ember/-internals/metal/lib/chains', '@ember/-internals/metal/lib/watch_path', '@ember/-internals/metal/lib/watching', '@ember/-internals/metal/lib/libraries', '@ember/-internals/metal/lib/get_properties', '@ember/-internals/metal/lib/set_properties', '@ember/-internals/metal/lib/expand_properties', '@ember/-internals/metal/lib/observer', '@ember/-internals/metal/lib/mixin', '@ember/-internals/metal/lib/injected_property', '@ember/-internals/metal/lib/tags', '@ember/-internals/metal/lib/transaction', '@ember/-internals/metal/lib/descriptor', '@ember/-internals/metal/lib/tracked', '@ember/-internals/metal/lib/namespace_search'], function (exports, _computed, _computed_cache, _alias, _deprecate_property, _property_get, _property_set, _array, _array_events, _each_proxy, _each_proxy_events, _events, _is_none, _is_empty, _is_blank, _is_present, _property_events, _properties, _watch_key, _chains, _watch_path, _watching, _libraries, _get_properties, _set_properties, _expand_properties, _observer, _mixin, _injected_property, _tags, _transaction, _descriptor, _tracked, _namespace_search) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'computed', {\n enumerable: true,\n get: function () {\n return _computed.default;\n }\n });\n Object.defineProperty(exports, 'ComputedProperty', {\n enumerable: true,\n get: function () {\n return _computed.ComputedProperty;\n }\n });\n Object.defineProperty(exports, '_globalsComputed', {\n enumerable: true,\n get: function () {\n return _computed._globalsComputed;\n }\n });\n Object.defineProperty(exports, 'getCacheFor', {\n enumerable: true,\n get: function () {\n return _computed_cache.getCacheFor;\n }\n });\n Object.defineProperty(exports, 'getCachedValueFor', {\n enumerable: true,\n get: function () {\n return _computed_cache.getCachedValueFor;\n }\n });\n Object.defineProperty(exports, 'peekCacheFor', {\n enumerable: true,\n get: function () {\n return _computed_cache.peekCacheFor;\n }\n });\n Object.defineProperty(exports, 'alias', {\n enumerable: true,\n get: function () {\n return _alias.default;\n }\n });\n Object.defineProperty(exports, 'deprecateProperty', {\n enumerable: true,\n get: function () {\n return _deprecate_property.deprecateProperty;\n }\n });\n Object.defineProperty(exports, 'PROXY_CONTENT', {\n enumerable: true,\n get: function () {\n return _property_get.PROXY_CONTENT;\n }\n });\n Object.defineProperty(exports, '_getPath', {\n enumerable: true,\n get: function () {\n return _property_get._getPath;\n }\n });\n Object.defineProperty(exports, 'get', {\n enumerable: true,\n get: function () {\n return _property_get.get;\n }\n });\n Object.defineProperty(exports, 'getWithDefault', {\n enumerable: true,\n get: function () {\n return _property_get.getWithDefault;\n }\n });\n Object.defineProperty(exports, 'set', {\n enumerable: true,\n get: function () {\n return _property_set.set;\n }\n });\n Object.defineProperty(exports, 'trySet', {\n enumerable: true,\n get: function () {\n return _property_set.trySet;\n }\n });\n Object.defineProperty(exports, 'objectAt', {\n enumerable: true,\n get: function () {\n return _array.objectAt;\n }\n });\n Object.defineProperty(exports, 'replace', {\n enumerable: true,\n get: function () {\n return _array.replace;\n }\n });\n Object.defineProperty(exports, 'replaceInNativeArray', {\n enumerable: true,\n get: function () {\n return _array.replaceInNativeArray;\n }\n });\n Object.defineProperty(exports, 'addArrayObserver', {\n enumerable: true,\n get: function () {\n return _array.addArrayObserver;\n }\n });\n Object.defineProperty(exports, 'removeArrayObserver', {\n enumerable: true,\n get: function () {\n return _array.removeArrayObserver;\n }\n });\n Object.defineProperty(exports, 'arrayContentWillChange', {\n enumerable: true,\n get: function () {\n return _array_events.arrayContentWillChange;\n }\n });\n Object.defineProperty(exports, 'arrayContentDidChange', {\n enumerable: true,\n get: function () {\n return _array_events.arrayContentDidChange;\n }\n });\n Object.defineProperty(exports, 'eachProxyFor', {\n enumerable: true,\n get: function () {\n return _each_proxy.eachProxyFor;\n }\n });\n Object.defineProperty(exports, 'eachProxyArrayWillChange', {\n enumerable: true,\n get: function () {\n return _each_proxy_events.eachProxyArrayWillChange;\n }\n });\n Object.defineProperty(exports, 'eachProxyArrayDidChange', {\n enumerable: true,\n get: function () {\n return _each_proxy_events.eachProxyArrayDidChange;\n }\n });\n Object.defineProperty(exports, 'addListener', {\n enumerable: true,\n get: function () {\n return _events.addListener;\n }\n });\n Object.defineProperty(exports, 'hasListeners', {\n enumerable: true,\n get: function () {\n return _events.hasListeners;\n }\n });\n Object.defineProperty(exports, 'on', {\n enumerable: true,\n get: function () {\n return _events.on;\n }\n });\n Object.defineProperty(exports, 'removeListener', {\n enumerable: true,\n get: function () {\n return _events.removeListener;\n }\n });\n Object.defineProperty(exports, 'sendEvent', {\n enumerable: true,\n get: function () {\n return _events.sendEvent;\n }\n });\n Object.defineProperty(exports, 'isNone', {\n enumerable: true,\n get: function () {\n return _is_none.default;\n }\n });\n Object.defineProperty(exports, 'isEmpty', {\n enumerable: true,\n get: function () {\n return _is_empty.default;\n }\n });\n Object.defineProperty(exports, 'isBlank', {\n enumerable: true,\n get: function () {\n return _is_blank.default;\n }\n });\n Object.defineProperty(exports, 'isPresent', {\n enumerable: true,\n get: function () {\n return _is_present.default;\n }\n });\n Object.defineProperty(exports, 'beginPropertyChanges', {\n enumerable: true,\n get: function () {\n return _property_events.beginPropertyChanges;\n }\n });\n Object.defineProperty(exports, 'changeProperties', {\n enumerable: true,\n get: function () {\n return _property_events.changeProperties;\n }\n });\n Object.defineProperty(exports, 'endPropertyChanges', {\n enumerable: true,\n get: function () {\n return _property_events.endPropertyChanges;\n }\n });\n Object.defineProperty(exports, 'notifyPropertyChange', {\n enumerable: true,\n get: function () {\n return _property_events.notifyPropertyChange;\n }\n });\n Object.defineProperty(exports, 'overrideChains', {\n enumerable: true,\n get: function () {\n return _property_events.overrideChains;\n }\n });\n Object.defineProperty(exports, 'propertyDidChange', {\n enumerable: true,\n get: function () {\n return _property_events.propertyDidChange;\n }\n });\n Object.defineProperty(exports, 'propertyWillChange', {\n enumerable: true,\n get: function () {\n return _property_events.propertyWillChange;\n }\n });\n Object.defineProperty(exports, 'PROPERTY_DID_CHANGE', {\n enumerable: true,\n get: function () {\n return _property_events.PROPERTY_DID_CHANGE;\n }\n });\n Object.defineProperty(exports, 'defineProperty', {\n enumerable: true,\n get: function () {\n return _properties.defineProperty;\n }\n });\n Object.defineProperty(exports, 'Descriptor', {\n enumerable: true,\n get: function () {\n return _properties.Descriptor;\n }\n });\n Object.defineProperty(exports, 'watchKey', {\n enumerable: true,\n get: function () {\n return _watch_key.watchKey;\n }\n });\n Object.defineProperty(exports, 'unwatchKey', {\n enumerable: true,\n get: function () {\n return _watch_key.unwatchKey;\n }\n });\n Object.defineProperty(exports, 'ChainNode', {\n enumerable: true,\n get: function () {\n return _chains.ChainNode;\n }\n });\n Object.defineProperty(exports, 'finishChains', {\n enumerable: true,\n get: function () {\n return _chains.finishChains;\n }\n });\n Object.defineProperty(exports, 'removeChainWatcher', {\n enumerable: true,\n get: function () {\n return _chains.removeChainWatcher;\n }\n });\n Object.defineProperty(exports, 'watchPath', {\n enumerable: true,\n get: function () {\n return _watch_path.watchPath;\n }\n });\n Object.defineProperty(exports, 'unwatchPath', {\n enumerable: true,\n get: function () {\n return _watch_path.unwatchPath;\n }\n });\n Object.defineProperty(exports, 'isWatching', {\n enumerable: true,\n get: function () {\n return _watching.isWatching;\n }\n });\n Object.defineProperty(exports, 'unwatch', {\n enumerable: true,\n get: function () {\n return _watching.unwatch;\n }\n });\n Object.defineProperty(exports, 'watch', {\n enumerable: true,\n get: function () {\n return _watching.watch;\n }\n });\n Object.defineProperty(exports, 'watcherCount', {\n enumerable: true,\n get: function () {\n return _watching.watcherCount;\n }\n });\n Object.defineProperty(exports, 'libraries', {\n enumerable: true,\n get: function () {\n return _libraries.default;\n }\n });\n Object.defineProperty(exports, 'Libraries', {\n enumerable: true,\n get: function () {\n return _libraries.Libraries;\n }\n });\n Object.defineProperty(exports, 'getProperties', {\n enumerable: true,\n get: function () {\n return _get_properties.default;\n }\n });\n Object.defineProperty(exports, 'setProperties', {\n enumerable: true,\n get: function () {\n return _set_properties.default;\n }\n });\n Object.defineProperty(exports, 'expandProperties', {\n enumerable: true,\n get: function () {\n return _expand_properties.default;\n }\n });\n Object.defineProperty(exports, 'addObserver', {\n enumerable: true,\n get: function () {\n return _observer.addObserver;\n }\n });\n Object.defineProperty(exports, 'removeObserver', {\n enumerable: true,\n get: function () {\n return _observer.removeObserver;\n }\n });\n Object.defineProperty(exports, 'Mixin', {\n enumerable: true,\n get: function () {\n return _mixin.Mixin;\n }\n });\n Object.defineProperty(exports, 'aliasMethod', {\n enumerable: true,\n get: function () {\n return _mixin.aliasMethod;\n }\n });\n Object.defineProperty(exports, 'mixin', {\n enumerable: true,\n get: function () {\n return _mixin.mixin;\n }\n });\n Object.defineProperty(exports, 'observer', {\n enumerable: true,\n get: function () {\n return _mixin.observer;\n }\n });\n Object.defineProperty(exports, 'applyMixin', {\n enumerable: true,\n get: function () {\n return _mixin.applyMixin;\n }\n });\n Object.defineProperty(exports, 'InjectedProperty', {\n enumerable: true,\n get: function () {\n return _injected_property.default;\n }\n });\n Object.defineProperty(exports, 'setHasViews', {\n enumerable: true,\n get: function () {\n return _tags.setHasViews;\n }\n });\n Object.defineProperty(exports, 'tagForProperty', {\n enumerable: true,\n get: function () {\n return _tags.tagForProperty;\n }\n });\n Object.defineProperty(exports, 'tagFor', {\n enumerable: true,\n get: function () {\n return _tags.tagFor;\n }\n });\n Object.defineProperty(exports, 'markObjectAsDirty', {\n enumerable: true,\n get: function () {\n return _tags.markObjectAsDirty;\n }\n });\n Object.defineProperty(exports, 'runInTransaction', {\n enumerable: true,\n get: function () {\n return _transaction.default;\n }\n });\n Object.defineProperty(exports, 'didRender', {\n enumerable: true,\n get: function () {\n return _transaction.didRender;\n }\n });\n Object.defineProperty(exports, 'assertNotRendered', {\n enumerable: true,\n get: function () {\n return _transaction.assertNotRendered;\n }\n });\n Object.defineProperty(exports, 'descriptor', {\n enumerable: true,\n get: function () {\n return _descriptor.default;\n }\n });\n Object.defineProperty(exports, 'tracked', {\n enumerable: true,\n get: function () {\n return _tracked.tracked;\n }\n });\n Object.defineProperty(exports, 'NAMESPACES', {\n enumerable: true,\n get: function () {\n return _namespace_search.NAMESPACES;\n }\n });\n Object.defineProperty(exports, 'NAMESPACES_BY_ID', {\n enumerable: true,\n get: function () {\n return _namespace_search.NAMESPACES_BY_ID;\n }\n });\n Object.defineProperty(exports, 'addNamespace', {\n enumerable: true,\n get: function () {\n return _namespace_search.addNamespace;\n }\n });\n Object.defineProperty(exports, 'classToString', {\n enumerable: true,\n get: function () {\n return _namespace_search.classToString;\n }\n });\n Object.defineProperty(exports, 'findNamespace', {\n enumerable: true,\n get: function () {\n return _namespace_search.findNamespace;\n }\n });\n Object.defineProperty(exports, 'findNamespaces', {\n enumerable: true,\n get: function () {\n return _namespace_search.findNamespaces;\n }\n });\n Object.defineProperty(exports, 'processNamespace', {\n enumerable: true,\n get: function () {\n return _namespace_search.processNamespace;\n }\n });\n Object.defineProperty(exports, 'processAllNamespaces', {\n enumerable: true,\n get: function () {\n return _namespace_search.processAllNamespaces;\n }\n });\n Object.defineProperty(exports, 'removeNamespace', {\n enumerable: true,\n get: function () {\n return _namespace_search.removeNamespace;\n }\n });\n Object.defineProperty(exports, 'isNamespaceSearchDisabled', {\n enumerable: true,\n get: function () {\n return _namespace_search.isSearchDisabled;\n }\n });\n Object.defineProperty(exports, 'setNamespaceSearchDisabled', {\n enumerable: true,\n get: function () {\n return _namespace_search.setSearchDisabled;\n }\n });\n});","enifed('@ember/-internals/metal/lib/alias', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/debug', '@ember/error', '@ember/-internals/metal/lib/computed', '@ember/-internals/metal/lib/computed_cache', '@ember/-internals/metal/lib/dependent_keys', '@ember/-internals/metal/lib/properties', '@ember/-internals/metal/lib/property_get', '@ember/-internals/metal/lib/property_set'], function (exports, _meta, _utils, _debug, _error, _computed, _computed_cache, _dependent_keys, _properties, _property_get, _property_set) {\n 'use strict';\n\n exports.__esModule = true;\n exports.AliasedProperty = undefined;\n exports.default = alias;\n\n const CONSUMED = Object.freeze({});\n function alias(altKey) {\n return new AliasedProperty(altKey);\n }\n class AliasedProperty extends _properties.Descriptor {\n constructor(altKey) {\n super();\n this.altKey = altKey;\n this._dependentKeys = [altKey];\n }\n setup(obj, keyName, meta) {\n (0, _debug.assert)(`Setting alias '${keyName}' on self`, this.altKey !== keyName);\n super.setup(obj, keyName, meta);\n if (meta.peekWatching(keyName) > 0) {\n this.consume(obj, keyName, meta);\n }\n }\n teardown(obj, keyName, meta) {\n this.unconsume(obj, keyName, meta);\n super.teardown(obj, keyName, meta);\n }\n willWatch(obj, keyName, meta) {\n this.consume(obj, keyName, meta);\n }\n didUnwatch(obj, keyName, meta) {\n this.unconsume(obj, keyName, meta);\n }\n get(obj, keyName) {\n let ret = (0, _property_get.get)(obj, this.altKey);\n this.consume(obj, keyName, (0, _meta.meta)(obj));\n return ret;\n }\n unconsume(obj, keyName, meta) {\n let wasConsumed = (0, _computed_cache.getCachedValueFor)(obj, keyName) === CONSUMED;\n if (wasConsumed || meta.peekWatching(keyName) > 0) {\n (0, _dependent_keys.removeDependentKeys)(this, obj, keyName, meta);\n }\n if (wasConsumed) {\n (0, _computed_cache.getCacheFor)(obj).delete(keyName);\n }\n }\n consume(obj, keyName, meta) {\n let cache = (0, _computed_cache.getCacheFor)(obj);\n if (cache.get(keyName) !== CONSUMED) {\n cache.set(keyName, CONSUMED);\n (0, _dependent_keys.addDependentKeys)(this, obj, keyName, meta);\n }\n }\n set(obj, _keyName, value) {\n return (0, _property_set.set)(obj, this.altKey, value);\n }\n readOnly() {\n this.set = AliasedProperty_readOnlySet;\n return this;\n }\n oneWay() {\n this.set = AliasedProperty_oneWaySet;\n return this;\n }\n }\n exports.AliasedProperty = AliasedProperty;\n function AliasedProperty_readOnlySet(obj, keyName) {\n // eslint-disable-line no-unused-vars\n throw new _error.default(`Cannot set read-only property '${keyName}' on object: ${(0, _utils.inspect)(obj)}`);\n }\n function AliasedProperty_oneWaySet(obj, keyName, value) {\n (0, _properties.defineProperty)(obj, keyName, null);\n return (0, _property_set.set)(obj, keyName, value);\n }\n // Backwards compatibility with Ember Data.\n AliasedProperty.prototype._meta = undefined;\n AliasedProperty.prototype.meta = _computed.ComputedProperty.prototype.meta;\n});","enifed('@ember/-internals/metal/lib/array', ['exports', '@ember/-internals/metal/lib/array_events', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/property_events', '@ember/-internals/metal/lib/property_get'], function (exports, _array_events, _events, _property_events, _property_get) {\n 'use strict';\n\n exports.__esModule = true;\n exports.objectAt = objectAt;\n exports.replace = replace;\n exports.replaceInNativeArray = replaceInNativeArray;\n exports.addArrayObserver = addArrayObserver;\n exports.removeArrayObserver = removeArrayObserver;\n\n const EMPTY_ARRAY = Object.freeze([]);\n function objectAt(array, index) {\n if (Array.isArray(array)) {\n return array[index];\n } else {\n return array.objectAt(index);\n }\n }\n function replace(array, start, deleteCount, items = EMPTY_ARRAY) {\n if (Array.isArray(array)) {\n replaceInNativeArray(array, start, deleteCount, items);\n } else {\n array.replace(start, deleteCount, items);\n }\n }\n const CHUNK_SIZE = 60000;\n // To avoid overflowing the stack, we splice up to CHUNK_SIZE items at a time.\n // See https://code.google.com/p/chromium/issues/detail?id=56588 for more details.\n function replaceInNativeArray(array, start, deleteCount, items) {\n (0, _array_events.arrayContentWillChange)(array, start, deleteCount, items.length);\n if (items.length <= CHUNK_SIZE) {\n array.splice(start, deleteCount, ...items);\n } else {\n array.splice(start, deleteCount);\n for (let i = 0; i < items.length; i += CHUNK_SIZE) {\n let chunk = items.slice(i, i + CHUNK_SIZE);\n array.splice(start + i, 0, ...chunk);\n }\n }\n (0, _array_events.arrayContentDidChange)(array, start, deleteCount, items.length);\n }\n function arrayObserversHelper(obj, target, opts, operation, notify) {\n let willChange = opts && opts.willChange || 'arrayWillChange';\n let didChange = opts && opts.didChange || 'arrayDidChange';\n let hasObservers = (0, _property_get.get)(obj, 'hasArrayObservers');\n operation(obj, '@array:before', target, willChange);\n operation(obj, '@array:change', target, didChange);\n if (hasObservers === notify) {\n (0, _property_events.notifyPropertyChange)(obj, 'hasArrayObservers');\n }\n return obj;\n }\n function addArrayObserver(array, target, opts) {\n return arrayObserversHelper(array, target, opts, _events.addListener, false);\n }\n function removeArrayObserver(array, target, opts) {\n return arrayObserversHelper(array, target, opts, _events.removeListener, true);\n }\n});","enifed('@ember/-internals/metal/lib/array_events', ['exports', '@ember/-internals/meta', '@ember/-internals/metal/lib/computed_cache', '@ember/-internals/metal/lib/each_proxy_events', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/property_events'], function (exports, _meta, _computed_cache, _each_proxy_events, _events, _property_events) {\n 'use strict';\n\n exports.__esModule = true;\n exports.arrayContentWillChange = arrayContentWillChange;\n exports.arrayContentDidChange = arrayContentDidChange;\n function arrayContentWillChange(array, startIdx, removeAmt, addAmt) {\n // if no args are passed assume everything changes\n if (startIdx === undefined) {\n startIdx = 0;\n removeAmt = addAmt = -1;\n } else {\n if (removeAmt === undefined) {\n removeAmt = -1;\n }\n if (addAmt === undefined) {\n addAmt = -1;\n }\n }\n (0, _each_proxy_events.eachProxyArrayWillChange)(array, startIdx, removeAmt, addAmt);\n (0, _events.sendEvent)(array, '@array:before', [array, startIdx, removeAmt, addAmt]);\n return array;\n }\n function arrayContentDidChange(array, startIdx, removeAmt, addAmt) {\n // if no args are passed assume everything changes\n if (startIdx === undefined) {\n startIdx = 0;\n removeAmt = addAmt = -1;\n } else {\n if (removeAmt === undefined) {\n removeAmt = -1;\n }\n if (addAmt === undefined) {\n addAmt = -1;\n }\n }\n let meta = (0, _meta.peekMeta)(array);\n if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {\n (0, _property_events.notifyPropertyChange)(array, 'length', meta);\n }\n (0, _property_events.notifyPropertyChange)(array, '[]', meta);\n (0, _each_proxy_events.eachProxyArrayDidChange)(array, startIdx, removeAmt, addAmt);\n (0, _events.sendEvent)(array, '@array:change', [array, startIdx, removeAmt, addAmt]);\n let cache = (0, _computed_cache.peekCacheFor)(array);\n if (cache !== undefined) {\n let length = array.length;\n let addedAmount = addAmt === -1 ? 0 : addAmt;\n let removedAmount = removeAmt === -1 ? 0 : removeAmt;\n let delta = addedAmount - removedAmount;\n let previousLength = length - delta;\n let normalStartIdx = startIdx < 0 ? previousLength + startIdx : startIdx;\n if (cache.has('firstObject') && normalStartIdx === 0) {\n (0, _property_events.notifyPropertyChange)(array, 'firstObject', meta);\n }\n if (cache.has('lastObject')) {\n let previousLastIndex = previousLength - 1;\n let lastAffectedIndex = normalStartIdx + removedAmount;\n if (previousLastIndex < lastAffectedIndex) {\n (0, _property_events.notifyPropertyChange)(array, 'lastObject', meta);\n }\n }\n }\n return array;\n }\n});","enifed('@ember/-internals/metal/lib/chains', ['exports', '@ember/-internals/meta', '@ember/-internals/metal/lib/computed_cache', '@ember/-internals/metal/lib/each_proxy', '@ember/-internals/metal/lib/property_get', '@ember/-internals/metal/lib/watch_key'], function (exports, _meta2, _computed_cache, _each_proxy, _property_get, _watch_key) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ChainNode = exports.removeChainWatcher = exports.makeChainNode = exports.finishChains = undefined;\n\n function isObject(obj) {\n return typeof obj === 'object' && obj !== null;\n }\n function isVolatile(obj, keyName, meta) {\n let desc = (0, _meta2.descriptorFor)(obj, keyName, meta);\n return !(desc !== undefined && desc._volatile === false);\n }\n class ChainWatchers {\n constructor() {\n // chain nodes that reference a key in this obj by key\n // we only create ChainWatchers when we are going to add them\n // so create this upfront\n this.chains = Object.create(null);\n }\n add(key, node) {\n let nodes = this.chains[key];\n if (nodes === undefined) {\n this.chains[key] = [node];\n } else {\n nodes.push(node);\n }\n }\n remove(key, node) {\n let nodes = this.chains[key];\n if (nodes !== undefined) {\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i] === node) {\n nodes.splice(i, 1);\n break;\n }\n }\n }\n }\n has(key, node) {\n let nodes = this.chains[key];\n if (nodes !== undefined) {\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i] === node) {\n return true;\n }\n }\n }\n return false;\n }\n revalidateAll() {\n for (let key in this.chains) {\n this.notify(key, true, undefined);\n }\n }\n revalidate(key) {\n this.notify(key, true, undefined);\n }\n // key: the string key that is part of a path changed\n // revalidate: boolean; the chains that are watching this value should revalidate\n // callback: function that will be called with the object and path that\n // will be/are invalidated by this key change, depending on\n // whether the revalidate flag is passed\n notify(key, revalidate, callback) {\n let nodes = this.chains[key];\n if (nodes === undefined || nodes.length === 0) {\n return;\n }\n let affected = undefined;\n if (callback !== undefined) {\n affected = [];\n }\n for (let i = 0; i < nodes.length; i++) {\n nodes[i].notify(revalidate, affected);\n }\n if (callback === undefined) {\n return;\n }\n // we gather callbacks so we don't notify them during revalidation\n for (let i = 0; i < affected.length; i += 2) {\n let obj = affected[i];\n let path = affected[i + 1];\n callback(obj, path);\n }\n }\n }\n function makeChainWatcher() {\n return new ChainWatchers();\n }\n function makeChainNode(obj) {\n return new ChainNode(null, null, obj);\n }\n function addChainWatcher(obj, keyName, node) {\n let m = (0, _meta2.meta)(obj);\n m.writableChainWatchers(makeChainWatcher).add(keyName, node);\n (0, _watch_key.watchKey)(obj, keyName, m);\n }\n function removeChainWatcher(obj, keyName, node, _meta) {\n if (!isObject(obj)) {\n return;\n }\n let meta = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n if (meta === undefined || meta.isSourceDestroying() || meta.isMetaDestroyed() || meta.readableChainWatchers() === undefined) {\n return;\n }\n // make meta writable\n meta = (0, _meta2.meta)(obj);\n meta.readableChainWatchers().remove(keyName, node);\n (0, _watch_key.unwatchKey)(obj, keyName, meta);\n }\n const NODE_STACK = [];\n function destroyRoot(root) {\n pushChildren(root);\n while (NODE_STACK.length > 0) {\n let node = NODE_STACK.pop();\n pushChildren(node);\n destroyOne(node);\n }\n }\n function destroyOne(node) {\n if (node.isWatching) {\n removeChainWatcher(node.object, node.key, node);\n node.isWatching = false;\n }\n }\n function pushChildren(node) {\n let nodes = node.chains;\n if (nodes !== undefined) {\n for (let key in nodes) {\n if (nodes[key] !== undefined) {\n NODE_STACK.push(nodes[key]);\n }\n }\n }\n }\n // A ChainNode watches a single key on an object. If you provide a starting\n // value for the key then the node won't actually watch it. For a root node\n // pass null for parent and key and object for value.\n class ChainNode {\n constructor(parent, key, value) {\n this.paths = undefined;\n this.isWatching = false;\n this.chains = undefined;\n this.object = undefined;\n this.count = 0;\n this.parent = parent;\n this.key = key;\n this.content = value;\n // It is false for the root of a chain (because we have no parent)\n let isWatching = this.isWatching = parent !== null;\n if (isWatching) {\n let parentValue = parent.value();\n if (isObject(parentValue)) {\n this.object = parentValue;\n addChainWatcher(parentValue, key, this);\n }\n }\n }\n value() {\n if (this.content === undefined && this.isWatching) {\n let obj = this.parent.value();\n this.content = lazyGet(obj, this.key);\n }\n return this.content;\n }\n destroy() {\n // check if root\n if (this.parent === null) {\n destroyRoot(this);\n } else {\n destroyOne(this);\n }\n }\n // copies a top level object only\n copyTo(target) {\n let paths = this.paths;\n if (paths !== undefined) {\n let path;\n for (path in paths) {\n if (paths[path] > 0) {\n target.add(path);\n }\n }\n }\n }\n // called on the root node of a chain to setup watchers on the specified\n // path.\n add(path) {\n let paths = this.paths || (this.paths = {});\n paths[path] = (paths[path] || 0) + 1;\n let tails = path.split('.');\n this.chain(tails.shift(), tails);\n }\n // called on the root node of a chain to teardown watcher on the specified\n // path\n remove(path) {\n let paths = this.paths;\n if (paths === undefined) {\n return;\n }\n if (paths[path] > 0) {\n paths[path]--;\n }\n let tails = path.split('.');\n this.unchain(tails.shift(), tails);\n }\n chain(key, tails) {\n let chains = this.chains;\n if (chains === undefined) {\n chains = this.chains = Object.create(null);\n }\n let node = chains[key];\n if (node === undefined) {\n node = chains[key] = new ChainNode(this, key, undefined);\n }\n node.count++; // count chains...\n // chain rest of path if there is one\n if (tails.length > 0) {\n node.chain(tails.shift(), tails);\n }\n }\n unchain(key, tails) {\n let chains = this.chains;\n let node = chains[key];\n // unchain rest of path first...\n if (tails.length > 0) {\n node.unchain(tails.shift(), tails);\n }\n // delete node if needed.\n node.count--;\n if (node.count <= 0) {\n chains[node.key] = undefined;\n node.destroy();\n }\n }\n notify(revalidate, affected) {\n if (revalidate && this.isWatching) {\n let parentValue = this.parent.value();\n if (parentValue !== this.object) {\n removeChainWatcher(this.object, this.key, this);\n if (isObject(parentValue)) {\n this.object = parentValue;\n addChainWatcher(parentValue, this.key, this);\n } else {\n this.object = undefined;\n }\n }\n this.content = undefined;\n }\n // then notify chains...\n let chains = this.chains;\n if (chains !== undefined) {\n let node;\n for (let key in chains) {\n node = chains[key];\n if (node !== undefined) {\n node.notify(revalidate, affected);\n }\n }\n }\n if (affected !== undefined && this.parent !== null) {\n this.parent.populateAffected(this.key, 1, affected);\n }\n }\n populateAffected(path, depth, affected) {\n if (this.key) {\n path = `${this.key}.${path}`;\n }\n if (this.parent !== null) {\n this.parent.populateAffected(path, depth + 1, affected);\n } else if (depth > 1) {\n affected.push(this.value(), path);\n }\n }\n }\n function lazyGet(obj, key) {\n if (!isObject(obj)) {\n return;\n }\n let meta = (0, _meta2.peekMeta)(obj);\n // check if object meant only to be a prototype\n if (meta !== undefined && meta.proto === obj) {\n return;\n }\n // Use `get` if the return value is an EachProxy or an uncacheable value.\n if (key === '@each') {\n return (0, _each_proxy.eachProxyFor)(obj);\n } else if (isVolatile(obj, key, meta)) {\n return (0, _property_get.get)(obj, key);\n // Otherwise attempt to get the cached value of the computed property\n } else {\n return (0, _computed_cache.getCachedValueFor)(obj, key);\n }\n }\n function finishChains(meta) {\n // finish any current chains node watchers that reference obj\n let chainWatchers = meta.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidateAll();\n }\n // ensure that if we have inherited any chains they have been\n // copied onto our own meta.\n if (meta.readableChains() !== undefined) {\n meta.writableChains(makeChainNode);\n }\n }\n exports.finishChains = finishChains;\n exports.makeChainNode = makeChainNode;\n exports.removeChainWatcher = removeChainWatcher;\n exports.ChainNode = ChainNode;\n});","enifed('@ember/-internals/metal/lib/change_event', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = changeEvent;\n const AFTER_OBSERVERS = ':change';\n function changeEvent(keyName) {\n return keyName + AFTER_OBSERVERS;\n }\n});","enifed('@ember/-internals/metal/lib/computed', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/canary-features', '@ember/debug', '@ember/error', '@ember/-internals/metal/lib/computed_cache', '@ember/-internals/metal/lib/dependent_keys', '@ember/-internals/metal/lib/expand_properties', '@ember/-internals/metal/lib/properties', '@ember/-internals/metal/lib/property_events', '@ember/-internals/metal/lib/property_set', '@ember/-internals/metal/lib/tags', '@ember/-internals/metal/lib/tracked'], function (exports, _meta, _utils, _canaryFeatures, _debug, _error, _computed_cache, _dependent_keys, _expand_properties, _properties, _property_events, _property_set, _tags, _tracked) {\n 'use strict';\n\n exports.__esModule = true;\n exports.computed = exports.ComputedProperty = exports._globalsComputed = undefined;\n exports.default = computed;\n\n /**\n @module @ember/object\n */\n const DEEP_EACH_REGEX = /\\.@each\\.[^.]+\\./;\n function noop() {}\n /**\n A computed property transforms an object literal with object's accessor function(s) into a property.\n \n By default the function backing the computed property will only be called\n once and the result will be cached. You can specify various properties\n that your computed property depends on. This will force the cached\n result to be recomputed if the dependencies are modified.\n \n In the following example we declare a computed property - `fullName` - by calling\n `computed` with property dependencies (`firstName` and `lastName`) as leading arguments and getter accessor function. The `fullName` getter function\n will be called once (regardless of how many times it is accessed) as long\n as its dependencies have not changed. Once `firstName` or `lastName` are updated\n any future calls (or anything bound) to `fullName` will incorporate the new\n values.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', function() {\n let firstName = this.get('firstName'),\n lastName = this.get('lastName');\n \n return `${firstName} ${lastName}`;\n })\n });\n \n let tom = Person.create({\n firstName: 'Tom',\n lastName: 'Dale'\n });\n \n tom.get('fullName') // 'Tom Dale'\n ```\n \n You can also define what Ember should do when setting a computed property by providing additional function (`set`) in hash argument.\n If you try to set a computed property, it will try to invoke setter accessor function with the key and\n value you want to set it to as arguments.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n let firstName = this.get('firstName'),\n lastName = this.get('lastName');\n \n return firstName + ' ' + lastName;\n },\n set(key, value) {\n let [firstName, lastName] = value.split(' ');\n \n this.set('firstName', firstName);\n this.set('lastName', lastName);\n \n return value;\n }\n })\n });\n \n let person = Person.create();\n \n person.set('fullName', 'Peter Wagenet');\n person.get('firstName'); // 'Peter'\n person.get('lastName'); // 'Wagenet'\n ```\n \n You can overwrite computed property with normal property (no longer computed), that won't change if dependencies change, if you set computed property and it won't have setter accessor function defined.\n \n You can also mark computed property as `.readOnly()` and block all attempts to set it.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n let firstName = this.get('firstName');\n let lastName = this.get('lastName');\n \n return firstName + ' ' + lastName;\n }\n }).readOnly()\n });\n \n let person = Person.create();\n person.set('fullName', 'Peter Wagenet'); // Uncaught Error: Cannot set read-only property \"fullName\" on object: <(...):emberXXX>\n ```\n \n Additional resources:\n - [New CP syntax RFC](https://github.com/emberjs/rfcs/blob/master/text/0011-improved-cp-syntax.md)\n - [New computed syntax explained in \"Ember 1.12 released\" ](https://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_new-computed-syntax)\n \n @class ComputedProperty\n @public\n */\n class ComputedProperty extends _properties.Descriptor {\n constructor(config, opts) {\n super();\n let hasGetterOnly = typeof config === 'function';\n if (hasGetterOnly) {\n this._getter = config;\n } else {\n const objectConfig = config;\n (0, _debug.assert)('computed expects a function or an object as last argument.', typeof objectConfig === 'object' && !Array.isArray(objectConfig));\n (0, _debug.assert)('Config object passed to computed can only contain `get` and `set` keys.', Object.keys(objectConfig).every(key => key === 'get' || key === 'set'));\n (0, _debug.assert)('Computed properties must receive a getter or a setter, you passed none.', !!objectConfig.get || !!objectConfig.set);\n this._getter = objectConfig.get || noop;\n this._setter = objectConfig.set;\n }\n this._suspended = undefined;\n this._meta = undefined;\n this._volatile = false;\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n this._auto = false;\n }\n this._dependentKeys = opts && opts.dependentKeys;\n this._readOnly = !!opts && hasGetterOnly && opts.readOnly === true;\n }\n /**\n Call on a computed property to set it into non-cached mode. When in this\n mode the computed property will not automatically cache the return value.\n It also does not automatically fire any change events. You must manually notify\n any changes if you want to observe this property.\n Dependency keys have no effect on volatile properties as they are for cache\n invalidation and notification when cached value is invalidated.\n ```javascript\n import EmberObject, { computed } from '@ember/object';\n let outsideService = EmberObject.extend({\n value: computed(function() {\n return OutsideService.getValue();\n }).volatile()\n }).create();\n ```\n @method volatile\n @return {ComputedProperty} this\n @chainable\n @public\n */\n volatile() {\n this._volatile = true;\n return this;\n }\n /**\n Call on a computed property to set it into read-only mode. When in this\n mode the computed property will throw an error when set.\n ```javascript\n import EmberObject, { computed } from '@ember/object';\n let Person = EmberObject.extend({\n guid: computed(function() {\n return 'guid-guid-guid';\n }).readOnly()\n });\n let person = Person.create();\n person.set('guid', 'new-guid'); // will throw an exception\n ```\n @method readOnly\n @return {ComputedProperty} this\n @chainable\n @public\n */\n readOnly() {\n this._readOnly = true;\n (0, _debug.assert)('Computed properties that define a setter using the new syntax cannot be read-only', !(this._readOnly && this._setter && this._setter !== this._getter));\n return this;\n }\n /**\n Sets the dependent keys on this computed property. Pass any number of\n arguments containing key paths that this computed property depends on.\n ```javascript\n import EmberObject, { computed } from '@ember/object';\n let President = EmberObject.extend({\n fullName: computed('firstName', 'lastName', function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n // Tell Ember that this computed property depends on firstName\n // and lastName\n })\n });\n let president = President.create({\n firstName: 'Barack',\n lastName: 'Obama'\n });\n president.get('fullName'); // 'Barack Obama'\n ```\n @method property\n @param {String} path* zero or more property paths\n @return {ComputedProperty} this\n @chainable\n @public\n */\n property(...passedArgs) {\n let args = [];\n function addArg(property) {\n (0, _debug.warn)(`Dependent keys containing @each only work one level deep. ` + `You used the key \"${property}\" which is invalid. ` + `Please create an intermediary computed property.`, DEEP_EACH_REGEX.test(property) === false, { id: 'ember-metal.computed-deep-each' });\n args.push(property);\n }\n for (let i = 0; i < passedArgs.length; i++) {\n (0, _expand_properties.default)(passedArgs[i], addArg);\n }\n this._dependentKeys = args;\n return this;\n }\n /**\n In some cases, you may want to annotate computed properties with additional\n metadata about how they function or what values they operate on. For example,\n computed property functions may close over variables that are then no longer\n available for introspection.\n You can pass a hash of these values to a computed property like this:\n ```\n import { computed } from '@ember/object';\n import Person from 'my-app/utils/person';\n person: computed(function() {\n let personId = this.get('personId');\n return Person.create({ id: personId });\n }).meta({ type: Person })\n ```\n The hash that you pass to the `meta()` function will be saved on the\n computed property descriptor under the `_meta` key. Ember runtime\n exposes a public API for retrieving these values from classes,\n via the `metaForProperty()` function.\n @method meta\n @param {Object} meta\n @chainable\n @public\n */\n meta(meta) {\n if (arguments.length === 0) {\n return this._meta || {};\n } else {\n this._meta = meta;\n return this;\n }\n }\n // invalidate cache when CP key changes\n didChange(obj, keyName) {\n // _suspended is set via a CP.set to ensure we don't clear\n // the cached value set by the setter\n if (this._volatile || this._suspended === obj) {\n return;\n }\n // don't create objects just to invalidate\n let meta = (0, _meta.peekMeta)(obj);\n if (meta === undefined || meta.source !== obj) {\n return;\n }\n let cache = (0, _computed_cache.peekCacheFor)(obj);\n if (cache !== undefined && cache.delete(keyName)) {\n (0, _dependent_keys.removeDependentKeys)(this, obj, keyName, meta);\n }\n }\n get(obj, keyName) {\n if (this._volatile) {\n return this._getter.call(obj, keyName);\n }\n let cache = (0, _computed_cache.getCacheFor)(obj);\n let propertyTag;\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n propertyTag = (0, _tags.tagForProperty)(obj, keyName);\n if (cache.has(keyName)) {\n // special-case for computed with no dependent keys used to\n // trigger cacheable behavior.\n if (!this._auto && (!this._dependentKeys || this._dependentKeys.length === 0)) {\n return cache.get(keyName);\n }\n let lastRevision = (0, _computed_cache.getLastRevisionFor)(obj, keyName);\n if (propertyTag.validate(lastRevision)) {\n return cache.get(keyName);\n }\n }\n } else {\n if (cache.has(keyName)) {\n return cache.get(keyName);\n }\n }\n let parent;\n let tracker;\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n parent = (0, _tracked.getCurrentTracker)();\n tracker = (0, _tracked.setCurrentTracker)();\n }\n let ret = this._getter.call(obj, keyName);\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n (0, _tracked.setCurrentTracker)(parent);\n let tag = tracker.combine();\n if (parent) parent.add(tag);\n (0, _tags.update)(propertyTag, tag);\n (0, _computed_cache.setLastRevisionFor)(obj, keyName, propertyTag.value());\n }\n cache.set(keyName, ret);\n let meta = (0, _meta.meta)(obj);\n let chainWatchers = meta.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidate(keyName);\n }\n (0, _dependent_keys.addDependentKeys)(this, obj, keyName, meta);\n return ret;\n }\n set(obj, keyName, value) {\n if (this._readOnly) {\n this._throwReadOnlyError(obj, keyName);\n }\n if (!this._setter) {\n return this.clobberSet(obj, keyName, value);\n }\n if (this._volatile) {\n return this.volatileSet(obj, keyName, value);\n }\n return this.setWithSuspend(obj, keyName, value);\n }\n _throwReadOnlyError(obj, keyName) {\n throw new _error.default(`Cannot set read-only property \"${keyName}\" on object: ${(0, _utils.inspect)(obj)}`);\n }\n clobberSet(obj, keyName, value) {\n let cachedValue = (0, _computed_cache.getCachedValueFor)(obj, keyName);\n (0, _properties.defineProperty)(obj, keyName, null, cachedValue);\n (0, _property_set.set)(obj, keyName, value);\n return value;\n }\n volatileSet(obj, keyName, value) {\n return this._setter.call(obj, keyName, value);\n }\n setWithSuspend(obj, keyName, value) {\n let oldSuspended = this._suspended;\n this._suspended = obj;\n try {\n return this._set(obj, keyName, value);\n } finally {\n this._suspended = oldSuspended;\n }\n }\n _set(obj, keyName, value) {\n let cache = (0, _computed_cache.getCacheFor)(obj);\n let hadCachedValue = cache.has(keyName);\n let cachedValue = cache.get(keyName);\n let ret = this._setter.call(obj, keyName, value, cachedValue);\n // allows setter to return the same value that is cached already\n if (hadCachedValue && cachedValue === ret) {\n return ret;\n }\n let meta = (0, _meta.meta)(obj);\n if (!hadCachedValue) {\n (0, _dependent_keys.addDependentKeys)(this, obj, keyName, meta);\n }\n cache.set(keyName, ret);\n (0, _property_events.notifyPropertyChange)(obj, keyName, meta);\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n let propertyTag = (0, _tags.tagForProperty)(obj, keyName);\n (0, _computed_cache.setLastRevisionFor)(obj, keyName, propertyTag.value());\n }\n return ret;\n }\n /* called before property is overridden */\n teardown(obj, keyName, meta) {\n if (this._volatile) {\n return;\n }\n let cache = (0, _computed_cache.peekCacheFor)(obj);\n if (cache !== undefined && cache.delete(keyName)) {\n (0, _dependent_keys.removeDependentKeys)(this, obj, keyName, meta);\n }\n super.teardown(obj, keyName, meta);\n }\n }\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n ComputedProperty.prototype.auto = function () {\n this._auto = true;\n return this;\n };\n }\n /**\n This helper returns a new property descriptor that wraps the passed\n computed property function. You can use this helper to define properties\n with mixins or via `defineProperty()`.\n \n If you pass a function as an argument, it will be used as a getter. A computed\n property defined in this way might look like this:\n \n ```js\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n init() {\n this._super(...arguments);\n \n this.firstName = 'Betty';\n this.lastName = 'Jones';\n },\n \n fullName: computed('firstName', 'lastName', function() {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n })\n });\n \n let client = Person.create();\n \n client.get('fullName'); // 'Betty Jones'\n \n client.set('lastName', 'Fuller');\n client.get('fullName'); // 'Betty Fuller'\n ```\n \n You can pass a hash with two functions, `get` and `set`, as an\n argument to provide both a getter and setter:\n \n ```js\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n init() {\n this._super(...arguments);\n \n this.firstName = 'Betty';\n this.lastName = 'Jones';\n },\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n },\n set(key, value) {\n let [firstName, lastName] = value.split(/\\s+/);\n this.setProperties({ firstName, lastName });\n return value;\n }\n })\n });\n \n let client = Person.create();\n client.get('firstName'); // 'Betty'\n \n client.set('fullName', 'Carroll Fuller');\n client.get('firstName'); // 'Carroll'\n ```\n \n The `set` function should accept two parameters, `key` and `value`. The value\n returned from `set` will be the new value of the property.\n \n _Note: This is the preferred way to define computed properties when writing third-party\n libraries that depend on or use Ember, since there is no guarantee that the user\n will have [prototype Extensions](https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/) enabled._\n \n The alternative syntax, with prototype extensions, might look like:\n \n ```js\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n }.property('firstName', 'lastName')\n ```\n \n @method computed\n @for @ember/object\n @static\n @param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.\n @param {Function} func The computed property function.\n @return {ComputedProperty} property descriptor instance\n @public\n */\n function computed(...args) {\n let func = args.pop();\n let cp = new ComputedProperty(func);\n if (args.length > 0) {\n cp.property(...args);\n }\n return cp;\n }\n // used for the Ember.computed global only\n const _globalsComputed = exports._globalsComputed = computed.bind(null);\n exports.ComputedProperty = ComputedProperty;\n exports.computed = computed;\n});","enifed('@ember/-internals/metal/lib/computed_cache', ['exports', '@ember/canary-features'], function (exports, _canaryFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.getLastRevisionFor = exports.setLastRevisionFor = undefined;\n exports.getCacheFor = getCacheFor;\n exports.getCachedValueFor = getCachedValueFor;\n exports.peekCacheFor = peekCacheFor;\n\n const COMPUTED_PROPERTY_CACHED_VALUES = new WeakMap();\n const COMPUTED_PROPERTY_LAST_REVISION = _canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES ? new WeakMap() : undefined;\n /**\n Returns the cached value for a property, if one exists.\n This can be useful for peeking at the value of a computed\n property that is generated lazily, without accidentally causing\n it to be created.\n \n @method cacheFor\n @static\n @for @ember/object/internals\n @param {Object} obj the object whose property you want to check\n @param {String} key the name of the property whose cached value you want\n to return\n @return {Object} the cached value\n @public\n */\n function getCacheFor(obj) {\n let cache = COMPUTED_PROPERTY_CACHED_VALUES.get(obj);\n if (cache === undefined) {\n cache = new Map();\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n COMPUTED_PROPERTY_LAST_REVISION.set(obj, new Map());\n }\n COMPUTED_PROPERTY_CACHED_VALUES.set(obj, cache);\n }\n return cache;\n }\n function getCachedValueFor(obj, key) {\n let cache = COMPUTED_PROPERTY_CACHED_VALUES.get(obj);\n if (cache !== undefined) {\n return cache.get(key);\n }\n }\n let setLastRevisionFor = exports.setLastRevisionFor = undefined;\n let getLastRevisionFor = exports.getLastRevisionFor = undefined;\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n exports.setLastRevisionFor = setLastRevisionFor = (obj, key, revision) => {\n let lastRevision = COMPUTED_PROPERTY_LAST_REVISION.get(obj);\n lastRevision.set(key, revision);\n };\n exports.getLastRevisionFor = getLastRevisionFor = (obj, key) => {\n let cache = COMPUTED_PROPERTY_LAST_REVISION.get(obj);\n if (cache === undefined) {\n return 0;\n } else {\n let revision = cache.get(key);\n return revision === undefined ? 0 : revision;\n }\n };\n }\n function peekCacheFor(obj) {\n return COMPUTED_PROPERTY_CACHED_VALUES.get(obj);\n }\n});","enifed('@ember/-internals/metal/lib/dependent_keys', ['exports', '@ember/-internals/metal/lib/watching'], function (exports, _watching) {\n 'use strict';\n\n exports.__esModule = true;\n exports.addDependentKeys = addDependentKeys;\n exports.removeDependentKeys = removeDependentKeys;\n\n // ..........................................................\n // DEPENDENT KEYS\n //\n function addDependentKeys(desc, obj, keyName, meta) {\n // the descriptor has a list of dependent keys, so\n // add all of its dependent keys.\n let depKeys = desc._dependentKeys;\n if (depKeys === null || depKeys === undefined) {\n return;\n }\n for (let idx = 0; idx < depKeys.length; idx++) {\n let depKey = depKeys[idx];\n // Increment the number of times depKey depends on keyName.\n meta.writeDeps(depKey, keyName, meta.peekDeps(depKey, keyName) + 1);\n // Watch the depKey\n (0, _watching.watch)(obj, depKey, meta);\n }\n }\n function removeDependentKeys(desc, obj, keyName, meta) {\n // the descriptor has a list of dependent keys, so\n // remove all of its dependent keys.\n let depKeys = desc._dependentKeys;\n if (depKeys === null || depKeys === undefined) {\n return;\n }\n for (let idx = 0; idx < depKeys.length; idx++) {\n let depKey = depKeys[idx];\n // Decrement the number of times depKey depends on keyName.\n meta.writeDeps(depKey, keyName, meta.peekDeps(depKey, keyName) - 1);\n // Unwatch the depKey\n (0, _watching.unwatch)(obj, depKey, meta);\n }\n }\n});","enifed('@ember/-internals/metal/lib/deprecate_property', ['exports', '@ember/debug', '@ember/-internals/metal/lib/property_get', '@ember/-internals/metal/lib/property_set'], function (exports, _debug, _property_get, _property_set) {\n 'use strict';\n\n exports.__esModule = true;\n exports.deprecateProperty = deprecateProperty;\n\n /**\n Used internally to allow changing properties in a backwards compatible way, and print a helpful\n deprecation warning.\n \n @method deprecateProperty\n @param {Object} object The object to add the deprecated property to.\n @param {String} deprecatedKey The property to add (and print deprecation warnings upon accessing).\n @param {String} newKey The property that will be aliased.\n @private\n @since 1.7.0\n */\n function deprecateProperty(object, deprecatedKey, newKey, options) {\n function _deprecate() {\n (0, _debug.deprecate)(`Usage of \\`${deprecatedKey}\\` is deprecated, use \\`${newKey}\\` instead.`, false, options);\n }\n Object.defineProperty(object, deprecatedKey, {\n configurable: true,\n enumerable: false,\n set(value) {\n _deprecate();\n (0, _property_set.set)(this, newKey, value);\n },\n get() {\n _deprecate();\n return (0, _property_get.get)(this, newKey);\n }\n });\n } /**\n @module ember\n */\n});","enifed('@ember/-internals/metal/lib/descriptor', ['exports', '@ember/-internals/metal/lib/properties'], function (exports, _properties) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = descriptor;\n function descriptor(desc) {\n return new NativeDescriptor(desc);\n }\n /**\n A wrapper for a native ES5 descriptor. In an ideal world, we wouldn't need\n this at all, however, the way we currently flatten/merge our mixins require\n a special value to denote a descriptor.\n \n @class NativeDescriptor\n @private\n */\n class NativeDescriptor extends _properties.Descriptor {\n constructor(desc) {\n super();\n this.desc = desc;\n this.enumerable = desc.enumerable !== false;\n this.configurable = desc.configurable !== false;\n }\n setup(obj, key, meta) {\n Object.defineProperty(obj, key, this.desc);\n meta.writeDescriptors(key, this);\n }\n get(obj, key) {\n return obj[key];\n }\n set(obj, key, value) {\n return obj[key] = value;\n }\n }\n});","enifed('@ember/-internals/metal/lib/each_proxy', ['exports', '@ember/-internals/meta', '@ember/debug', '@ember/-internals/metal/lib/array', '@ember/-internals/metal/lib/each_proxy_events', '@ember/-internals/metal/lib/observer', '@ember/-internals/metal/lib/property_events'], function (exports, _meta, _debug, _array, _each_proxy_events, _observer, _property_events) {\n 'use strict';\n\n exports.__esModule = true;\n exports.eachProxyFor = eachProxyFor;\n function eachProxyFor(array) {\n let eachProxy = _each_proxy_events.EACH_PROXIES.get(array);\n if (eachProxy === undefined) {\n eachProxy = new EachProxy(array);\n _each_proxy_events.EACH_PROXIES.set(array, eachProxy);\n }\n return eachProxy;\n }\n class EachProxy {\n constructor(content) {\n this._content = content;\n this._keys = undefined;\n (0, _meta.meta)(this);\n }\n // ..........................................................\n // ARRAY CHANGES\n // Invokes whenever the content array itself changes.\n arrayWillChange(content, idx, removedCnt /*, addedCnt */) {\n // eslint-disable-line no-unused-vars\n let keys = this._keys;\n if (!keys) {\n return;\n }\n let lim = removedCnt > 0 ? idx + removedCnt : -1;\n if (lim > 0) {\n for (let key in keys) {\n removeObserverForContentKey(content, key, this, idx, lim);\n }\n }\n }\n arrayDidChange(content, idx, _removedCnt, addedCnt) {\n let keys = this._keys;\n if (!keys) {\n return;\n }\n let lim = addedCnt > 0 ? idx + addedCnt : -1;\n let meta = (0, _meta.peekMeta)(this);\n for (let key in keys) {\n if (lim > 0) {\n addObserverForContentKey(content, key, this, idx, lim);\n }\n (0, _property_events.notifyPropertyChange)(this, key, meta);\n }\n }\n // ..........................................................\n // LISTEN FOR NEW OBSERVERS AND OTHER EVENT LISTENERS\n // Start monitoring keys based on who is listening...\n willWatchProperty(property) {\n this.beginObservingContentKey(property);\n }\n didUnwatchProperty(property) {\n this.stopObservingContentKey(property);\n }\n // ..........................................................\n // CONTENT KEY OBSERVING\n // Actual watch keys on the source content.\n beginObservingContentKey(keyName) {\n let keys = this._keys;\n if (keys === undefined) {\n keys = this._keys = Object.create(null);\n }\n if (!keys[keyName]) {\n keys[keyName] = 1;\n let content = this._content;\n let len = content.length;\n addObserverForContentKey(content, keyName, this, 0, len);\n } else {\n keys[keyName]++;\n }\n }\n stopObservingContentKey(keyName) {\n let keys = this._keys;\n if (keys !== undefined && keys[keyName] > 0 && --keys[keyName] <= 0) {\n let content = this._content;\n let len = content.length;\n removeObserverForContentKey(content, keyName, this, 0, len);\n }\n }\n contentKeyDidChange(_obj, keyName) {\n (0, _property_events.notifyPropertyChange)(this, keyName);\n }\n }\n function addObserverForContentKey(content, keyName, proxy, idx, loc) {\n while (--loc >= idx) {\n let item = (0, _array.objectAt)(content, loc);\n if (item) {\n (0, _debug.assert)(`When using @each to observe the array \\`${content.toString()}\\`, the array must return an object`, typeof item === 'object');\n (0, _observer.addObserver)(item, keyName, proxy, 'contentKeyDidChange');\n }\n }\n }\n function removeObserverForContentKey(content, keyName, proxy, idx, loc) {\n while (--loc >= idx) {\n let item = (0, _array.objectAt)(content, loc);\n if (item) {\n (0, _observer.removeObserver)(item, keyName, proxy, 'contentKeyDidChange');\n }\n }\n }\n});","enifed(\"@ember/-internals/metal/lib/each_proxy_events\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.eachProxyArrayWillChange = eachProxyArrayWillChange;\n exports.eachProxyArrayDidChange = eachProxyArrayDidChange;\n const EACH_PROXIES = exports.EACH_PROXIES = new WeakMap();\n function eachProxyArrayWillChange(array, idx, removedCnt, addedCnt) {\n let eachProxy = EACH_PROXIES.get(array);\n if (eachProxy !== undefined) {\n eachProxy.arrayWillChange(array, idx, removedCnt, addedCnt);\n }\n }\n function eachProxyArrayDidChange(array, idx, removedCnt, addedCnt) {\n let eachProxy = EACH_PROXIES.get(array);\n if (eachProxy !== undefined) {\n eachProxy.arrayDidChange(array, idx, removedCnt, addedCnt);\n }\n }\n});","enifed('@ember/-internals/metal/lib/events', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/debug'], function (exports, _meta2, _utils, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.addListener = addListener;\n exports.removeListener = removeListener;\n exports.sendEvent = sendEvent;\n exports.hasListeners = hasListeners;\n exports.on = on;\n\n /*\n The event system uses a series of nested hashes to store listeners on an\n object. When a listener is registered, or when an event arrives, these\n hashes are consulted to determine which target and action pair to invoke.\n \n The hashes are stored in the object's meta hash, and look like this:\n \n // Object's meta hash\n {\n listeners: { // variable name: `listenerSet`\n \"foo:change\": [ // variable name: `actions`\n target, method, once\n ]\n }\n }\n \n */\n /**\n Add an event listener\n \n @method addListener\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Object|Function} target A target object or a function\n @param {Function|String} method A function or the name of a function to be called on `target`\n @param {Boolean} once A flag whether a function should only be called once\n @public\n */\n function addListener(obj, eventName, target, method, once) {\n (0, _debug.assert)('You must pass at least an object and event name to addListener', !!obj && !!eventName);\n if (!method && 'function' === typeof target) {\n method = target;\n target = null;\n }\n (0, _meta2.meta)(obj).addToListeners(eventName, target, method, once === true);\n }\n /**\n Remove an event listener\n \n Arguments should match those passed to `addListener`.\n \n @method removeListener\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Object|Function} target A target object or a function\n @param {Function|String} method A function or the name of a function to be called on `target`\n @public\n */\n /**\n @module @ember/object\n */\n function removeListener(obj, eventName, target, method) {\n (0, _debug.assert)('You must pass at least an object and event name to removeListener', !!obj && !!eventName);\n if (!method && 'function' === typeof target) {\n method = target;\n target = null;\n }\n let m = (0, _meta2.meta)(obj);\n if (method === undefined) {\n m.removeAllListeners(eventName);\n } else {\n m.removeFromListeners(eventName, target, method);\n }\n }\n /**\n Send an event. The execution of suspended listeners\n is skipped, and once listeners are removed. A listener without\n a target is executed on the passed object. If an array of actions\n is not passed, the actions stored on the passed object are invoked.\n \n @method sendEvent\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Array} params Optional parameters for each listener.\n @return true\n @public\n */\n function sendEvent(obj, eventName, params, actions, _meta) {\n if (actions === undefined) {\n let meta = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n actions = typeof meta === 'object' && meta !== null && meta.matchingListeners(eventName);\n }\n if (actions === undefined || actions.length === 0) {\n return false;\n }\n for (let i = actions.length - 3; i >= 0; i -= 3) {\n // looping in reverse for once listeners\n let target = actions[i];\n let method = actions[i + 1];\n let once = actions[i + 2];\n if (!method) {\n continue;\n }\n if (once) {\n removeListener(obj, eventName, target, method);\n }\n if (!target) {\n target = obj;\n }\n if ('string' === typeof method) {\n method = target[method];\n }\n method.apply(target, params);\n }\n return true;\n }\n /**\n @private\n @method hasListeners\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n */\n function hasListeners(obj, eventName) {\n let meta = (0, _meta2.peekMeta)(obj);\n if (meta === undefined) {\n return false;\n }\n let matched = meta.matchingListeners(eventName);\n return matched !== undefined && matched.length > 0;\n }\n /**\n Define a property as a function that should be executed when\n a specified event or events are triggered.\n \n ``` javascript\n import EmberObject from '@ember/object';\n import { on } from '@ember/object/evented';\n import { sendEvent } from '@ember/object/events';\n \n let Job = EmberObject.extend({\n logCompleted: on('completed', function() {\n console.log('Job completed!');\n })\n });\n \n let job = Job.create();\n \n sendEvent(job, 'completed'); // Logs 'Job completed!'\n ```\n \n @method on\n @static\n @for @ember/object/evented\n @param {String} eventNames*\n @param {Function} func\n @return func\n @public\n */\n function on(...args) {\n let func = args.pop();\n let events = args;\n (0, _debug.assert)('on expects function as last argument', typeof func === 'function');\n (0, _debug.assert)('on called without valid event names', events.length > 0 && events.every(p => typeof p === 'string' && p.length > 0));\n (0, _utils.setListeners)(func, events);\n return func;\n }\n});","enifed('@ember/-internals/metal/lib/expand_properties', ['exports', '@ember/debug'], function (exports, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = expandProperties;\n\n /**\n @module @ember/object\n */\n const END_WITH_EACH_REGEX = /\\.@each$/;\n /**\n Expands `pattern`, invoking `callback` for each expansion.\n \n The only pattern supported is brace-expansion, anything else will be passed\n once to `callback` directly.\n \n Example\n \n ```js\n import { expandProperties } from '@ember/object/computed';\n \n function echo(arg){ console.log(arg); }\n \n expandProperties('foo.bar', echo); //=> 'foo.bar'\n expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'\n expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'\n expandProperties('{foo,bar}.baz', echo); //=> 'foo.baz', 'bar.baz'\n expandProperties('foo.{bar,baz}.[]', echo) //=> 'foo.bar.[]', 'foo.baz.[]'\n expandProperties('{foo,bar}.{spam,eggs}', echo) //=> 'foo.spam', 'foo.eggs', 'bar.spam', 'bar.eggs'\n expandProperties('{foo}.bar.{baz}') //=> 'foo.bar.baz'\n ```\n \n @method expandProperties\n @static\n @for @ember/object/computed\n @public\n @param {String} pattern The property pattern to expand.\n @param {Function} callback The callback to invoke. It is invoked once per\n expansion, and is passed the expansion.\n */\n function expandProperties(pattern, callback) {\n (0, _debug.assert)(`A computed property key must be a string, you passed ${typeof pattern} ${pattern}`, typeof pattern === 'string');\n (0, _debug.assert)('Brace expanded properties cannot contain spaces, e.g. \"user.{firstName, lastName}\" should be \"user.{firstName,lastName}\"', pattern.indexOf(' ') === -1);\n // regex to look for double open, double close, or unclosed braces\n (0, _debug.assert)(`Brace expanded properties have to be balanced and cannot be nested, pattern: ${pattern}`, pattern.match(/\\{[^}{]*\\{|\\}[^}{]*\\}|\\{[^}]*$/g) === null);\n let start = pattern.indexOf('{');\n if (start < 0) {\n callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));\n } else {\n dive('', pattern, start, callback);\n }\n }\n function dive(prefix, pattern, start, callback) {\n let end = pattern.indexOf('}'),\n i = 0,\n newStart,\n arrayLength;\n let tempArr = pattern.substring(start + 1, end).split(',');\n let after = pattern.substring(end + 1);\n prefix = prefix + pattern.substring(0, start);\n arrayLength = tempArr.length;\n while (i < arrayLength) {\n newStart = after.indexOf('{');\n if (newStart < 0) {\n callback((prefix + tempArr[i++] + after).replace(END_WITH_EACH_REGEX, '.[]'));\n } else {\n dive(prefix + tempArr[i++], after, newStart, callback);\n }\n }\n }\n});","enifed('@ember/-internals/metal/lib/get_properties', ['exports', '@ember/-internals/metal/lib/property_get'], function (exports, _property_get) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = getProperties;\n\n /**\n @module @ember/object\n */\n /**\n To get multiple properties at once, call `getProperties`\n with an object followed by a list of strings or an array:\n \n ```javascript\n import { getProperties } from '@ember/object';\n \n getProperties(record, 'firstName', 'lastName', 'zipCode');\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n \n is equivalent to:\n \n ```javascript\n import { getProperties } from '@ember/object';\n \n getProperties(record, ['firstName', 'lastName', 'zipCode']);\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n \n @method getProperties\n @static\n @for @ember/object\n @param {Object} obj\n @param {String...|Array} list of keys to get\n @return {Object}\n @public\n */\n function getProperties(obj, keys) {\n let ret = {};\n let propertyNames = arguments;\n let i = 1;\n if (arguments.length === 2 && Array.isArray(keys)) {\n i = 0;\n propertyNames = arguments[1];\n }\n for (; i < propertyNames.length; i++) {\n ret[propertyNames[i]] = (0, _property_get.get)(obj, propertyNames[i]);\n }\n return ret;\n }\n});","enifed('@ember/-internals/metal/lib/injected_property', ['exports', '@ember/-internals/meta', '@ember/-internals/owner', '@ember/canary-features', '@ember/debug', '@ember/-internals/metal/lib/computed'], function (exports, _meta, _owner, _canaryFeatures, _debug, _computed) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module ember\n @private\n */\n /**\n Read-only property that returns the result of a container lookup.\n \n @class InjectedProperty\n @namespace Ember\n @constructor\n @param {String} type The container type the property will lookup\n @param {String} name (optional) The name the property will lookup, defaults\n to the property's name\n @private\n */\n class InjectedProperty extends _computed.ComputedProperty {\n constructor(type, name, options) {\n super(injectedPropertyGet);\n this.type = type;\n this.name = name;\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n this.source = options ? options.source : undefined;\n this.namespace = undefined;\n if (name) {\n let namespaceDelimiterOffset = name.indexOf('::');\n if (namespaceDelimiterOffset === -1) {\n this.name = name;\n this.namespace = undefined;\n } else {\n this.name = name.slice(namespaceDelimiterOffset + 2);\n this.namespace = name.slice(0, namespaceDelimiterOffset);\n }\n }\n }\n }\n }\n exports.default = InjectedProperty;\n function injectedPropertyGet(keyName) {\n let desc = (0, _meta.descriptorFor)(this, keyName);\n let owner = (0, _owner.getOwner)(this) || this.container; // fallback to `container` for backwards compat\n (0, _debug.assert)(`InjectedProperties should be defined with the inject computed property macros.`, desc && desc.type);\n (0, _debug.assert)(`Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.`, !!owner);\n let specifier = `${desc.type}:${desc.name || keyName}`;\n return owner.lookup(specifier, {\n source: desc.source,\n namespace: desc.namespace\n });\n }\n});","enifed('@ember/-internals/metal/lib/is_blank', ['exports', '@ember/-internals/metal/lib/is_empty'], function (exports, _is_empty) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = isBlank;\n\n /**\n @module @ember/utils\n */\n /**\n A value is blank if it is empty or a whitespace string.\n \n ```javascript\n import { isBlank } from '@ember/utils';\n \n isBlank(); // true\n isBlank(null); // true\n isBlank(undefined); // true\n isBlank(''); // true\n isBlank([]); // true\n isBlank('\\n\\t'); // true\n isBlank(' '); // true\n isBlank({}); // false\n isBlank('\\n\\t Hello'); // false\n isBlank('Hello world'); // false\n isBlank([1,2,3]); // false\n ```\n \n @method isBlank\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @since 1.5.0\n @public\n */\n function isBlank(obj) {\n return (0, _is_empty.default)(obj) || typeof obj === 'string' && /\\S/.test(obj) === false;\n }\n});","enifed('@ember/-internals/metal/lib/is_empty', ['exports', '@ember/-internals/metal/lib/property_get'], function (exports, _property_get) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = isEmpty;\n\n /**\n @module @ember/utils\n */\n /**\n Verifies that a value is `null` or `undefined`, an empty string, or an empty\n array.\n \n Constrains the rules on `isNone` by returning true for empty strings and\n empty arrays.\n \n If the value is an object with a `size` property of type number, it is used\n to check emptiness.\n \n ```javascript\n isEmpty(); // true\n isEmpty(null); // true\n isEmpty(undefined); // true\n isEmpty(''); // true\n isEmpty([]); // true\n isEmpty({ size: 0}); // true\n isEmpty({}); // false\n isEmpty('Adam Hawkins'); // false\n isEmpty([0,1,2]); // false\n isEmpty('\\n\\t'); // false\n isEmpty(' '); // false\n isEmpty({ size: 1 }) // false\n isEmpty({ size: () => 0 }) // false\n ```\n \n @method isEmpty\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @public\n */\n function isEmpty(obj) {\n let none = obj === null || obj === undefined;\n if (none) {\n return none;\n }\n if (typeof obj.size === 'number') {\n return !obj.size;\n }\n let objectType = typeof obj;\n if (objectType === 'object') {\n let size = (0, _property_get.get)(obj, 'size');\n if (typeof size === 'number') {\n return !size;\n }\n }\n if (typeof obj.length === 'number' && objectType !== 'function') {\n return !obj.length;\n }\n if (objectType === 'object') {\n let length = (0, _property_get.get)(obj, 'length');\n if (typeof length === 'number') {\n return !length;\n }\n }\n return false;\n }\n});","enifed(\"@ember/-internals/metal/lib/is_none\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = isNone;\n /**\n @module @ember/utils\n */\n /**\n Returns true if the passed value is null or undefined. This avoids errors\n from JSLint complaining about use of ==, which can be technically\n confusing.\n \n ```javascript\n isNone(); // true\n isNone(null); // true\n isNone(undefined); // true\n isNone(''); // false\n isNone([]); // false\n isNone(function() {}); // false\n ```\n \n @method isNone\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @public\n */\n function isNone(obj) {\n return obj === null || obj === undefined;\n }\n});","enifed('@ember/-internals/metal/lib/is_present', ['exports', '@ember/-internals/metal/lib/is_blank'], function (exports, _is_blank) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = isPresent;\n\n /**\n @module @ember/utils\n */\n /**\n A value is present if it not `isBlank`.\n \n ```javascript\n isPresent(); // false\n isPresent(null); // false\n isPresent(undefined); // false\n isPresent(''); // false\n isPresent(' '); // false\n isPresent('\\n\\t'); // false\n isPresent([]); // false\n isPresent({ length: 0 }); // false\n isPresent(false); // true\n isPresent(true); // true\n isPresent('string'); // true\n isPresent(0); // true\n isPresent(function() {}); // true\n isPresent({}); // true\n isPresent('\\n\\t Hello'); // true\n isPresent([1, 2, 3]); // true\n ```\n \n @method isPresent\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @since 1.8.0\n @public\n */\n function isPresent(obj) {\n return !(0, _is_blank.default)(obj);\n }\n});","enifed('@ember/-internals/metal/lib/libraries', ['exports', '@ember/canary-features', '@ember/debug', '@glimmer/env', 'ember/version', '@ember/-internals/metal/lib/property_get'], function (exports, _canaryFeatures, _debug, _env, _version, _property_get) {\n 'use strict';\n\n exports.__esModule = true;\n exports.Libraries = undefined;\n\n /**\n @module ember\n */\n /**\n Helper class that allows you to register your library with Ember.\n \n Singleton created at `Ember.libraries`.\n \n @class Libraries\n @constructor\n @private\n */\n class Libraries {\n constructor() {\n this._registry = [];\n this._coreLibIndex = 0;\n }\n _getLibraryByName(name) {\n let libs = this._registry;\n let count = libs.length;\n for (let i = 0; i < count; i++) {\n if (libs[i].name === name) {\n return libs[i];\n }\n }\n return undefined;\n }\n register(name, version, isCoreLibrary) {\n let index = this._registry.length;\n if (!this._getLibraryByName(name)) {\n if (isCoreLibrary) {\n index = this._coreLibIndex++;\n }\n this._registry.splice(index, 0, { name, version });\n } else {\n (0, _debug.warn)(`Library \"${name}\" is already registered with Ember.`, false, {\n id: 'ember-metal.libraries-register'\n });\n }\n }\n registerCoreLibrary(name, version) {\n this.register(name, version, true);\n }\n deRegister(name) {\n let lib = this._getLibraryByName(name);\n let index;\n if (lib) {\n index = this._registry.indexOf(lib);\n this._registry.splice(index, 1);\n }\n }\n }\n exports.Libraries = Libraries;\n if (_canaryFeatures.EMBER_LIBRARIES_ISREGISTERED) {\n Libraries.prototype.isRegistered = function (name) {\n return !!this._getLibraryByName(name);\n };\n }\n if (_env.DEBUG) {\n Libraries.prototype.logVersions = function () {\n let libs = this._registry;\n let nameLengths = libs.map(item => (0, _property_get.get)(item, 'name.length'));\n let maxNameLength = Math.max.apply(null, nameLengths);\n (0, _debug.debug)('-------------------------------');\n for (let i = 0; i < libs.length; i++) {\n let lib = libs[i];\n let spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');\n (0, _debug.debug)([lib.name, spaces, ' : ', lib.version].join(''));\n }\n (0, _debug.debug)('-------------------------------');\n };\n }\n const LIBRARIES = new Libraries();\n LIBRARIES.registerCoreLibrary('Ember', _version.default);\n exports.default = LIBRARIES;\n});","enifed('@ember/-internals/metal/lib/mixin', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/debug', '@ember/polyfills', '@glimmer/env', '@ember/-internals/metal/lib/computed', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/expand_properties', '@ember/-internals/metal/lib/namespace_search', '@ember/-internals/metal/lib/observer', '@ember/-internals/metal/lib/properties'], function (exports, _meta2, _utils, _debug, _polyfills, _env, _computed, _events, _expand_properties, _namespace_search, _observer, _properties) {\n 'use strict';\n\n exports.__esModule = true;\n exports.Mixin = undefined;\n exports.applyMixin = applyMixin;\n exports.mixin = mixin;\n exports.aliasMethod = aliasMethod;\n exports.observer = observer;\n\n const a_concat = Array.prototype.concat; /**\n @module @ember/object\n */\n\n const { isArray } = Array;\n function isMethod(obj) {\n return 'function' === typeof obj && obj.isMethod !== false && obj !== Boolean && obj !== Object && obj !== Number && obj !== Array && obj !== Date && obj !== String;\n }\n const CONTINUE = {};\n function mixinProperties(mixinsMeta, mixin) {\n if (mixin instanceof Mixin) {\n if (mixinsMeta.hasMixin(mixin)) {\n return CONTINUE;\n }\n mixinsMeta.addMixin(mixin);\n return mixin.properties;\n } else {\n return mixin; // apply anonymous mixin properties\n }\n }\n function concatenatedMixinProperties(concatProp, props, values, base) {\n // reset before adding each new mixin to pickup concats from previous\n let concats = values[concatProp] || base[concatProp];\n if (props[concatProp]) {\n concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];\n }\n return concats;\n }\n function giveDescriptorSuper(meta, key, property, values, descs, base) {\n let superProperty;\n // Computed properties override methods, and do not call super to them\n if (values[key] === undefined) {\n // Find the original descriptor in a parent mixin\n superProperty = descs[key];\n }\n // If we didn't find the original descriptor in a parent mixin, find\n // it on the original object.\n if (!superProperty) {\n superProperty = (0, _meta2.descriptorFor)(base, key, meta);\n }\n if (superProperty === undefined || !(superProperty instanceof _computed.ComputedProperty)) {\n return property;\n }\n // Since multiple mixins may inherit from the same parent, we need\n // to clone the computed property so that other mixins do not receive\n // the wrapped version.\n property = Object.create(property);\n property._getter = (0, _utils.wrap)(property._getter, superProperty._getter);\n if (superProperty._setter) {\n if (property._setter) {\n property._setter = (0, _utils.wrap)(property._setter, superProperty._setter);\n } else {\n property._setter = superProperty._setter;\n }\n }\n return property;\n }\n function giveMethodSuper(obj, key, method, values, descs) {\n // Methods overwrite computed properties, and do not call super to them.\n if (descs[key] !== undefined) {\n return method;\n }\n // Find the original method in a parent mixin\n let superMethod = values[key];\n // If we didn't find the original value in a parent mixin, find it in\n // the original object\n if (superMethod === undefined && (0, _meta2.descriptorFor)(obj, key) === undefined) {\n superMethod = obj[key];\n }\n // Only wrap the new method if the original method was a function\n if (typeof superMethod === 'function') {\n return (0, _utils.wrap)(method, superMethod);\n }\n return method;\n }\n function applyConcatenatedProperties(obj, key, value, values) {\n let baseValue = values[key] || obj[key];\n let ret = (0, _utils.makeArray)(baseValue).concat((0, _utils.makeArray)(value));\n if (_env.DEBUG) {\n // it is possible to use concatenatedProperties with strings (which cannot be frozen)\n // only freeze objects...\n if (typeof ret === 'object' && ret !== null) {\n // prevent mutating `concatenatedProperties` array after it is applied\n Object.freeze(ret);\n }\n }\n return ret;\n }\n function applyMergedProperties(obj, key, value, values) {\n let baseValue = values[key] || obj[key];\n (0, _debug.assert)(`You passed in \\`${JSON.stringify(value)}\\` as the value for \\`${key}\\` but \\`${key}\\` cannot be an Array`, !isArray(value));\n if (!baseValue) {\n return value;\n }\n let newBase = (0, _polyfills.assign)({}, baseValue);\n let hasFunction = false;\n for (let prop in value) {\n if (!value.hasOwnProperty(prop)) {\n continue;\n }\n let propValue = value[prop];\n if (isMethod(propValue)) {\n // TODO: support for Computed Properties, etc?\n hasFunction = true;\n newBase[prop] = giveMethodSuper(obj, prop, propValue, baseValue, {});\n } else {\n newBase[prop] = propValue;\n }\n }\n if (hasFunction) {\n newBase._super = _utils.ROOT;\n }\n return newBase;\n }\n function addNormalizedProperty(base, key, value, meta, descs, values, concats, mergings) {\n if (value instanceof _properties.Descriptor) {\n // Wrap descriptor function to implement\n // _super() if needed\n if (value._getter) {\n value = giveDescriptorSuper(meta, key, value, values, descs, base);\n }\n descs[key] = value;\n values[key] = undefined;\n } else {\n if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {\n value = applyConcatenatedProperties(base, key, value, values);\n } else if (mergings && mergings.indexOf(key) > -1) {\n value = applyMergedProperties(base, key, value, values);\n } else if (isMethod(value)) {\n value = giveMethodSuper(base, key, value, values, descs);\n }\n descs[key] = undefined;\n values[key] = value;\n }\n }\n function mergeMixins(mixins, meta, descs, values, base, keys) {\n let currentMixin, props, key, concats, mergings;\n function removeKeys(keyName) {\n delete descs[keyName];\n delete values[keyName];\n }\n for (let i = 0; i < mixins.length; i++) {\n currentMixin = mixins[i];\n (0, _debug.assert)(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(currentMixin)}`, typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');\n props = mixinProperties(meta, currentMixin);\n if (props === CONTINUE) {\n continue;\n }\n if (props) {\n // remove willMergeMixin after 3.4 as it was used for _actions\n if (base.willMergeMixin) {\n base.willMergeMixin(props);\n }\n concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);\n mergings = concatenatedMixinProperties('mergedProperties', props, values, base);\n for (key in props) {\n if (!props.hasOwnProperty(key)) {\n continue;\n }\n keys.push(key);\n addNormalizedProperty(base, key, props[key], meta, descs, values, concats, mergings);\n }\n // manually copy toString() because some JS engines do not enumerate it\n if (props.hasOwnProperty('toString')) {\n base.toString = props.toString;\n }\n } else if (currentMixin.mixins) {\n mergeMixins(currentMixin.mixins, meta, descs, values, base, keys);\n if (currentMixin._without) {\n currentMixin._without.forEach(removeKeys);\n }\n }\n }\n }\n function followAlias(obj, desc, descs, values) {\n let altKey = desc.methodName;\n let value;\n let possibleDesc;\n if (descs[altKey] || values[altKey]) {\n value = values[altKey];\n desc = descs[altKey];\n } else if ((possibleDesc = (0, _meta2.descriptorFor)(obj, altKey)) !== undefined) {\n desc = possibleDesc;\n value = undefined;\n } else {\n desc = undefined;\n value = obj[altKey];\n }\n return { desc, value };\n }\n function updateObserversAndListeners(obj, key, paths, updateMethod) {\n if (paths) {\n for (let i = 0; i < paths.length; i++) {\n updateMethod(obj, paths[i], null, key);\n }\n }\n }\n function replaceObserversAndListeners(obj, key, prev, next) {\n if (typeof prev === 'function') {\n updateObserversAndListeners(obj, key, (0, _utils.getObservers)(prev), _observer.removeObserver);\n updateObserversAndListeners(obj, key, (0, _utils.getListeners)(prev), _events.removeListener);\n }\n if (typeof next === 'function') {\n updateObserversAndListeners(obj, key, (0, _utils.getObservers)(next), _observer.addObserver);\n updateObserversAndListeners(obj, key, (0, _utils.getListeners)(next), _events.addListener);\n }\n }\n function applyMixin(obj, mixins) {\n let descs = {};\n let values = {};\n let meta = (0, _meta2.meta)(obj);\n let keys = [];\n let key, value, desc;\n obj._super = _utils.ROOT;\n // Go through all mixins and hashes passed in, and:\n //\n // * Handle concatenated properties\n // * Handle merged properties\n // * Set up _super wrapping if necessary\n // * Set up computed property descriptors\n // * Copying `toString` in broken browsers\n mergeMixins(mixins, meta, descs, values, obj, keys);\n for (let i = 0; i < keys.length; i++) {\n key = keys[i];\n if (key === 'constructor' || !values.hasOwnProperty(key)) {\n continue;\n }\n desc = descs[key];\n value = values[key];\n while (desc && desc instanceof Alias) {\n let followed = followAlias(obj, desc, descs, values);\n desc = followed.desc;\n value = followed.value;\n }\n if (desc === undefined && value === undefined) {\n continue;\n }\n if ((0, _meta2.descriptorFor)(obj, key) !== undefined) {\n replaceObserversAndListeners(obj, key, null, value);\n } else {\n replaceObserversAndListeners(obj, key, obj[key], value);\n }\n (0, _properties.defineProperty)(obj, key, desc, value, meta);\n }\n return obj;\n }\n /**\n @method mixin\n @param obj\n @param mixins*\n @return obj\n @private\n */\n function mixin(obj, ...args) {\n applyMixin(obj, args);\n return obj;\n }\n /**\n The `Mixin` class allows you to create mixins, whose properties can be\n added to other classes. For instance,\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n \n const EditableMixin = Mixin.create({\n edit() {\n console.log('starting to edit');\n this.set('isEditing', true);\n },\n isEditing: false\n });\n ```\n \n ```javascript\n import EmberObject from '@ember/object';\n import EditableMixin from '../mixins/editable';\n \n // Mix mixins into classes by passing them as the first arguments to\n // `.extend.`\n const Comment = EmberObject.extend(EditableMixin, {\n post: null\n });\n \n let comment = Comment.create({\n post: somePost\n });\n \n comment.edit(); // outputs 'starting to edit'\n ```\n \n Note that Mixins are created with `Mixin.create`, not\n `Mixin.extend`.\n \n Note that mixins extend a constructor's prototype so arrays and object literals\n defined as properties will be shared amongst objects that implement the mixin.\n If you want to define a property in a mixin that is not shared, you can define\n it either as a computed property or have it be created on initialization of the object.\n \n ```javascript\n // filters array will be shared amongst any object implementing mixin\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n \n const FilterableMixin = Mixin.create({\n filters: A()\n });\n ```\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n import { computed } from '@ember/object';\n \n // filters will be a separate array for every object implementing the mixin\n const FilterableMixin = Mixin.create({\n filters: computed(function() {\n return A();\n })\n });\n ```\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n \n // filters will be created as a separate array during the object's initialization\n const Filterable = Mixin.create({\n filters: null,\n \n init() {\n this._super(...arguments);\n this.set(\"filters\", A());\n }\n });\n ```\n \n @class Mixin\n @public\n */\n class Mixin {\n constructor(mixins, properties) {\n this.properties = properties;\n this.mixins = buildMixinsArray(mixins);\n this.ownerConstructor = undefined;\n this._without = undefined;\n if (_env.DEBUG) {\n this[_utils.NAME_KEY] = undefined;\n /*\n In debug builds, we seal mixins to help avoid performance pitfalls.\n In IE11 there is a quirk that prevents sealed objects from being added\n to a WeakMap. Unfortunately, the mixin system currently relies on\n weak maps in `guidFor`, so we need to prime the guid cache weak map.\n */\n (0, _utils.guidFor)(this);\n Object.seal(this);\n }\n }\n /**\n @method create\n @for @ember/object/mixin\n @static\n @param arguments*\n @public\n */\n static create(...args) {\n // ES6TODO: this relies on a global state?\n (0, _namespace_search.setUnprocessedMixins)();\n let M = this;\n return new M(args, undefined);\n }\n // returns the mixins currently applied to the specified object\n // TODO: Make `mixin`\n static mixins(obj) {\n let meta = (0, _meta2.peekMeta)(obj);\n let ret = [];\n if (meta === undefined) {\n return ret;\n }\n meta.forEachMixins(currentMixin => {\n // skip primitive mixins since these are always anonymous\n if (!currentMixin.properties) {\n ret.push(currentMixin);\n }\n });\n return ret;\n }\n /**\n @method reopen\n @param arguments*\n @private\n */\n reopen(...args) {\n if (args.length === 0) {\n return;\n }\n if (this.properties) {\n let currentMixin = new Mixin(undefined, this.properties);\n this.properties = undefined;\n this.mixins = [currentMixin];\n } else if (!this.mixins) {\n this.mixins = [];\n }\n this.mixins = this.mixins.concat(buildMixinsArray(args));\n return this;\n }\n /**\n @method apply\n @param obj\n @return applied object\n @private\n */\n apply(obj) {\n return applyMixin(obj, [this]);\n }\n applyPartial(obj) {\n return applyMixin(obj, [this]);\n }\n /**\n @method detect\n @param obj\n @return {Boolean}\n @private\n */\n detect(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n if (obj instanceof Mixin) {\n return _detect(obj, this);\n }\n let meta = (0, _meta2.peekMeta)(obj);\n if (meta === undefined) {\n return false;\n }\n return meta.hasMixin(this);\n }\n without(...args) {\n let ret = new Mixin([this]);\n ret._without = args;\n return ret;\n }\n keys() {\n return _keys(this);\n }\n toString() {\n return '(unknown mixin)';\n }\n }\n exports.default = Mixin;\n function buildMixinsArray(mixins) {\n let length = mixins && mixins.length || 0;\n let m = undefined;\n if (length > 0) {\n m = new Array(length);\n for (let i = 0; i < length; i++) {\n let x = mixins[i];\n (0, _debug.assert)(`Expected hash or Mixin instance, got ${Object.prototype.toString.call(x)}`, typeof x === 'object' && x !== null && Object.prototype.toString.call(x) !== '[object Array]');\n if (x instanceof Mixin) {\n m[i] = x;\n } else {\n m[i] = new Mixin(undefined, x);\n }\n }\n }\n return m;\n }\n Mixin.prototype.toString = _namespace_search.classToString;\n if (_env.DEBUG) {\n Mixin.prototype[_utils.NAME_KEY] = undefined;\n Object.seal(Mixin.prototype);\n }\n function _detect(curMixin, targetMixin, seen = new Set()) {\n if (seen.has(curMixin)) {\n return false;\n }\n seen.add(curMixin);\n if (curMixin === targetMixin) {\n return true;\n }\n let mixins = curMixin.mixins;\n if (mixins) {\n return mixins.some(mixin => _detect(mixin, targetMixin, seen));\n }\n return false;\n }\n function _keys(mixin, ret = new Set(), seen = new Set()) {\n if (seen.has(mixin)) {\n return;\n }\n seen.add(mixin);\n if (mixin.properties) {\n let props = Object.keys(mixin.properties);\n for (let i = 0; i < props.length; i++) {\n ret.add(props[i]);\n }\n } else if (mixin.mixins) {\n mixin.mixins.forEach(x => _keys(x, ret, seen));\n }\n return ret;\n }\n class Alias extends _properties.Descriptor {\n constructor(methodName) {\n super();\n this.methodName = methodName;\n }\n teardown(_obj, _keyName, _meta) {\n throw new Error('Method not implemented.');\n }\n get(_obj, _keyName) {\n throw new Error('Method not implemented.');\n }\n set(_obj, _keyName, _value) {\n throw new Error('Method not implemented.');\n }\n }\n /**\n Makes a method available via an additional name.\n \n ```app/utils/person.js\n import EmberObject, {\n aliasMethod\n } from '@ember/object';\n \n export default EmberObject.extend({\n name() {\n return 'Tomhuda Katzdale';\n },\n moniker: aliasMethod('name')\n });\n ```\n \n ```javascript\n let goodGuy = Person.create();\n \n goodGuy.name(); // 'Tomhuda Katzdale'\n goodGuy.moniker(); // 'Tomhuda Katzdale'\n ```\n \n @method aliasMethod\n @static\n @for @ember/object\n @param {String} methodName name of the method to alias\n @public\n */\n function aliasMethod(methodName) {\n return new Alias(methodName);\n }\n // ..........................................................\n // OBSERVER HELPER\n //\n /**\n Specify a method that observes property changes.\n \n ```javascript\n import EmberObject from '@ember/object';\n import { observer } from '@ember/object';\n \n export default EmberObject.extend({\n valueObserver: observer('value', function() {\n // Executes whenever the \"value\" property changes\n })\n });\n ```\n \n Also available as `Function.prototype.observes` if prototype extensions are\n enabled.\n \n @method observer\n @for @ember/object\n @param {String} propertyNames*\n @param {Function} func\n @return func\n @public\n @static\n */\n function observer(...args) {\n let func = args.pop();\n let _paths = args;\n (0, _debug.assert)('observer called without a function', typeof func === 'function');\n (0, _debug.assert)('observer called without valid path', _paths.length > 0 && _paths.every(p => typeof p === 'string' && !!p.length));\n let paths = [];\n let addWatchedProperty = path => paths.push(path);\n for (let i = 0; i < _paths.length; ++i) {\n (0, _expand_properties.default)(_paths[i], addWatchedProperty);\n }\n (0, _utils.setObservers)(func, paths);\n return func;\n }\n exports.Mixin = Mixin;\n});","enifed('@ember/-internals/metal/lib/namespace_search', ['exports', '@ember/-internals/environment', '@ember/-internals/utils'], function (exports, _environment, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.NAMESPACES_BY_ID = exports.NAMESPACES = undefined;\n exports.addNamespace = addNamespace;\n exports.removeNamespace = removeNamespace;\n exports.findNamespaces = findNamespaces;\n exports.findNamespace = findNamespace;\n exports.processNamespace = processNamespace;\n exports.processAllNamespaces = processAllNamespaces;\n exports.classToString = classToString;\n exports.isSearchDisabled = isSearchDisabled;\n exports.setSearchDisabled = setSearchDisabled;\n exports.setUnprocessedMixins = setUnprocessedMixins;\n\n // TODO, this only depends on context, otherwise it could be in utils\n // move into its own package\n // it is needed by Mixin for classToString\n // maybe move it into environment\n const hasOwnProperty = Object.prototype.hasOwnProperty;\n let searchDisabled = false;\n const flags = {\n _set: 0,\n _unprocessedNamespaces: false,\n get unprocessedNamespaces() {\n return this._unprocessedNamespaces;\n },\n set unprocessedNamespaces(v) {\n this._set++;\n this._unprocessedNamespaces = v;\n }\n };\n let unprocessedMixins = false;\n const NAMESPACES = exports.NAMESPACES = [];\n const NAMESPACES_BY_ID = exports.NAMESPACES_BY_ID = Object.create(null);\n function addNamespace(namespace) {\n flags.unprocessedNamespaces = true;\n NAMESPACES.push(namespace);\n }\n function removeNamespace(namespace) {\n let name = (0, _utils.getName)(namespace);\n delete NAMESPACES_BY_ID[name];\n NAMESPACES.splice(NAMESPACES.indexOf(namespace), 1);\n if (name in _environment.context.lookup && namespace === _environment.context.lookup[name]) {\n _environment.context.lookup[name] = undefined;\n }\n }\n function findNamespaces() {\n if (!flags.unprocessedNamespaces) {\n return;\n }\n let lookup = _environment.context.lookup;\n let keys = Object.keys(lookup);\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n // Only process entities that start with uppercase A-Z\n if (!isUppercase(key.charCodeAt(0))) {\n continue;\n }\n let obj = tryIsNamespace(lookup, key);\n if (obj) {\n (0, _utils.setName)(obj, key);\n }\n }\n }\n function findNamespace(name) {\n if (!searchDisabled) {\n processAllNamespaces();\n }\n return NAMESPACES_BY_ID[name];\n }\n function processNamespace(namespace) {\n _processNamespace([namespace.toString()], namespace, new Set());\n }\n function processAllNamespaces() {\n let unprocessedNamespaces = flags.unprocessedNamespaces;\n if (unprocessedNamespaces) {\n findNamespaces();\n flags.unprocessedNamespaces = false;\n }\n if (unprocessedNamespaces || unprocessedMixins) {\n let namespaces = NAMESPACES;\n for (let i = 0; i < namespaces.length; i++) {\n processNamespace(namespaces[i]);\n }\n unprocessedMixins = false;\n }\n }\n function classToString() {\n let name = (0, _utils.getName)(this);\n if (name !== void 0) {\n return name;\n }\n name = calculateToString(this);\n (0, _utils.setName)(this, name);\n return name;\n }\n function isSearchDisabled() {\n return searchDisabled;\n }\n function setSearchDisabled(flag) {\n searchDisabled = !!flag;\n }\n function setUnprocessedMixins() {\n unprocessedMixins = true;\n }\n function _processNamespace(paths, root, seen) {\n let idx = paths.length;\n let id = paths.join('.');\n NAMESPACES_BY_ID[id] = root;\n (0, _utils.setName)(root, id);\n // Loop over all of the keys in the namespace, looking for classes\n for (let key in root) {\n if (!hasOwnProperty.call(root, key)) {\n continue;\n }\n let obj = root[key];\n // If we are processing the `Ember` namespace, for example, the\n // `paths` will start with `[\"Ember\"]`. Every iteration through\n // the loop will update the **second** element of this list with\n // the key, so processing `Ember.View` will make the Array\n // `['Ember', 'View']`.\n paths[idx] = key;\n // If we have found an unprocessed class\n if (obj && obj.toString === classToString && (0, _utils.getName)(obj) === void 0) {\n // Replace the class' `toString` with the dot-separated path\n (0, _utils.setName)(obj, paths.join('.'));\n // Support nested namespaces\n } else if (obj && obj.isNamespace) {\n // Skip aliased namespaces\n if (seen.has(obj)) {\n continue;\n }\n seen.add(obj);\n // Process the child namespace\n _processNamespace(paths, obj, seen);\n }\n }\n paths.length = idx; // cut out last item\n }\n function isUppercase(code) {\n return code >= 65 && code <= 90 // A\n ; // Z\n }\n function tryIsNamespace(lookup, prop) {\n try {\n let obj = lookup[prop];\n return (obj !== null && typeof obj === 'object' || typeof obj === 'function') && obj.isNamespace && obj;\n } catch (e) {\n // continue\n }\n }\n function calculateToString(target) {\n let str;\n if (!searchDisabled) {\n processAllNamespaces();\n str = (0, _utils.getName)(target);\n if (str !== void 0) {\n return str;\n }\n let superclass = target;\n do {\n superclass = Object.getPrototypeOf(superclass);\n if (superclass === Function.prototype || superclass === Object.prototype) {\n break;\n }\n str = (0, _utils.getName)(target);\n if (str !== void 0) {\n str = `(subclass of ${str})`;\n break;\n }\n } while (str === void 0);\n }\n return str || '(unknown)';\n }\n});","enifed('@ember/-internals/metal/lib/observer', ['exports', '@ember/-internals/metal/lib/change_event', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/watching'], function (exports, _change_event, _events, _watching) {\n 'use strict';\n\n exports.__esModule = true;\n exports.addObserver = addObserver;\n exports.removeObserver = removeObserver;\n\n /**\n @module @ember/object\n */\n /**\n @method addObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} path\n @param {Object|Function} target\n @param {Function|String} [method]\n @public\n */\n function addObserver(obj, path, target, method) {\n (0, _events.addListener)(obj, (0, _change_event.default)(path), target, method);\n (0, _watching.watch)(obj, path);\n }\n /**\n @method removeObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} path\n @param {Object|Function} target\n @param {Function|String} [method]\n @public\n */\n function removeObserver(obj, path, target, method) {\n (0, _watching.unwatch)(obj, path);\n (0, _events.removeListener)(obj, (0, _change_event.default)(path), target, method);\n }\n});","enifed('@ember/-internals/metal/lib/observer_set', ['exports', '@ember/-internals/metal/lib/events'], function (exports, _events) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n ObserverSet is a data structure used to keep track of observers\n that have been deferred.\n \n It ensures that observers are called in the same order that they\n were initially triggered.\n \n It also ensures that observers for any object-key pairs are called\n only once, even if they were triggered multiple times while\n deferred. In this case, the order that the observer is called in\n will depend on the first time the observer was triggered.\n \n @private\n @class ObserverSet\n */\n class ObserverSet {\n constructor() {\n this.added = new Map();\n this.queue = [];\n }\n add(object, key, event) {\n let keys = this.added.get(object);\n if (keys === undefined) {\n keys = new Set();\n this.added.set(object, keys);\n }\n if (!keys.has(key)) {\n this.queue.push(object, key, event);\n keys.add(key);\n }\n }\n flush() {\n // The queue is saved off to support nested flushes.\n let queue = this.queue;\n this.added.clear();\n this.queue = [];\n for (let i = 0; i < queue.length; i += 3) {\n let object = queue[i];\n let key = queue[i + 1];\n let event = queue[i + 2];\n if (object.isDestroying || object.isDestroyed) {\n continue;\n }\n (0, _events.sendEvent)(object, event, [object, key]);\n }\n }\n }\n exports.default = ObserverSet;\n});","enifed('@ember/-internals/metal/lib/path_cache', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isPath = isPath;\n\n const firstDotIndexCache = new _utils.Cache(1000, key => key.indexOf('.'));\n function isPath(path) {\n return typeof path === 'string' && firstDotIndexCache.get(path) !== -1;\n }\n});","enifed('@ember/-internals/metal/lib/properties', ['exports', '@ember/-internals/meta', '@ember/debug', '@glimmer/env', '@ember/-internals/metal/lib/property_events'], function (exports, _meta, _debug, _env, _property_events) {\n 'use strict';\n\n exports.__esModule = true;\n exports.Descriptor = undefined;\n exports.MANDATORY_SETTER_FUNCTION = MANDATORY_SETTER_FUNCTION;\n exports.DEFAULT_GETTER_FUNCTION = DEFAULT_GETTER_FUNCTION;\n exports.INHERITING_GETTER_FUNCTION = INHERITING_GETTER_FUNCTION;\n exports.defineProperty = defineProperty;\n\n // ..........................................................\n // DESCRIPTOR\n //\n /**\n Objects of this type can implement an interface to respond to requests to\n get and set. The default implementation handles simple properties.\n \n @class Descriptor\n @private\n */\n /**\n @module @ember/object\n */\n class Descriptor {\n constructor() {\n this.isDescriptor = true;\n this.enumerable = true;\n this.configurable = true;\n }\n setup(obj, keyName, meta) {\n Object.defineProperty(obj, keyName, {\n enumerable: this.enumerable,\n configurable: this.configurable,\n get: DESCRIPTOR_GETTER_FUNCTION(keyName, this)\n });\n meta.writeDescriptors(keyName, this);\n }\n teardown(_obj, keyName, meta) {\n meta.removeDescriptors(keyName);\n }\n }\n exports.Descriptor = Descriptor;\n // ..........................................................\n // DEFINING PROPERTIES API\n //\n function MANDATORY_SETTER_FUNCTION(name) {\n function SETTER_FUNCTION(value) {\n let m = (0, _meta.peekMeta)(this);\n if (m.isInitializing() || m.isPrototypeMeta(this)) {\n m.writeValues(name, value);\n } else {\n (0, _debug.assert)(`You must use set() to set the \\`${name}\\` property (of ${this}) to \\`${value}\\`.`, false);\n }\n }\n return Object.assign(SETTER_FUNCTION, { isMandatorySetter: true });\n }\n function DEFAULT_GETTER_FUNCTION(name) {\n return function GETTER_FUNCTION() {\n let meta = (0, _meta.peekMeta)(this);\n if (meta !== undefined) {\n return meta.peekValues(name);\n }\n };\n }\n function INHERITING_GETTER_FUNCTION(name) {\n function IGETTER_FUNCTION() {\n let meta = (0, _meta.peekMeta)(this);\n let val;\n if (meta !== undefined) {\n val = meta.readInheritedValue('values', name);\n }\n if (val === _meta.UNDEFINED) {\n let proto = Object.getPrototypeOf(this);\n return proto && proto[name];\n } else {\n return val;\n }\n }\n return Object.assign(IGETTER_FUNCTION, {\n isInheritingGetter: true\n });\n }\n function DESCRIPTOR_GETTER_FUNCTION(name, descriptor) {\n return function CPGETTER_FUNCTION() {\n return descriptor.get(this, name);\n };\n }\n /**\n NOTE: This is a low-level method used by other parts of the API. You almost\n never want to call this method directly. Instead you should use\n `mixin()` to define new properties.\n \n Defines a property on an object. This method works much like the ES5\n `Object.defineProperty()` method except that it can also accept computed\n properties and other special descriptors.\n \n Normally this method takes only three parameters. However if you pass an\n instance of `Descriptor` as the third param then you can pass an\n optional value as the fourth parameter. This is often more efficient than\n creating new descriptor hashes for each property.\n \n ## Examples\n \n ```javascript\n import { defineProperty, computed } from '@ember/object';\n \n // ES5 compatible mode\n defineProperty(contact, 'firstName', {\n writable: true,\n configurable: false,\n enumerable: true,\n value: 'Charles'\n });\n \n // define a simple property\n defineProperty(contact, 'lastName', undefined, 'Jolley');\n \n // define a computed property\n defineProperty(contact, 'fullName', computed('firstName', 'lastName', function() {\n return this.firstName+' '+this.lastName;\n }));\n ```\n \n @private\n @method defineProperty\n @static\n @for @ember/object\n @param {Object} obj the object to define this property on. This may be a prototype.\n @param {String} keyName the name of the property\n @param {Descriptor} [desc] an instance of `Descriptor` (typically a\n computed property) or an ES5 descriptor.\n You must provide this or `data` but not both.\n @param {*} [data] something other than a descriptor, that will\n become the explicit value of this property.\n */\n function defineProperty(obj, keyName, desc, data, meta) {\n if (meta === undefined) {\n meta = (0, _meta.meta)(obj);\n }\n let watching = meta.peekWatching(keyName) > 0;\n let previousDesc = (0, _meta.descriptorFor)(obj, keyName, meta);\n let wasDescriptor = previousDesc !== undefined;\n if (wasDescriptor) {\n previousDesc.teardown(obj, keyName, meta);\n }\n // used to track if the the property being defined be enumerable\n let enumerable = true;\n // Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled\n // mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant\n // issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).\n //\n // this is a hack, and we should stop mutating the array prototype by default 😫\n if (obj === Array.prototype) {\n enumerable = false;\n }\n let value;\n if (desc instanceof Descriptor) {\n value = desc;\n desc.setup(obj, keyName, meta);\n } else if (desc === undefined || desc === null) {\n value = data;\n if (_env.DEBUG && watching) {\n meta.writeValues(keyName, data);\n let defaultDescriptor = {\n configurable: true,\n enumerable,\n set: MANDATORY_SETTER_FUNCTION(keyName),\n get: DEFAULT_GETTER_FUNCTION(keyName)\n };\n Object.defineProperty(obj, keyName, defaultDescriptor);\n } else if (wasDescriptor || enumerable === false) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable,\n writable: true,\n value\n });\n } else {\n obj[keyName] = data;\n }\n } else {\n value = desc;\n // fallback to ES5\n Object.defineProperty(obj, keyName, desc);\n }\n // if key is being watched, override chains that\n // were initialized with the prototype\n if (watching) {\n (0, _property_events.overrideChains)(obj, keyName, meta);\n }\n // The `value` passed to the `didDefineProperty` hook is\n // either the descriptor or data, whichever was passed.\n if (typeof obj.didDefineProperty === 'function') {\n obj.didDefineProperty(obj, keyName, value);\n }\n }\n});","enifed('@ember/-internals/metal/lib/property_events', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/debug', '@ember/deprecated-features', '@glimmer/env', '@ember/-internals/metal/lib/change_event', '@ember/-internals/metal/lib/events', '@ember/-internals/metal/lib/observer_set', '@ember/-internals/metal/lib/tags', '@ember/-internals/metal/lib/transaction'], function (exports, _meta2, _utils, _debug, _deprecatedFeatures, _env, _change_event, _events, _observer_set, _tags, _transaction) {\n 'use strict';\n\n exports.__esModule = true;\n exports.changeProperties = exports.endPropertyChanges = exports.beginPropertyChanges = exports.overrideChains = exports.notifyPropertyChange = exports.propertyDidChange = exports.propertyWillChange = exports.PROPERTY_DID_CHANGE = undefined;\n\n /**\n @module ember\n @private\n */\n const PROPERTY_DID_CHANGE = exports.PROPERTY_DID_CHANGE = (0, _utils.symbol)('PROPERTY_DID_CHANGE');\n const observerSet = new _observer_set.default();\n let deferred = 0;\n // ..........................................................\n // PROPERTY CHANGES\n //\n /**\n @method propertyWillChange\n @for Ember\n @private\n */\n let propertyWillChange;\n if (_deprecatedFeatures.PROPERTY_WILL_CHANGE) {\n exports.propertyWillChange = propertyWillChange = function propertyWillChange() {\n (0, _debug.deprecate)(`'propertyWillChange' is deprecated and has no effect. It is safe to remove this call.`, false, {\n id: 'ember-metal.deprecate-propertyWillChange',\n until: '3.5.0',\n url: 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange'\n });\n };\n }\n /**\n @method propertyDidChange\n @for Ember\n @private\n */\n let propertyDidChange;\n if (_deprecatedFeatures.PROPERTY_DID_CHANGE) {\n exports.propertyDidChange = propertyDidChange = function propertyDidChange(obj, keyName, _meta) {\n (0, _debug.deprecate)(`'propertyDidChange' is deprecated in favor of 'notifyPropertyChange'. It is safe to change this call to 'notifyPropertyChange'.`, false, {\n id: 'ember-metal.deprecate-propertyDidChange',\n until: '3.5.0',\n url: 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange'\n });\n notifyPropertyChange(obj, keyName, _meta);\n };\n }\n /**\n This function is called just after an object property has changed.\n It will notify any observers and clear caches among other things.\n \n Normally you will not need to call this method directly but if for some\n reason you can't directly watch a property you can invoke this method\n manually.\n \n @method notifyPropertyChange\n @for Ember\n @param {Object} obj The object with the property that will change\n @param {String} keyName The property key (or path) that will change.\n @param {Meta} meta The objects meta.\n @return {void}\n @public\n */\n function notifyPropertyChange(obj, keyName, _meta) {\n let meta = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n let hasMeta = meta !== undefined;\n if (hasMeta && (meta.isInitializing() || meta.isPrototypeMeta(obj))) {\n return;\n }\n let possibleDesc = (0, _meta2.descriptorFor)(obj, keyName, meta);\n if (possibleDesc !== undefined && typeof possibleDesc.didChange === 'function') {\n possibleDesc.didChange(obj, keyName);\n }\n if (hasMeta && meta.peekWatching(keyName) > 0) {\n dependentKeysDidChange(obj, keyName, meta);\n chainsDidChange(obj, keyName, meta);\n notifyObservers(obj, keyName, meta);\n }\n if (PROPERTY_DID_CHANGE in obj) {\n obj[PROPERTY_DID_CHANGE](keyName);\n }\n if (hasMeta) {\n if (meta.isSourceDestroying()) {\n return;\n }\n (0, _tags.markObjectAsDirty)(obj, keyName, meta);\n }\n if (_env.DEBUG) {\n (0, _transaction.assertNotRendered)(obj, keyName);\n }\n }\n const SEEN_MAP = new Map();\n let IS_TOP_SEEN_MAP = true;\n // called whenever a property has just changed to update dependent keys\n function dependentKeysDidChange(obj, depKey, meta) {\n if (meta.isSourceDestroying() || !meta.hasDeps(depKey)) {\n return;\n }\n let seen = SEEN_MAP;\n let isTop = IS_TOP_SEEN_MAP;\n if (isTop) {\n IS_TOP_SEEN_MAP = false;\n }\n iterDeps(notifyPropertyChange, obj, depKey, seen, meta);\n if (isTop) {\n SEEN_MAP.clear();\n IS_TOP_SEEN_MAP = true;\n }\n }\n function iterDeps(method, obj, depKey, seen, meta) {\n let current = seen.get(obj);\n if (current === undefined) {\n current = new Set();\n seen.set(obj, current);\n }\n if (current.has(depKey)) {\n return;\n }\n let possibleDesc;\n meta.forEachInDeps(depKey, key => {\n possibleDesc = (0, _meta2.descriptorFor)(obj, key, meta);\n if (possibleDesc !== undefined && possibleDesc._suspended === obj) {\n return;\n }\n method(obj, key, meta);\n });\n }\n function chainsDidChange(_obj, keyName, meta) {\n let chainWatchers = meta.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.notify(keyName, true, notifyPropertyChange);\n }\n }\n function overrideChains(_obj, keyName, meta) {\n let chainWatchers = meta.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidate(keyName);\n }\n }\n /**\n @method beginPropertyChanges\n @chainable\n @private\n */\n function beginPropertyChanges() {\n deferred++;\n }\n /**\n @method endPropertyChanges\n @private\n */\n function endPropertyChanges() {\n deferred--;\n if (deferred <= 0) {\n observerSet.flush();\n }\n }\n /**\n Make a series of property changes together in an\n exception-safe way.\n \n ```javascript\n Ember.changeProperties(function() {\n obj1.set('foo', mayBlowUpWhenSet);\n obj2.set('bar', baz);\n });\n ```\n \n @method changeProperties\n @param {Function} callback\n @private\n */\n function changeProperties(callback) {\n beginPropertyChanges();\n try {\n callback();\n } finally {\n endPropertyChanges();\n }\n }\n function notifyObservers(obj, keyName, meta) {\n if (meta.isSourceDestroying()) {\n return;\n }\n let eventName = (0, _change_event.default)(keyName);\n if (deferred > 0) {\n observerSet.add(obj, keyName, eventName);\n } else {\n (0, _events.sendEvent)(obj, eventName, [obj, keyName]);\n }\n }\n exports.propertyWillChange = propertyWillChange;\n exports.propertyDidChange = propertyDidChange;\n exports.notifyPropertyChange = notifyPropertyChange;\n exports.overrideChains = overrideChains;\n exports.beginPropertyChanges = beginPropertyChanges;\n exports.endPropertyChanges = endPropertyChanges;\n exports.changeProperties = changeProperties;\n});","enifed('@ember/-internals/metal/lib/property_get', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/canary-features', '@ember/debug', '@glimmer/env', '@ember/-internals/metal/lib/path_cache', '@ember/-internals/metal/lib/tags', '@ember/-internals/metal/lib/tracked'], function (exports, _meta, _utils, _canaryFeatures, _debug, _env, _path_cache, _tags, _tracked) {\n 'use strict';\n\n exports.__esModule = true;\n exports.getPossibleMandatoryProxyValue = exports.PROXY_CONTENT = undefined;\n exports.get = get;\n exports._getPath = _getPath;\n exports.getWithDefault = getWithDefault;\n /**\n @module @ember/object\n */\n const PROXY_CONTENT = exports.PROXY_CONTENT = (0, _utils.symbol)('PROXY_CONTENT');\n let getPossibleMandatoryProxyValue = exports.getPossibleMandatoryProxyValue = undefined;\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY) {\n exports.getPossibleMandatoryProxyValue = getPossibleMandatoryProxyValue = function getPossibleMandatoryProxyValue(obj, keyName) {\n let content = obj[PROXY_CONTENT];\n if (content === undefined) {\n return obj[keyName];\n } else {\n /* global Reflect */\n return Reflect.get(content, keyName, obj);\n }\n };\n }\n // ..........................................................\n // GET AND SET\n //\n // If we are on a platform that supports accessors we can use those.\n // Otherwise simulate accessors by looking up the property directly on the\n // object.\n /**\n Gets the value of a property on an object. If the property is computed,\n the function will be invoked. If the property is not defined but the\n object implements the `unknownProperty` method then that will be invoked.\n \n ```javascript\n import { get } from '@ember/object';\n get(obj, \"name\");\n ```\n \n If you plan to run on IE8 and older browsers then you should use this\n method anytime you want to retrieve a property on an object that you don't\n know for sure is private. (Properties beginning with an underscore '_'\n are considered private.)\n \n On all newer browsers, you only need to use this method to retrieve\n properties if the property might not be defined on the object and you want\n to respect the `unknownProperty` handler. Otherwise you can ignore this\n method.\n \n Note that if the object itself is `undefined`, this method will throw\n an error.\n \n @method get\n @for @ember/object\n @static\n @param {Object} obj The object to retrieve from.\n @param {String} keyName The property key to retrieve\n @return {Object} the property value or `null`.\n @public\n */\n function get(obj, keyName) {\n (0, _debug.assert)(`Get must be called with two arguments; an object and a property key`, arguments.length === 2);\n (0, _debug.assert)(`Cannot call get with '${keyName}' on an undefined object.`, obj !== undefined && obj !== null);\n (0, _debug.assert)(`The key provided to get must be a string or number, you passed ${keyName}`, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));\n (0, _debug.assert)(`'this' in paths is not supported`, typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);\n let type = typeof obj;\n let isObject = type === 'object';\n let isFunction = type === 'function';\n let isObjectLike = isObject || isFunction;\n let descriptor;\n let value;\n if (isObjectLike) {\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n let tracker = (0, _tracked.getCurrentTracker)();\n if (tracker) tracker.add((0, _tags.tagForProperty)(obj, keyName));\n }\n descriptor = (0, _meta.descriptorFor)(obj, keyName);\n if (descriptor !== undefined) {\n return descriptor.get(obj, keyName);\n }\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY) {\n value = getPossibleMandatoryProxyValue(obj, keyName);\n } else {\n value = obj[keyName];\n }\n } else {\n value = obj[keyName];\n }\n if (value === undefined) {\n if ((0, _path_cache.isPath)(keyName)) {\n return _getPath(obj, keyName);\n }\n if (isObject && !(keyName in obj) && typeof obj.unknownProperty === 'function') {\n return obj.unknownProperty(keyName);\n }\n }\n return value;\n }\n function _getPath(root, path) {\n let obj = root;\n let parts = path.split('.');\n for (let i = 0; i < parts.length; i++) {\n if (obj === undefined || obj === null || obj.isDestroyed) {\n return undefined;\n }\n obj = get(obj, parts[i]);\n }\n return obj;\n }\n /**\n Retrieves the value of a property from an Object, or a default value in the\n case that the property returns `undefined`.\n \n ```javascript\n import { getWithDefault } from '@ember/object';\n getWithDefault(person, 'lastName', 'Doe');\n ```\n \n @method getWithDefault\n @for @ember/object\n @static\n @param {Object} obj The object to retrieve from.\n @param {String} keyName The name of the property to retrieve\n @param {Object} defaultValue The value to return if the property value is undefined\n @return {Object} The property value or the defaultValue.\n @public\n */\n function getWithDefault(root, key, defaultValue) {\n let value = get(root, key);\n if (value === undefined) {\n return defaultValue;\n }\n return value;\n }\n exports.default = get;\n});","enifed('@ember/-internals/metal/lib/property_set', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/debug', '@ember/error', '@glimmer/env', '@ember/-internals/metal/lib/path_cache', '@ember/-internals/metal/lib/property_events', '@ember/-internals/metal/lib/property_get'], function (exports, _meta, _utils, _debug, _error, _env, _path_cache, _property_events, _property_get) {\n 'use strict';\n\n exports.__esModule = true;\n exports.set = set;\n exports.trySet = trySet;\n\n let setWithMandatorySetter;\n let makeEnumerable;\n /**\n @module @ember/object\n */\n /**\n Sets the value of a property on an object, respecting computed properties\n and notifying observers and other listeners of the change.\n If the specified property is not defined on the object and the object\n implements the `setUnknownProperty` method, then instead of setting the\n value of the property on the object, its `setUnknownProperty` handler\n will be invoked with the two parameters `keyName` and `value`.\n \n ```javascript\n import { set } from '@ember/object';\n set(obj, \"name\", value);\n ```\n \n @method set\n @static\n @for @ember/object\n @param {Object} obj The object to modify.\n @param {String} keyName The property key to set\n @param {Object} value The value to set\n @return {Object} the passed value.\n @public\n */\n function set(obj, keyName, value, tolerant) {\n (0, _debug.assert)(`Set must be called with three or four arguments; an object, a property key, a value and tolerant true/false`, arguments.length === 3 || arguments.length === 4);\n (0, _debug.assert)(`Cannot call set with '${keyName}' on an undefined object.`, obj && typeof obj === 'object' || typeof obj === 'function');\n (0, _debug.assert)(`The key provided to set must be a string or number, you passed ${keyName}`, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));\n (0, _debug.assert)(`'this' in paths is not supported`, typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);\n if (obj.isDestroyed) {\n (0, _debug.assert)(`calling set on destroyed object: ${(0, _utils.toString)(obj)}.${keyName} = ${(0, _utils.toString)(value)}`, tolerant);\n return;\n }\n if ((0, _path_cache.isPath)(keyName)) {\n return setPath(obj, keyName, value, tolerant);\n }\n let possibleDesc = (0, _meta.descriptorFor)(obj, keyName);\n if (possibleDesc !== undefined) {\n /* computed property */\n possibleDesc.set(obj, keyName, value);\n return value;\n }\n let currentValue;\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY) {\n currentValue = (0, _property_get.getPossibleMandatoryProxyValue)(obj, keyName);\n } else {\n currentValue = obj[keyName];\n }\n if (currentValue === undefined && 'object' === typeof obj && !(keyName in obj) && typeof obj.setUnknownProperty === 'function') {\n /* unknown property */\n obj.setUnknownProperty(keyName, value);\n } else {\n let meta = (0, _meta.peekMeta)(obj);\n if (_env.DEBUG) {\n setWithMandatorySetter(meta, obj, keyName, value);\n } else {\n obj[keyName] = value;\n }\n if (currentValue !== value) {\n (0, _property_events.notifyPropertyChange)(obj, keyName, meta);\n }\n }\n return value;\n }\n if (_env.DEBUG) {\n setWithMandatorySetter = (meta, obj, keyName, value) => {\n if (meta !== undefined && meta.peekWatching(keyName) > 0) {\n makeEnumerable(obj, keyName);\n meta.writeValue(obj, keyName, value);\n } else {\n obj[keyName] = value;\n }\n };\n makeEnumerable = (obj, key) => {\n let desc = Object.getOwnPropertyDescriptor(obj, key);\n if (desc && desc.set && desc.set.isMandatorySetter) {\n desc.enumerable = true;\n Object.defineProperty(obj, key, desc);\n }\n };\n }\n function setPath(root, path, value, tolerant) {\n let parts = path.split('.');\n let keyName = parts.pop();\n (0, _debug.assert)('Property set failed: You passed an empty path', keyName.trim().length > 0);\n let newPath = parts.join('.');\n let newRoot = (0, _property_get._getPath)(root, newPath);\n if (newRoot !== null && newRoot !== undefined) {\n return set(newRoot, keyName, value);\n } else if (!tolerant) {\n throw new _error.default(`Property set failed: object in path \"${newPath}\" could not be found.`);\n }\n }\n /**\n Error-tolerant form of `set`. Will not blow up if any part of the\n chain is `undefined`, `null`, or destroyed.\n \n This is primarily used when syncing bindings, which may try to update after\n an object has been destroyed.\n \n ```javascript\n import { trySet } from '@ember/object';\n \n let obj = { name: \"Zoey\" };\n trySet(obj, \"contacts.twitter\", \"@emberjs\");\n ```\n \n @method trySet\n @static\n @for @ember/object\n @param {Object} root The object to modify.\n @param {String} path The property path to set\n @param {Object} value The value to set\n @public\n */\n function trySet(root, path, value) {\n return set(root, path, value, true);\n }\n});","enifed('@ember/-internals/metal/lib/set_properties', ['exports', '@ember/-internals/metal/lib/property_events', '@ember/-internals/metal/lib/property_set'], function (exports, _property_events, _property_set) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = setProperties;\n\n /**\n @module @ember/object\n */\n /**\n Set a list of properties on an object. These properties are set inside\n a single `beginPropertyChanges` and `endPropertyChanges` batch, so\n observers will be buffered.\n \n ```javascript\n import EmberObject from '@ember/object';\n let anObject = EmberObject.create();\n \n anObject.setProperties({\n firstName: 'Stanley',\n lastName: 'Stuart',\n age: 21\n });\n ```\n \n @method setProperties\n @static\n @for @ember/object\n @param obj\n @param {Object} properties\n @return properties\n @public\n */\n function setProperties(obj, properties) {\n if (properties === null || typeof properties !== 'object') {\n return properties;\n }\n (0, _property_events.changeProperties)(() => {\n let props = Object.keys(properties);\n let propertyName;\n for (let i = 0; i < props.length; i++) {\n propertyName = props[i];\n (0, _property_set.set)(obj, propertyName, properties[propertyName]);\n }\n });\n return properties;\n }\n});","enifed('@ember/-internals/metal/lib/tags', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@ember/canary-features', '@ember/runloop', '@glimmer/reference'], function (exports, _meta2, _utils, _canaryFeatures, _runloop, _reference) {\n 'use strict';\n\n exports.__esModule = true;\n exports.update = exports.dirty = undefined;\n exports.setHasViews = setHasViews;\n exports.tagForProperty = tagForProperty;\n exports.tagFor = tagFor;\n exports.markObjectAsDirty = markObjectAsDirty;\n\n let hasViews = () => false;\n function setHasViews(fn) {\n hasViews = fn;\n }\n function makeTag() {\n return _reference.DirtyableTag.create();\n }\n function tagForProperty(object, propertyKey, _meta) {\n if (typeof object !== 'object' || object === null) {\n return _reference.CONSTANT_TAG;\n }\n let meta = _meta === undefined ? (0, _meta2.meta)(object) : _meta;\n if ((0, _utils.isProxy)(object)) {\n return tagFor(object, meta);\n }\n let tags = meta.writableTags();\n let tag = tags[propertyKey];\n if (tag) {\n return tag;\n }\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n let pair = (0, _reference.combine)([makeTag(), _reference.UpdatableTag.create(_reference.CONSTANT_TAG)]);\n return tags[propertyKey] = pair;\n } else {\n return tags[propertyKey] = makeTag();\n }\n }\n function tagFor(object, _meta) {\n if (typeof object === 'object' && object !== null) {\n let meta = _meta === undefined ? (0, _meta2.meta)(object) : _meta;\n return meta.writableTag(makeTag);\n } else {\n return _reference.CONSTANT_TAG;\n }\n }\n let dirty = exports.dirty = undefined;\n let update = exports.update = undefined;\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n exports.dirty = dirty = tag => {\n tag.inner.first.inner.dirty();\n };\n exports.update = update = (outer, inner) => {\n outer.inner.second.inner.update(inner);\n };\n } else {\n exports.dirty = dirty = tag => {\n tag.inner.dirty();\n };\n }\n function markObjectAsDirty(obj, propertyKey, meta) {\n let objectTag = meta.readableTag();\n if (objectTag !== undefined) {\n if ((0, _utils.isProxy)(obj)) {\n objectTag.inner.first.inner.dirty();\n } else {\n objectTag.inner.dirty();\n }\n }\n let tags = meta.readableTags();\n let propertyTag = tags !== undefined ? tags[propertyKey] : undefined;\n if (propertyTag !== undefined) {\n dirty(propertyTag);\n }\n if (objectTag !== undefined || propertyTag !== undefined) {\n ensureRunloop();\n }\n }\n function ensureRunloop() {\n if (hasViews()) {\n _runloop.backburner.ensureInstance();\n }\n }\n});","enifed('@ember/-internals/metal/lib/tracked', ['exports', '@glimmer/reference', '@ember/-internals/metal/lib/tags'], function (exports, _reference, _tags) {\n 'use strict';\n\n exports.__esModule = true;\n exports.UntrackedPropertyError = undefined;\n exports.tracked = tracked;\n exports.getCurrentTracker = getCurrentTracker;\n exports.setCurrentTracker = setCurrentTracker;\n exports.setPropertyDidChange = setPropertyDidChange;\n\n /**\n An object that that tracks @tracked properties that were consumed.\n \n @private\n */\n class Tracker {\n constructor() {\n this.tags = new Set();\n this.last = null;\n }\n add(tag) {\n this.tags.add(tag);\n this.last = tag;\n }\n get size() {\n return this.tags.size;\n }\n combine() {\n if (this.tags.size === 0) {\n return _reference.CONSTANT_TAG;\n } else if (this.tags.size === 1) {\n return this.last;\n } else {\n let tags = [];\n this.tags.forEach(tag => tags.push(tag));\n return (0, _reference.combine)(tags);\n }\n }\n }\n function tracked(...dependencies) {\n let [, key, descriptor] = dependencies;\n if (descriptor === undefined || 'initializer' in descriptor) {\n return descriptorForDataProperty(key, descriptor);\n } else {\n return descriptorForAccessor(key, descriptor);\n }\n }\n /**\n @private\n \n Whenever a tracked computed property is entered, the current tracker is\n saved off and a new tracker is replaced.\n \n Any tracked properties consumed are added to the current tracker.\n \n When a tracked computed property is exited, the tracker's tags are\n combined and added to the parent tracker.\n \n The consequence is that each tracked computed property has a tag\n that corresponds to the tracked properties consumed inside of\n itself, including child tracked computed properties.\n */\n let CURRENT_TRACKER = null;\n function getCurrentTracker() {\n return CURRENT_TRACKER;\n }\n function setCurrentTracker(tracker = new Tracker()) {\n return CURRENT_TRACKER = tracker;\n }\n function descriptorForAccessor(key, descriptor) {\n let get = descriptor.get;\n let set = descriptor.set;\n function getter() {\n // Swap the parent tracker for a new tracker\n let old = CURRENT_TRACKER;\n let tracker = CURRENT_TRACKER = new Tracker();\n // Call the getter\n let ret = get.call(this);\n // Swap back the parent tracker\n CURRENT_TRACKER = old;\n // Combine the tags in the new tracker and add them to the parent tracker\n let tag = tracker.combine();\n if (CURRENT_TRACKER) CURRENT_TRACKER.add(tag);\n // Update the UpdatableTag for this property with the tag for all of the\n // consumed dependencies.\n (0, _tags.update)((0, _tags.tagForProperty)(this, key), tag);\n return ret;\n }\n function setter() {\n (0, _tags.dirty)((0, _tags.tagForProperty)(this, key));\n set.apply(this, arguments);\n }\n return {\n enumerable: true,\n configurable: false,\n get: get && getter,\n set: set && setter\n };\n }\n /**\n @private\n \n A getter/setter for change tracking for a particular key. The accessor\n acts just like a normal property, but it triggers the `propertyDidChange`\n hook when written to.\n \n Values are saved on the object using a \"shadow key,\" or a symbol based on the\n tracked property name. Sets write the value to the shadow key, and gets read\n from it.\n */\n function descriptorForDataProperty(key, descriptor) {\n let shadowKey = Symbol(key);\n return {\n enumerable: true,\n configurable: true,\n get() {\n if (CURRENT_TRACKER) CURRENT_TRACKER.add((0, _tags.tagForProperty)(this, key));\n if (!(shadowKey in this)) {\n this[shadowKey] = descriptor.value;\n }\n return this[shadowKey];\n },\n set(newValue) {\n (0, _tags.tagFor)(this).inner['dirty']();\n (0, _tags.dirty)((0, _tags.tagForProperty)(this, key));\n this[shadowKey] = newValue;\n propertyDidChange();\n }\n };\n }\n let propertyDidChange = function () {};\n function setPropertyDidChange(cb) {\n propertyDidChange = cb;\n }\n class UntrackedPropertyError extends Error {\n constructor(target, key, message) {\n super(message);\n this.target = target;\n this.key = key;\n }\n static for(obj, key) {\n return new UntrackedPropertyError(obj, key, `The property '${key}' on ${obj} was changed after being rendered. If you want to change a property used in a template after the component has rendered, mark the property as a tracked property with the @tracked decorator.`);\n }\n }\n exports.UntrackedPropertyError = UntrackedPropertyError;\n});","enifed('@ember/-internals/metal/lib/transaction', ['exports', '@ember/debug', '@glimmer/env'], function (exports, _debug, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.assertNotRendered = exports.didRender = exports.default = undefined;\n\n let runInTransaction;\n let didRender;\n let assertNotRendered;\n // detect-backtracking-rerender by default is debug build only\n if (_env.DEBUG) {\n // there are 2 states\n // DEBUG\n // tracks lastRef and lastRenderedIn per rendered object and key during a transaction\n // release everything via normal weakmap semantics by just derefencing the weakmap\n // RELEASE\n // tracks transactionId per rendered object and key during a transaction\n // release everything via normal weakmap semantics by just derefencing the weakmap\n class TransactionRunner {\n constructor() {\n this.transactionId = 0;\n this.inTransaction = false;\n this.shouldReflush = false;\n this.weakMap = new WeakMap();\n if (_env.DEBUG) {\n // track templates\n this.debugStack = undefined;\n }\n }\n runInTransaction(context, methodName) {\n this.before(context);\n try {\n context[methodName]();\n } finally {\n this.after();\n }\n return this.shouldReflush;\n }\n didRender(object, key, reference) {\n if (!this.inTransaction) {\n return;\n }\n if (_env.DEBUG) {\n this.setKey(object, key, {\n lastRef: reference,\n lastRenderedIn: this.debugStack.peek()\n });\n } else {\n this.setKey(object, key, this.transactionId);\n }\n }\n assertNotRendered(object, key) {\n if (!this.inTransaction) {\n return;\n }\n if (this.hasRendered(object, key)) {\n if (_env.DEBUG) {\n let { lastRef, lastRenderedIn } = this.getKey(object, key);\n let currentlyIn = this.debugStack.peek();\n let parts = [];\n let label;\n if (lastRef !== undefined) {\n while (lastRef && lastRef._propertyKey) {\n parts.unshift(lastRef._propertyKey);\n lastRef = lastRef._parentReference;\n }\n label = parts.join('.');\n } else {\n label = 'the same value';\n }\n (0, _debug.assert)(`You modified \"${label}\" twice on ${object} in a single render. It was rendered in ${lastRenderedIn} and modified in ${currentlyIn}. This was unreliable and slow in Ember 1.x and is no longer supported. See https://github.com/emberjs/ember.js/issues/13948 for more details.`, false);\n }\n this.shouldReflush = true;\n }\n }\n hasRendered(object, key) {\n if (!this.inTransaction) {\n return false;\n }\n if (_env.DEBUG) {\n return this.getKey(object, key) !== undefined;\n }\n return this.getKey(object, key) === this.transactionId;\n }\n before(context) {\n this.inTransaction = true;\n this.shouldReflush = false;\n if (_env.DEBUG) {\n this.debugStack = context.env.debugStack;\n }\n }\n after() {\n this.transactionId++;\n this.inTransaction = false;\n if (_env.DEBUG) {\n this.debugStack = undefined;\n }\n this.clearObjectMap();\n }\n createMap(object) {\n let map = Object.create(null);\n this.weakMap.set(object, map);\n return map;\n }\n getOrCreateMap(object) {\n let map = this.weakMap.get(object);\n if (map === undefined) {\n map = this.createMap(object);\n }\n return map;\n }\n setKey(object, key, value) {\n let map = this.getOrCreateMap(object);\n map[key] = value;\n }\n getKey(object, key) {\n let map = this.weakMap.get(object);\n if (map !== undefined) {\n return map[key];\n }\n }\n clearObjectMap() {\n this.weakMap = new WeakMap();\n }\n }\n let runner = new TransactionRunner();\n exports.default = runInTransaction = runner.runInTransaction.bind(runner);\n exports.didRender = didRender = runner.didRender.bind(runner);\n exports.assertNotRendered = assertNotRendered = runner.assertNotRendered.bind(runner);\n } else {\n // in production do nothing to detect reflushes\n exports.default = runInTransaction = (context, methodName) => {\n context[methodName]();\n return false;\n };\n }\n exports.default = runInTransaction;\n exports.didRender = didRender;\n exports.assertNotRendered = assertNotRendered;\n});","enifed('@ember/-internals/metal/lib/watch_key', ['exports', '@ember/-internals/meta', '@ember/-internals/utils', '@glimmer/env', '@ember/-internals/metal/lib/properties'], function (exports, _meta2, _utils, _env, _properties) {\n 'use strict';\n\n exports.__esModule = true;\n exports.watchKey = watchKey;\n exports.unwatchKey = unwatchKey;\n\n let handleMandatorySetter;\n function watchKey(obj, keyName, _meta) {\n let meta = _meta === undefined ? (0, _meta2.meta)(obj) : _meta;\n let count = meta.peekWatching(keyName);\n meta.writeWatching(keyName, count + 1);\n if (count === 0) {\n // activate watching first time\n let possibleDesc = (0, _meta2.descriptorFor)(obj, keyName, meta);\n if (possibleDesc !== undefined && possibleDesc.willWatch !== undefined) {\n possibleDesc.willWatch(obj, keyName, meta);\n }\n if (typeof obj.willWatchProperty === 'function') {\n obj.willWatchProperty(keyName);\n }\n if (_env.DEBUG) {\n // NOTE: this is dropped for prod + minified builds\n handleMandatorySetter(meta, obj, keyName);\n }\n }\n }\n if (_env.DEBUG) {\n let hasOwnProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);\n let propertyIsEnumerable = (obj, key) => Object.prototype.propertyIsEnumerable.call(obj, key);\n // Future traveler, although this code looks scary. It merely exists in\n // development to aid in development asertions. Production builds of\n // ember strip this entire block out\n handleMandatorySetter = function handleMandatorySetter(m, obj, keyName) {\n let descriptor = (0, _utils.lookupDescriptor)(obj, keyName);\n let hasDescriptor = descriptor !== null;\n let possibleDesc = hasDescriptor && descriptor.value;\n if ((0, _meta2.isDescriptor)(possibleDesc)) {\n return;\n }\n let configurable = hasDescriptor ? descriptor.configurable : true;\n let isWritable = hasDescriptor ? descriptor.writable : true;\n let hasValue = hasDescriptor ? 'value' in descriptor : true;\n // this x in Y deopts, so keeping it in this function is better;\n if (configurable && isWritable && hasValue && keyName in obj) {\n let desc = {\n configurable: true,\n set: (0, _properties.MANDATORY_SETTER_FUNCTION)(keyName),\n enumerable: propertyIsEnumerable(obj, keyName),\n get: undefined\n };\n if (hasOwnProperty(obj, keyName)) {\n m.writeValues(keyName, obj[keyName]);\n desc.get = (0, _properties.DEFAULT_GETTER_FUNCTION)(keyName);\n } else {\n desc.get = (0, _properties.INHERITING_GETTER_FUNCTION)(keyName);\n }\n Object.defineProperty(obj, keyName, desc);\n }\n };\n }\n function unwatchKey(obj, keyName, _meta) {\n let meta = _meta === undefined ? (0, _meta2.peekMeta)(obj) : _meta;\n // do nothing of this object has already been destroyed\n if (meta === undefined || meta.isSourceDestroyed()) {\n return;\n }\n let count = meta.peekWatching(keyName);\n if (count === 1) {\n meta.writeWatching(keyName, 0);\n let possibleDesc = (0, _meta2.descriptorFor)(obj, keyName, meta);\n let isDescriptor = possibleDesc !== undefined;\n if (isDescriptor && possibleDesc.didUnwatch !== undefined) {\n possibleDesc.didUnwatch(obj, keyName, meta);\n }\n if (typeof obj.didUnwatchProperty === 'function') {\n obj.didUnwatchProperty(keyName);\n }\n if (_env.DEBUG) {\n // It is true, the following code looks quite WAT. But have no fear, It\n // exists purely to improve development ergonomics and is removed from\n // ember.min.js and ember.prod.js builds.\n //\n // Some further context: Once a property is watched by ember, bypassing `set`\n // for mutation, will bypass observation. This code exists to assert when\n // that occurs, and attempt to provide more helpful feedback. The alternative\n // is tricky to debug partially observable properties.\n if (!isDescriptor && keyName in obj) {\n let maybeMandatoryDescriptor = (0, _utils.lookupDescriptor)(obj, keyName);\n if (maybeMandatoryDescriptor && maybeMandatoryDescriptor.set && maybeMandatoryDescriptor.set.isMandatorySetter) {\n if (maybeMandatoryDescriptor.get && maybeMandatoryDescriptor.get.isInheritingGetter) {\n let possibleValue = meta.readInheritedValue('values', keyName);\n if (possibleValue === _meta2.UNDEFINED) {\n delete obj[keyName];\n return;\n }\n }\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: Object.prototype.propertyIsEnumerable.call(obj, keyName),\n writable: true,\n value: meta.peekValues(keyName)\n });\n meta.deleteFromValues(keyName);\n }\n }\n }\n } else if (count > 1) {\n meta.writeWatching(keyName, count - 1);\n }\n }\n});","enifed('@ember/-internals/metal/lib/watch_path', ['exports', '@ember/-internals/meta', '@ember/-internals/metal/lib/chains'], function (exports, _meta, _chains) {\n 'use strict';\n\n exports.__esModule = true;\n exports.watchPath = watchPath;\n exports.unwatchPath = unwatchPath;\n function watchPath(obj, keyPath, meta) {\n let m = meta === undefined ? (0, _meta.meta)(obj) : meta;\n let counter = m.peekWatching(keyPath);\n m.writeWatching(keyPath, counter + 1);\n if (counter === 0) {\n // activate watching first time\n m.writableChains(_chains.makeChainNode).add(keyPath);\n }\n }\n function unwatchPath(obj, keyPath, meta) {\n let m = meta === undefined ? (0, _meta.peekMeta)(obj) : meta;\n if (m === undefined) {\n return;\n }\n let counter = m.peekWatching(keyPath);\n if (counter > 0) {\n m.writeWatching(keyPath, counter - 1);\n if (counter === 1) {\n m.writableChains(_chains.makeChainNode).remove(keyPath);\n }\n }\n }\n});","enifed('@ember/-internals/metal/lib/watching', ['exports', '@ember/-internals/meta', '@ember/-internals/metal/lib/path_cache', '@ember/-internals/metal/lib/watch_key', '@ember/-internals/metal/lib/watch_path'], function (exports, _meta, _path_cache, _watch_key, _watch_path) {\n 'use strict';\n\n exports.__esModule = true;\n exports.watch = watch;\n exports.isWatching = isWatching;\n exports.watcherCount = watcherCount;\n exports.unwatch = unwatch;\n\n /**\n Starts watching a property on an object. Whenever the property changes,\n invokes `Ember.notifyPropertyChange`. This is the primitive used by observers\n and dependent keys; usually you will never call this method directly but instead\n use higher level methods like `addObserver()`.\n \n @private\n @method watch\n @for Ember\n @param obj\n @param {String} keyPath\n @param {Object} meta\n */\n /**\n @module ember\n */\n function watch(obj, keyPath, meta) {\n if ((0, _path_cache.isPath)(keyPath)) {\n (0, _watch_path.watchPath)(obj, keyPath, meta);\n } else {\n (0, _watch_key.watchKey)(obj, keyPath, meta);\n }\n }\n function isWatching(obj, key) {\n return watcherCount(obj, key) > 0;\n }\n function watcherCount(obj, key) {\n let meta = (0, _meta.peekMeta)(obj);\n return meta !== undefined && meta.peekWatching(key) || 0;\n }\n /**\n Stops watching a property on an object. Usually you will never call this method directly but instead\n use higher level methods like `removeObserver()`.\n \n @private\n @method unwatch\n @for Ember\n @param obj\n @param {String} keyPath\n @param {Object} meta\n */\n function unwatch(obj, keyPath, meta) {\n if ((0, _path_cache.isPath)(keyPath)) {\n (0, _watch_path.unwatchPath)(obj, keyPath, meta);\n } else {\n (0, _watch_key.unwatchKey)(obj, keyPath, meta);\n }\n }\n});","enifed('@ember/-internals/metal/tests/accessors/get_path_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('get with path', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n obj = {\n foo: {\n bar: {\n baz: { biff: 'BIFF' }\n }\n },\n foothis: {\n bar: {\n baz: { biff: 'BIFF' }\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\n // ..........................................................\n // LOCAL PATHS\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\n // ..........................................................\n // GLOBAL PATHS TREATED LOCAL WITH GET\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});","enifed('@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 let obj = {\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n };\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'), { lastName: 'Jobs' });\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});","enifed('@ember/-internals/metal/tests/accessors/get_test', ['@ember/-internals/environment', '@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers', '@ember/runloop'], function (_environment, _runtime, _metal, _internalTestHelpers, _runloop) {\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 let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null\n };\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\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 let obj = { 1: 'first' };\n\n assert.equal((0, _metal.get)(obj, 1), 'first');\n }\n\n ['@test should retrieve an array index'](assert) {\n let arr = ['first', 'second'];\n\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 let obj = { '': '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 let obj = { 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 let count = 0;\n let obj = {\n get id() {\n return ++count;\n }\n };\n\n (0, _metal.get)(obj, 'id');\n\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 let obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\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 let obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\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 let func = function () {};\n func.bar = 'awesome';\n\n let destroyedObj = _runtime.Object.create({ bar: 'great' });\n (0, _runloop.run)(() => destroyedObj.destroy());\n\n assert.equal((0, _metal.get)({ foo: null }, 'foo.bar'), undefined);\n assert.equal((0, _metal.get)({ foo: { bar: 'hello' } }, 'foo.bar.length'), 5);\n assert.equal((0, _metal.get)({ foo: func }, 'foo.bar'), 'awesome');\n assert.equal((0, _metal.get)({ foo: func }, '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)({ foo: destroyedObj }, '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 let 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\n // ..........................................................\n // BUGS\n //\n\n ['@test (regression) watched properties on unmodified inherited objects should still return their original value'](assert) {\n let MyMixin = _metal.Mixin.create({\n someProperty: 'foo',\n propertyDidChange: (0, _metal.observer)('someProperty', () => {})\n });\n\n let baseObject = MyMixin.apply({});\n let theRealObject = Object.create(baseObject);\n\n assert.equal((0, _metal.get)(theRealObject, 'someProperty'), 'foo', 'should return the set value, not false');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('getWithDefault', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object'](assert) {\n let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null\n };\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n assert.equal((0, _metal.getWithDefault)(obj, key, 'fail'), obj[key], key);\n }\n\n obj = {\n undef: undefined\n };\n\n assert.equal((0, _metal.getWithDefault)(obj, 'undef', 'default'), 'default', 'explicit undefined retrieves the default');\n assert.equal((0, _metal.getWithDefault)(obj, 'not-present', 'default'), 'default', 'non-present key retrieves the default');\n }\n\n ['@test should call unknownProperty if defined and value is undefined'](assert) {\n let obj = {\n count: 0,\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n this.count++;\n return 'FOO';\n }\n };\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should return value from unknown');\n assert.equal(obj.count, 1, 'should have invoked');\n }\n\n ['@test if unknownProperty is present, it is called using getFromEmberMetal()/set()'](assert) {\n let obj = {\n unknownProperty(key) {\n if (key === 'foo') {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n }\n };\n assert.equal((0, _metal.getWithDefault)(obj, 'foo', 'fail'), 'FOO', 'should return value from unknownProperty');\n assert.equal((0, _metal.getWithDefault)(obj, 'bar', 'default'), 'default', 'should convert undefined from unknownProperty into default');\n }\n\n ['@test if unknownProperty is present, it is called using accessors'](assert) {\n if (_environment.ENV.USES_ACCESSORS) {\n let obj = {\n unknownProperty(key) {\n if (key === 'foo') {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n }\n };\n assert.equal(aget(obj, 'foo', 'fail'), 'FOO', 'should return value from unknownProperty');\n assert.equal(aget(obj, 'bar', 'default'), 'default', 'should convert undefined from unknownProperty into default');\n } else {\n assert.ok('SKIPPING ACCESSORS');\n }\n }\n\n // ..........................................................\n // BUGS\n //\n\n ['@test (regression) watched properties on unmodified inherited objects should still return their original value'](assert) {\n let MyMixin = _metal.Mixin.create({\n someProperty: 'foo',\n propertyDidChange: (0, _metal.observer)('someProperty', () => {\n /* nothing to do */\n })\n });\n\n let baseObject = MyMixin.apply({});\n let theRealObject = Object.create(baseObject);\n\n assert.equal((0, _metal.getWithDefault)(theRealObject, 'someProperty', 'fail'), 'foo', 'should return the set value, not false');\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/mandatory_setters_test', ['@glimmer/env', '@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_env, _metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n function hasMandatorySetter(object, property) {\n try {\n return Object.getOwnPropertyDescriptor(object, property).set.isMandatorySetter === true;\n } catch (e) {\n return false;\n }\n }\n\n function hasMetaValue(object, property) {\n return (0, _meta.meta)(object).peekValues(property) !== undefined;\n }\n\n if (_env.DEBUG) {\n (0, _internalTestHelpers.moduleFor)('mandory-setters', class extends _internalTestHelpers.AbstractTestCase {\n ['@test does not assert if property is not being watched'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n obj.someProp = 'blastix';\n assert.equal((0, _metal.get)(obj, 'someProp'), 'blastix');\n }\n\n ['@test should not setup mandatory-setter if property is not writable'](assert) {\n assert.expect(6);\n\n let obj = {};\n\n Object.defineProperty(obj, 'a', { value: true });\n Object.defineProperty(obj, 'b', { value: false });\n Object.defineProperty(obj, 'c', { value: undefined });\n Object.defineProperty(obj, 'd', { value: undefined, writable: false });\n Object.defineProperty(obj, 'e', {\n value: undefined,\n configurable: false\n });\n Object.defineProperty(obj, 'f', {\n value: undefined,\n configurable: true\n });\n\n (0, _metal.watch)(obj, 'a');\n (0, _metal.watch)(obj, 'b');\n (0, _metal.watch)(obj, 'c');\n (0, _metal.watch)(obj, 'd');\n (0, _metal.watch)(obj, 'e');\n (0, _metal.watch)(obj, 'f');\n\n assert.ok(!hasMandatorySetter(obj, 'a'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'b'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'c'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'd'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'e'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'f'), 'mandatory-setter should not be installed');\n }\n\n ['@test should not teardown non mandatory-setter descriptor'](assert) {\n assert.expect(1);\n\n let obj = {\n get a() {\n return 'hi';\n }\n };\n\n (0, _metal.watch)(obj, 'a');\n (0, _metal.unwatch)(obj, 'a');\n\n assert.equal(obj.a, 'hi');\n }\n\n ['@test should not confuse non descriptor watched gets'](assert) {\n assert.expect(2);\n\n let obj = {\n get a() {\n return 'hi';\n }\n };\n\n (0, _metal.watch)(obj, 'a');\n assert.equal((0, _metal.get)(obj, 'a'), 'hi');\n assert.equal(obj.a, 'hi');\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property'](assert) {\n assert.expect(2);\n\n let obj = { someProp: null };\n\n Object.defineProperty(obj, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test watched ES5 setter should not be smashed by mandatory setter'](assert) {\n let value;\n let obj = {\n get foo() {},\n set foo(_value) {\n value = _value;\n }\n };\n\n (0, _metal.watch)(obj, 'foo');\n\n (0, _metal.set)(obj, 'foo', 2);\n assert.equal(value, 2);\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in parent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n let obj = new Foo();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in grandparent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n function Bar() {}\n Bar.prototype = Object.create(Foo.prototype);\n Bar.prototype.constructor = Bar;\n\n let obj = new Bar();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in great grandparent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n function Bar() {}\n Bar.prototype = Object.create(Foo.prototype);\n Bar.prototype.constructor = Bar;\n\n function Qux() {}\n Qux.prototype = Object.create(Bar.prototype);\n Qux.prototype.constructor = Qux;\n\n let obj = new Qux();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should assert if set without set when property is being watched']() {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n (0, _metal.watch)(obj, 'someProp');\n\n expectAssertion(function () {\n obj.someProp = 'foo-bar';\n }, 'You must use set() to set the `someProp` property (of custom-object) to `foo-bar`.');\n }\n\n ['@test should not assert if set with set when property is being watched'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n (0, _metal.watch)(obj, 'someProp');\n (0, _metal.set)(obj, 'someProp', 'foo-bar');\n\n assert.equal((0, _metal.get)(obj, 'someProp'), 'foo-bar');\n }\n\n ['@test does not setup mandatory-setter if non-configurable'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: false,\n enumerable: true,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'blastix');\n }\n\n ['@test ensure after watch the property is restored (and the value is no-longer stored in meta) [non-enumerable]'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: true,\n enumerable: false,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.equal(hasMandatorySetter(obj, 'someProp'), true, 'should have a mandatory setter');\n\n let descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n\n assert.equal(descriptor.value, undefined, 'expected existing value to NOT remain');\n\n assert.ok(hasMetaValue(obj, 'someProp'), 'someProp is stored in meta.values');\n\n (0, _metal.unwatch)(obj, 'someProp');\n\n assert.ok(!hasMetaValue(obj, 'someProp'), 'someProp is no longer stored in meta.values');\n\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(hasMandatorySetter(obj, 'someProp'), false, 'should no longer have a mandatory setter');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n assert.equal(descriptor.value, 'blastix', 'expected existing value to remain');\n\n obj.someProp = 'new value';\n\n // make sure the descriptor remains correct (nothing funky, like a redefined, happened in the setter);\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(descriptor.value, 'new value', 'expected existing value to NOT remain');\n assert.equal(obj.someProp, 'new value', 'expected value to be the getter');\n assert.equal(obj.someProp, 'new value');\n }\n\n ['@test ensure after watch the property is restored (and the value is no-longer stored in meta) [enumerable]'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: true,\n enumerable: true,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.equal(hasMandatorySetter(obj, 'someProp'), true, 'should have a mandatory setter');\n\n let descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n\n assert.equal(descriptor.value, undefined, 'expected existing value to NOT remain');\n\n assert.ok(hasMetaValue(obj, 'someProp'), 'someProp is stored in meta.values');\n\n (0, _metal.unwatch)(obj, 'someProp');\n\n assert.ok(!hasMetaValue(obj, 'someProp'), 'someProp is no longer stored in meta.values');\n\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(hasMandatorySetter(obj, 'someProp'), false, 'should no longer have a mandatory setter');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n assert.equal(descriptor.value, 'blastix', 'expected existing value to remain');\n\n obj.someProp = 'new value';\n\n // make sure the descriptor remains correct (nothing funky, like a redefined, happened in the setter);\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(descriptor.value, 'new value', 'expected existing value to NOT remain');\n assert.equal(obj.someProp, 'new value');\n }\n\n ['@test sets up mandatory-setter if property comes from prototype'](assert) {\n assert.expect(2);\n\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n let obj2 = Object.create(obj);\n\n (0, _metal.watch)(obj2, 'someProp');\n\n assert.ok(hasMandatorySetter(obj2, 'someProp'), 'mandatory setter has been setup');\n\n expectAssertion(function () {\n obj2.someProp = 'foo-bar';\n }, 'You must use set() to set the `someProp` property (of custom-object) to `foo-bar`.');\n }\n\n ['@test inheritance remains live'](assert) {\n function Parent() {}\n Parent.prototype.food = 'chips';\n\n let child = new Parent();\n\n assert.equal(child.food, 'chips');\n\n (0, _metal.watch)(child, 'food');\n\n assert.equal(child.food, 'chips');\n\n Parent.prototype.food = 'icecreame';\n\n assert.equal(child.food, 'icecreame');\n\n (0, _metal.unwatch)(child, 'food');\n\n assert.equal(child.food, 'icecreame');\n\n Parent.prototype.food = 'chips';\n\n assert.equal(child.food, 'chips');\n }\n\n ['@test inheritance remains live and preserves this'](assert) {\n function Parent(food) {\n this._food = food;\n }\n\n Object.defineProperty(Parent.prototype, 'food', {\n get() {\n return this._food;\n }\n });\n\n let child = new Parent('chips');\n\n assert.equal(child.food, 'chips');\n\n (0, _metal.watch)(child, 'food');\n\n assert.equal(child.food, 'chips');\n\n child._food = 'icecreame';\n\n assert.equal(child.food, 'icecreame');\n\n (0, _metal.unwatch)(child, 'food');\n\n assert.equal(child.food, 'icecreame');\n\n let foodDesc = Object.getOwnPropertyDescriptor(Parent.prototype, 'food');\n assert.ok(!foodDesc.configurable, 'Parent.prototype.food desc should be non configable');\n assert.ok(!foodDesc.enumerable, 'Parent.prototype.food desc should be non enumerable');\n\n assert.equal(foodDesc.get.call({\n _food: 'hi'\n }), 'hi');\n assert.equal(foodDesc.set, undefined);\n\n assert.equal(child.food, 'icecreame');\n }\n });\n }\n});","enifed('@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 let originalLookup = _environment.context.lookup;\n let lookup;\n\n let obj;\n function commonSetup() {\n _environment.context.lookup = lookup = {};\n obj = {\n foo: {\n bar: {\n baz: { biff: 'BIFF' }\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 }; // 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 // ..........................................................\n //\n // LOCAL PATHS\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\n // ..........................................................\n // DEPRECATED\n //\n ['@test [obj, bla.bla] gives a proper exception message'](assert) {\n let exceptionMessage = 'Property set failed: object in path \"bla\" could not be found.';\n try {\n (0, _metal.set)(obj, 'bla.bla', 'BAM');\n } catch (ex) {\n assert.equal(ex.message, exceptionMessage);\n }\n }\n\n ['@test [obj, foo.baz.bat] -> EXCEPTION'](assert) {\n assert.throws(() => (0, _metal.set)(obj, 'foo.baz.bat', 'BAM'));\n }\n\n ['@test [obj, foo.baz.bat] -> EXCEPTION'](assert) {\n (0, _metal.trySet)(obj, 'foo.baz.bat', 'BAM');\n assert.ok(true, 'does not raise');\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/set_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('set', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _metal.setHasViews)(() => false);\n }\n\n ['@test should set arbitrary properties on an object'](assert) {\n let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null,\n undefinedValue: undefined\n };\n\n let newObj = {};\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(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(newObj.hasOwnProperty(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 let obj = {};\n\n (0, _metal.set)(obj, 1, 'first');\n assert.equal(obj[1], 'first');\n }\n\n ['@test should set an array index'](assert) {\n let arr = ['first', 'second'];\n\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 let 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 let 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 let obj = { 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 (0, _metal.setHasViews)(() => true);\n let obj = {};\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\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 let obj = { 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});","enifed('@ember/-internals/metal/tests/alias_test', ['@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let 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 = { foo: { faz: 'FOO' } };\n count = 0;\n }\n\n afterEach() {\n obj = null;\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 ['@test old dependent keys should not trigger property changes'](assert) {\n let 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 (0, _metal.addObserver)(obj1, 'baz', incrementCount);\n\n (0, _metal.set)(obj1, 'foo', 'FOO');\n assert.equal(count, 1);\n\n (0, _metal.removeObserver)(obj1, 'baz', incrementCount);\n\n (0, _metal.set)(obj1, 'foo', 'OOF');\n assert.equal(count, 1);\n }\n\n [`@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 let obj1 = Object.create(null);\n obj1.incrementCount = incrementCount;\n\n (0, _meta.meta)(obj1).proto = obj1;\n\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.addObserver)(obj1, 'baz', null, 'incrementCount');\n\n let obj2 = Object.create(obj1);\n (0, _metal.defineProperty)(obj2, 'baz', (0, _metal.alias)('bar')); // override baz\n\n (0, _metal.set)(obj2, 'foo', 'FOO');\n assert.equal(count, 1);\n\n (0, _metal.removeObserver)(obj2, 'baz', null, 'incrementCount');\n\n (0, _metal.set)(obj2, 'foo', 'OOF');\n assert.equal(count, 1);\n }\n\n ['@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 assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n assert.equal(count, 1);\n }\n\n ['@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 assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n assert.equal(count, 1);\n }\n\n ['@test object with 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\n let tag = (0, _metal.tagFor)(obj);\n let tagValue = tag.value();\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n\n assert.ok(!tag.validate(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 destroyed alias does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.defineProperty)(obj, 'bar', null);\n\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n }\n\n ['@test setting on oneWay alias does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz').oneWay());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.set)(obj, 'bar', null);\n\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n }\n\n ['@test redefined alias with observer does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz').oneWay());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n\n assert.equal(count, 0);\n\n (0, _metal.set)(obj, 'bar', null);\n\n assert.equal(count, 1);\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n\n assert.equal(count, 1);\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.set)(obj, 'foo.faz', 'great');\n\n assert.equal(count, 2);\n }\n });\n});","enifed('@ember/-internals/metal/tests/chains_test', ['@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Chains', class extends _internalTestHelpers.AbstractTestCase {\n ['@test finishChains should properly copy chains from prototypes to instances'](assert) {\n function didChange() {}\n\n let obj = {};\n (0, _metal.addObserver)(obj, 'foo.bar', null, didChange);\n\n let childObj = Object.create(obj);\n\n let parentMeta = (0, _meta.meta)(obj);\n let childMeta = (0, _meta.meta)(childObj);\n\n (0, _metal.finishChains)(childMeta);\n\n assert.ok(parentMeta.readableChains() !== childMeta.readableChains(), 'The chains object is copied');\n }\n\n ['@test does not observe primitive values'](assert) {\n let obj = {\n foo: { bar: 'STRING' }\n };\n\n (0, _metal.addObserver)(obj, 'foo.bar.baz', null, function () {});\n let meta = (0, _meta.peekMeta)(obj);\n assert.notOk(meta._object);\n }\n\n ['@test observer and CP chains'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('qux.[]', function () {}));\n (0, _metal.defineProperty)(obj, 'qux', (0, _metal.computed)(function () {}));\n\n // create DK chains\n (0, _metal.get)(obj, 'foo');\n\n // create observer chain\n (0, _metal.addObserver)(obj, 'qux.length', function () {});\n\n /*\n +-----+\n | qux | root CP\n +-----+\n ^\n +------+-----+\n | |\n +--------+ +----+\n | length | | [] | chainWatchers\n +--------+ +----+\n observer CP(foo, 'qux.[]')\n */\n\n // invalidate qux\n (0, _metal.notifyPropertyChange)(obj, 'qux');\n\n // CP chain is blown away\n\n /*\n +-----+\n | qux | root CP\n +-----+\n ^\n +------+xxxxxx\n | x\n +--------+ xxxxxx\n | length | x [] x chainWatchers\n +--------+ xxxxxx\n observer CP(foo, 'qux.[]')\n */\n\n (0, _metal.get)(obj, 'qux'); // CP chain re-recreated\n assert.ok(true, 'no crash');\n }\n\n ['@test checks cache correctly'](assert) {\n let obj = {};\n let parentChainNode = new _metal.ChainNode(null, null, obj);\n let chainNode = new _metal.ChainNode(parentChainNode, 'foo');\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return undefined;\n }));\n (0, _metal.get)(obj, 'foo');\n\n assert.strictEqual(chainNode.value(), undefined);\n }\n\n ['@test chains are watched correctly'](assert) {\n let obj = { foo: { bar: { baz: 1 } } };\n\n (0, _metal.watch)(obj, 'foo.bar.baz');\n\n assert.equal((0, _metal.watcherCount)(obj, 'foo'), 1);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar.baz'), 1);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar'), 1);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo.bar, 'baz'), 1);\n\n (0, _metal.unwatch)(obj, 'foo.bar.baz');\n\n assert.equal((0, _metal.watcherCount)(obj, 'foo'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo.bar, 'baz'), 0);\n }\n\n ['@test chains with single character keys are watched correctly'](assert) {\n let obj = { a: { b: { c: 1 } } };\n\n (0, _metal.watch)(obj, 'a.b.c');\n\n assert.equal((0, _metal.watcherCount)(obj, 'a'), 1);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b.c'), 1);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b'), 1);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a.b, 'c'), 1);\n\n (0, _metal.unwatch)(obj, 'a.b.c');\n\n assert.equal((0, _metal.watcherCount)(obj, 'a'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a.b, 'c'), 0);\n }\n\n ['@test writable chains is not defined more than once'](assert) {\n assert.expect(0);\n\n class Base {\n constructor() {\n (0, _metal.finishChains)((0, _meta.meta)(this));\n }\n\n didChange() {}\n }\n\n Base.prototype.foo = {\n bar: {\n baz: {\n value: 123\n }\n }\n };\n\n // Define a standard computed property, which will eventually setup dependencies\n (0, _metal.defineProperty)(Base.prototype, 'bar', (0, _metal.computed)('foo.bar', {\n get() {\n return this.foo.bar;\n }\n }));\n\n // Define some aliases, which will proxy chains along\n (0, _metal.defineProperty)(Base.prototype, 'baz', (0, _metal.alias)('bar.baz'));\n (0, _metal.defineProperty)(Base.prototype, 'value', (0, _metal.alias)('baz.value'));\n\n // Define an observer, which will eagerly attempt to setup chains and watch\n // their values. This follows the aliases eagerly, and forces the first\n // computed to actually set up its values/dependencies for chains. If\n // writableChains was not already defined, this results in multiple root\n // chain nodes being defined on the same object meta.\n (0, _metal.addObserver)(Base.prototype, 'value', null, 'didChange');\n\n class Child extends Base {}\n\n let childObj = new Child();\n\n (0, _metal.set)(childObj, 'foo.bar', {\n baz: {\n value: 456\n }\n });\n }\n });\n});","enifed('@ember/-internals/metal/tests/computed_test', ['@ember/-internals/runtime', '@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_runtime, _metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let obj, count;\n\n (0, _internalTestHelpers.moduleFor)('computed', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property should be an instance of descriptor'](assert) {\n assert.ok((0, _metal.computed)(function () {}) instanceof _metal.Descriptor);\n }\n\n ['@test computed properties assert the presence of a getter or setter function']() {\n expectAssertion(function () {\n (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 (0, _metal.computed)('nolastargument');\n }, 'computed expects a function or an object as last argument.');\n }\n\n ['@test computed properties defined with an object only allow `get` and `set` keys']() {\n expectAssertion(function () {\n (0, _metal.computed)({\n get() {},\n set() {},\n other() {}\n });\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 let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\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 let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\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 defining computed property should invoke property on set'](assert) {\n let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\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 }\n\n ['@test defining a computed property with a dependent key ending with @each is expanded to []'](assert) {\n let cp = (0, _metal.computed)('blazo.@each', function () {});\n\n assert.deepEqual(cp._dependentKeys, ['blazo.[]']);\n\n cp = (0, _metal.computed)('qux', 'zoopa.@each', function () {});\n\n assert.deepEqual(cp._dependentKeys, ['qux', 'zoopa.[]']);\n }\n\n ['@test defining a computed property with a dependent key more than one level deep beyond @each is not supported']() {\n expectNoWarning(() => {\n (0, _metal.computed)('todos', () => {});\n });\n\n expectNoWarning(() => {\n (0, _metal.computed)('todos.@each.owner', () => {});\n });\n\n expectWarning(() => {\n (0, _metal.computed)('todos.@each.owner.name', () => {});\n }, /You used the key \"todos\\.@each\\.owner\\.name\" which is invalid\\. /);\n\n expectWarning(() => {\n (0, _metal.computed)('todos.@each.owner.@each.name', () => {});\n }, /You used the key \"todos\\.@each\\.owner\\.@each\\.name\" which is invalid\\. /);\n }\n });\n\n let objA, objB;\n (0, _internalTestHelpers.moduleFor)('computed should inherit through prototype', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\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 afterEach() {\n objA = objB = null;\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\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\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\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 _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\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 afterEach() {\n objA = objB = null;\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\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\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\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 _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\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 set(key, value) {\n this['__' + key] = 'B ' + value;\n return this['__' + key];\n }\n }));\n }\n\n afterEach() {\n objA = objB = null;\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\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\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\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 let computedProperty = (0, _metal.computed)(function () {});\n computedProperty.meta({ 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 let computedProperty = (0, _metal.computed)(function () {});\n assert.deepEqual(computedProperty.meta(), {}, 'returned value is an empty hash');\n }\n });\n\n // ..........................................................\n // CACHEABLE\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - cacheable', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {};\n count = 0;\n let func = function () {\n count++;\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({ get: func, set: func }));\n }\n\n afterEach() {\n obj = count = null;\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\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 let objB = Object.create(obj);\n\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\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\n (0, _metal.set)(obj, 'foo', 'baz'); // modify A\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 getCachedValueFor should return the cached value'](assert) {\n assert.equal((0, _metal.getCachedValueFor)(obj, 'foo'), undefined, 'should not yet be a cached value');\n\n (0, _metal.get)(obj, 'foo');\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'foo'), 'bar 1', 'should retrieve cached value');\n }\n\n ['@test getCachedValueFor should return falsy cached values'](assert) {\n (0, _metal.defineProperty)(obj, 'falsy', (0, _metal.computed)(function () {\n return false;\n }));\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'falsy'), undefined, 'should not yet be a cached value');\n\n (0, _metal.get)(obj, 'falsy');\n\n assert.equal((0, _metal.getCachedValueFor)(obj, '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 let obj = {\n foo: 0\n };\n\n let receivedOldValue;\n\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)({\n get() {},\n set(key, value, oldValue) {\n receivedOldValue = oldValue;\n return value;\n }\n }).property('foo'));\n\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.strictEqual(receivedOldValue, undefined, 'oldValue should be undefined');\n\n (0, _metal.set)(obj, 'plusOne', 2);\n assert.strictEqual(receivedOldValue, 1, 'oldValue should be 1');\n\n (0, _metal.set)(obj, 'plusOne', 3);\n assert.strictEqual(receivedOldValue, 2, 'oldValue should be 2');\n }\n });\n\n // ..........................................................\n // DEPENDENT KEYS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = { bar: 'baz' };\n count = 0;\n let getterAndSetter = function () {\n count++;\n (0, _metal.get)(this, 'bar');\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get: getterAndSetter,\n set: getterAndSetter\n }).property('bar'));\n }\n\n afterEach() {\n obj = count = null;\n }\n\n ['@test should lazily watch dependent keys on set'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n }\n\n ['@test should lazily watch dependent keys on get'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n (0, _metal.get)(obj, 'foo');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n }\n\n ['@test local dependent key should invalidate cache'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'get once');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'cached retrieve');\n }\n\n ['@test should invalidate multiple nested dependent keys'](assert) {\n let count = 0;\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n count++;\n (0, _metal.get)(this, 'baz');\n return 'baz ' + count;\n }).property('baz'));\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'get once');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'baz', 'BIFF'); // should invalidate bar -> foo\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'should not be watching dependent key after cache cleared');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), false, 'should not be watching dependent key after cache cleared');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'cached retrieve');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), true, 'lazily setup watching dependent key');\n }\n\n ['@test circular keys should not blow up'](assert) {\n let func = function () {\n count++;\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)({ get: func, set: func }).property('foo'));\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n count++;\n return 'foo ' + count;\n }).property('bar'));\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\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.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n count++;\n return 'baz ' + count;\n }).property('baz'));\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'after redefining should not be watching dependent key');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should not kill cache\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n\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)(function () {\n count++;\n return 'foo ' + count;\n }).property('qux.{bar,baz}'));\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\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\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\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)(function () {\n count++;\n return 'roo ' + count;\n }).property('fee.{bar, baz,bop , }'));\n }, /cannot contain spaces/);\n }\n\n ['@test throws an assertion if an uncached `get` is called after object is destroyed'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n\n let meta = (0, _meta.meta)(obj);\n meta.destroy();\n\n obj.toString = () => '';\n\n expectAssertion(() => {\n (0, _metal.get)(obj, 'foo');\n }, 'Cannot modify dependent keys for `foo` on `` after it has been destroyed.');\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'deps were not updated');\n }\n });\n\n // ..........................................................\n // CHAINED DEPENDENT KEYS\n //\n\n let func;\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey with chained properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n };\n\n count = 0;\n func = function () {\n count++;\n return (0, _metal.get)(obj, 'foo.bar.baz.biff') + ' ' + count;\n };\n }\n\n afterEach() {\n obj = count = func = null;\n }\n\n ['@test depending on simple chain'](assert) {\n // assign computed property\n (0, _metal.defineProperty)(obj, 'prop', (0, _metal.computed)(func).property('foo.bar.baz.biff'));\n\n assert.equal((0, _metal.get)(obj, 'prop'), 'BIFF 1');\n\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\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', { biff: 'BLOB' });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n\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\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n\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\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n\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\n (0, _metal.defineProperty)(obj, 'prop');\n (0, _metal.set)(obj, 'prop', 'NONE');\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE');\n\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE'); // should do nothing\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)(function () {}).property('bar.b'));\n assert.equal(count, 0, 'b should not run');\n }\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 let 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 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', '' + value); // side effect\n return parseInt(this.get('a'));\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 setter can be omited'](assert) {\n let 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 }).create();\n\n assert.ok(testObj.get('aInt') === 1, 'getter works');\n assert.ok(testObj.get('a') === '1');\n testObj.set('aInt', '123');\n assert.ok(testObj.get('aInt') === '123', 'cp has been updated too');\n }\n\n ['@test getter can be omited'](assert) {\n let testObj = _runtime.Object.extend({\n com: (0, _metal.computed)({\n set(key, value) {\n return value;\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 let 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 set() {\n return 'set-value';\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 // ..........................................................\n // BUGS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed edge cases', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adding a computed property should show up in key iteration'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {}));\n\n let found = [];\n for (let key in obj) {\n found.push(key);\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 let obj = {};\n let oldValueIsNoFunction = true;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {},\n set(key, value, oldValue) {\n if (typeof oldValue === 'function') {\n oldValueIsNoFunction = false;\n }\n return undefined;\n }\n }));\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', undefined);\n\n assert.ok(oldValueIsNoFunction);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - setter', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setting a watched computed property'](assert) {\n let obj = {\n firstName: 'Yehuda',\n lastName: 'Katz'\n };\n\n (0, _metal.defineProperty)(obj, 'fullName', (0, _metal.computed)({\n get() {\n return (0, _metal.get)(this, 'firstName') + ' ' + (0, _metal.get)(this, 'lastName');\n },\n set(key, value) {\n let values = value.split(' ');\n (0, _metal.set)(this, 'firstName', values[0]);\n (0, _metal.set)(this, 'lastName', values[1]);\n return value;\n }\n }).property('firstName', 'lastName'));\n\n let fullNameDidChange = 0;\n let firstNameDidChange = 0;\n let 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\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Yehuda Katz');\n\n (0, _metal.set)(obj, 'fullName', 'Yehuda Katz');\n\n (0, _metal.set)(obj, 'fullName', 'Kris Selden');\n\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\n assert.equal(fullNameDidChange, 1);\n assert.equal(firstNameDidChange, 1);\n assert.equal(lastNameDidChange, 1);\n }\n\n ['@test setting a cached computed property that modifies the value you give it'](assert) {\n let obj = {\n foo: 0\n };\n\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)({\n get() {\n return (0, _metal.get)(this, 'foo') + 1;\n },\n set(key, value) {\n (0, _metal.set)(this, 'foo', value);\n return value + 1;\n }\n }).property('foo'));\n\n let plusOneDidChange = 0;\n (0, _metal.addObserver)(obj, 'plusOne', function () {\n plusOneDidChange++;\n });\n\n assert.equal((0, _metal.get)(obj, 'plusOne'), 1);\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n\n assert.equal(plusOneDidChange, 1);\n\n (0, _metal.set)(obj, 'foo', 5);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 6);\n\n assert.equal(plusOneDidChange, 2);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - default setter', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test when setting a value on a computed property that doesn't handle sets\"](assert) {\n let obj = {};\n let observerFired = false;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return 'foo';\n }));\n\n (0, _metal.addObserver)(obj, 'foo', null, () => observerFired = true);\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'The set value is properly returned');\n assert.ok(typeof obj.foo === 'string', 'The computed property was removed');\n assert.ok(observerFired, 'The observer was still notified');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - readOnly', class extends _internalTestHelpers.AbstractTestCase {\n ['@test is chainable'](assert) {\n let cp = (0, _metal.computed)(function () {}).readOnly();\n\n assert.ok(cp instanceof _metal.Descriptor);\n assert.ok(cp instanceof _metal.ComputedProperty);\n }\n\n ['@test throws assertion if called over a CP with a setter defined with the new syntax']() {\n expectAssertion(() => {\n (0, _metal.computed)({\n get() {},\n set() {}\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 let obj = {};\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return 'barValue';\n }).readOnly());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n\n assert.throws(() => {\n (0, _metal.set)(obj, 'bar', 'newBar');\n }, /Cannot set read\\-only property \"bar\" on object:/);\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n }\n });\n});","enifed('@ember/-internals/metal/tests/descriptor_test', ['@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers'], function (_runtime, _metal, _internalTestHelpers) {\n 'use strict';\n\n let 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 let { object } = this;\n\n (0, _metal.defineProperty)(object, key, desc);\n\n assert.ok(object.hasOwnProperty(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 }, 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 let { proto } = this;\n\n (0, _metal.defineProperty)(proto, key, desc);\n\n assert.ok(proto.hasOwnProperty(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 }, 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 }, 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 }, 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/descriptor'), class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining a configurable property'](assert) {\n let factory = new TestClass(assert);\n\n factory.install('foo', (0, _metal.descriptor)({ configurable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n delete source.foo;\n\n assert.strictEqual(obj.foo, undefined);\n\n Object.defineProperty(source, 'foo', { configurable: true, value: 'baz' });\n\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a non-configurable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ configurable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.throws(() => delete source.foo, TypeError);\n\n assert.throws(() => Object.defineProperty(source, 'foo', {\n configurable: true,\n value: 'baz'\n }), TypeError);\n\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining an enumerable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ enumerable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.ok(Object.keys(source).indexOf('foo') !== -1);\n }\n\n ['@test defining a non-enumerable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ enumerable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.ok(Object.keys(source).indexOf('foo') === -1);\n }\n\n ['@test defining a writable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ writable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n source.foo = 'baz';\n\n assert.equal(obj.foo, 'baz');\n\n obj.foo = 'bat';\n\n assert.equal(obj.foo, 'bat');\n }\n\n ['@test defining a non-writable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ writable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.throws(() => source.foo = 'baz', TypeError);\n assert.throws(() => obj.foo = 'baz', TypeError);\n\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining a getter'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n get: function () {\n return this.__foo__;\n }\n }), assert);\n\n factory.set('__foo__', 'bar');\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n obj.__foo__ = 'baz';\n\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a setter'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n\n factory.set('__foo__', 'bar');\n\n let obj = factory.finalize();\n\n assert.equal(obj.__foo__, 'bar');\n\n obj.foo = 'baz';\n\n assert.equal(obj.__foo__, 'baz');\n }\n\n ['@test combining multiple setter and getters'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n get: function () {\n return this.__foo__;\n },\n\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n\n factory.set('__foo__', 'foo');\n\n factory.install('bar', (0, _metal.descriptor)({\n get: function () {\n return this.__bar__;\n },\n\n set: function (value) {\n this.__bar__ = value;\n }\n }), assert);\n\n factory.set('__bar__', 'bar');\n\n factory.install('fooBar', (0, _metal.descriptor)({\n get: function () {\n return this.foo + '-' + this.bar;\n }\n }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.fooBar, 'foo-bar');\n\n obj.foo = 'FOO';\n\n assert.equal(obj.fooBar, 'FOO-bar');\n\n obj.__bar__ = 'BAR';\n\n assert.equal(obj.fooBar, 'FOO-BAR');\n\n assert.throws(() => obj.fooBar = 'foobar', TypeError);\n\n assert.equal(obj.fooBar, 'FOO-BAR');\n }\n });\n });\n});","enifed('@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 let obj = {};\n let 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\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'received event');\n\n (0, _metal.removeListener)(obj, 'event!', F);\n\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 let count = 0;\n\n let obj = {\n func() {\n count++;\n }\n };\n\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n\n let obj2 = Object.create(obj);\n\n assert.equal(count, 0, 'nothing yet');\n\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 1, 'received event');\n\n (0, _metal.removeListener)(obj2, 'event!', null, 'func');\n\n count = 0;\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 0, 'did not receive event');\n\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 let count = 0;\n let 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\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 let obj = {};\n let target;\n\n target = {\n count: 0,\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 let obj = {};\n let target;\n\n target = {\n count: 0,\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 (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 let obj = {};\n let params = null;\n (0, _metal.addListener)(obj, 'event!', function () {\n params = Array.prototype.slice.call(arguments);\n });\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 let obj = {};\n\n function F() {}\n function F2() {}\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'no listeners at first');\n\n (0, _metal.addListener)(obj, 'event!', F);\n (0, _metal.addListener)(obj, 'event!', F2);\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n\n (0, _metal.removeListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n\n (0, _metal.removeListener)(obj, 'event!', F2);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'has no more listeners');\n\n (0, _metal.addListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n }\n\n ['@test calling removeListener without method should remove all listeners'](assert) {\n expectDeprecation(() => {\n let obj = {};\n function F() {}\n function F2() {}\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'no listeners at first');\n\n (0, _metal.addListener)(obj, 'event!', F);\n (0, _metal.addListener)(obj, 'event!', F2);\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n (0, _metal.removeListener)(obj, 'event!');\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'has no more listeners');\n }, /The remove all functionality of removeListener and removeObserver has been deprecated/);\n }\n\n ['@test a listener can be added as part of a mixin'](assert) {\n let triggered = 0;\n let MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.on)('bar', function () {\n triggered++;\n }),\n\n foo2: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n\n let obj = {};\n MyMixin.apply(obj);\n\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\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 let triggered = 0;\n let FirstMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n let SecondMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('baz', function () {\n triggered++;\n })\n });\n\n let obj = {};\n FirstMixin.apply(obj);\n SecondMixin.apply(obj);\n\n (0, _metal.sendEvent)(obj, 'bar');\n assert.equal(triggered, 0, 'should not invoke from overridden property');\n\n (0, _metal.sendEvent)(obj, 'baz');\n assert.equal(triggered, 1, 'should invoke from subclass property');\n }\n });\n});","enifed('@ember/-internals/metal/tests/expand_properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let 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\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\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\n (0, _metal.expandProperties)('a.b.{c,d}', addProperty);\n\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\n (0, _metal.expandProperties)('{a,b,c}', addProperty);\n\n let 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\n (0, _metal.expandProperties)('a.b.{c}.d.{e}', addProperty);\n\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\n (0, _metal.expandProperties)('a.{b,c,d}.e', addProperty);\n\n let 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\n (0, _metal.expandProperties)('{a,b,c}.d.{e,f}.g', addProperty);\n\n let 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\n (0, _metal.expandProperties)('{a,b,c}.{d}.{e,f}', addProperty);\n\n let 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 let 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\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\n (0, _metal.expandProperties)('a,b,c.d.e,f', addProperty);\n\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\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\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});","enifed('@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)('InjectedProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test injected properties should be descriptors'](assert) {\n assert.ok(new _metal.InjectedProperty() instanceof _metal.Descriptor);\n }\n\n ['@test injected properties should be overridable'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty());\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\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 let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type', 'name'));\n\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 let 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', new _metal.InjectedProperty('type', 'name'));\n\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\n let obj = {};\n\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', new _metal.InjectedProperty('type', 'name'));\n\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 let obj = {};\n\n (0, _owner.setOwner)(obj, {\n lookup(key) {\n return key;\n }\n });\n\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:foo', 'should lookup the type using the property name');\n }\n });\n});","enifed('@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 let string = 'string';\n let fn = function () {};\n let object = { 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});","enifed('@ember/-internals/metal/tests/is_empty_test', ['@ember/-internals/metal', '@ember/map', '@ember/map/lib/ordered-set', 'internal-test-helpers'], function (_metal, _map, _orderedSet, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isEmpty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isEmpty'](assert) {\n let string = 'string';\n let fn = function () {};\n let object = { length: 0 };\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 }\n\n ['@test isEmpty Map'](assert) {\n expectDeprecation(() => {\n let map = new _map.default();\n assert.equal(true, (0, _metal.isEmpty)(map), 'Empty map is empty');\n map.set('foo', 'bar');\n assert.equal(false, (0, _metal.isEmpty)(map), 'Map is not empty');\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test isEmpty Ember.OrderedSet'](assert) {\n expectDeprecation(() => {\n let orderedSet = new _orderedSet.default();\n assert.equal(true, (0, _metal.isEmpty)(orderedSet), 'Empty ordered set is empty');\n orderedSet.add('foo');\n assert.equal(false, (0, _metal.isEmpty)(orderedSet), 'Ordered set is not empty');\n }, 'Use of @ember/OrderedSet is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n });\n});","enifed('@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 let string = 'string';\n let 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});","enifed('@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 let string = 'string';\n let fn = function () {};\n let object = { 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});","enifed('@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 /* globals EmberDev */\n let libs, registry;\n let originalWarn = (0, _debug.getDebugFunction)('warn');\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\n (0, _debug.setDebugFunction)('warn', originalWarn);\n }\n\n ['@test core libraries come before other libraries'](assert) {\n assert.expect(2);\n\n libs.register('my-lib', '2.0.0a');\n libs.registerCoreLibrary('DS', '1.0.0-beta.2');\n\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);\n\n // overwrite warn to supress the double registration warning (see https://github.com/emberjs/ember.js/issues/16391)\n (0, _debug.setDebugFunction)('warn', noop);\n libs.register('magic', 1.23);\n libs.register('magic', 2.23);\n\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\n assert.equal(libs.isRegistered('magic'), false);\n\n libs.register('magic', 1.23);\n assert.equal(libs.isRegistered('magic'), true);\n\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 (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(1);\n\n libs.register('magic', 1.23);\n\n (0, _debug.setDebugFunction)('warn', function (msg, test) {\n if (!test) {\n assert.equal(msg, 'Library \"magic\" is already registered with Ember.');\n }\n });\n\n // Should warn us\n libs.register('magic', 2.23);\n }\n\n ['@test libraries can be de-registered'](assert) {\n assert.expect(2);\n\n libs.register('lib1', '1.0.0b');\n libs.register('lib2', '1.0.0b');\n libs.register('lib3', '1.0.0b');\n\n libs.deRegister('lib1');\n libs.deRegister('lib3');\n\n assert.equal(registry[0].name, 'lib2');\n assert.equal(registry.length, 1);\n }\n });\n});","enifed('@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 const 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\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 }\n\n // Positive test cases\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);\n\n // Negative test cases\n validateVersionString('1.11.3.aba18a', false);\n validateVersionString('1.11', false);\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/alias_method_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function validateAliasMethod(assert, obj) {\n assert.equal(obj.fooMethod(), 'FOO', 'obj.fooMethod()');\n assert.equal(obj.barMethod(), 'FOO', 'obj.barMethod should be a copy of foo');\n }\n\n (0, _internalTestHelpers.moduleFor)('aliasMethod', class extends _internalTestHelpers.AbstractTestCase {\n ['@test methods of another name are aliased when the mixin is applied'](assert) {\n let MyMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n },\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = MyMixin.apply({});\n validateAliasMethod(assert, obj);\n }\n\n ['@test should follow aliasMethods all the way down'](assert) {\n let MyMixin = _metal.Mixin.create({\n bar: (0, _metal.aliasMethod)('foo'), // put first to break ordered iteration\n baz() {\n return 'baz';\n },\n foo: (0, _metal.aliasMethod)('baz')\n });\n\n let obj = MyMixin.apply({});\n assert.equal((0, _metal.get)(obj, 'bar')(), 'baz', 'should have followed aliasMethods');\n }\n\n ['@test should alias methods from other dependent mixins'](assert) {\n let BaseMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n }\n });\n\n let MyMixin = _metal.Mixin.create(BaseMixin, {\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = MyMixin.apply({});\n validateAliasMethod(assert, obj);\n }\n\n ['@test should alias methods from other mixins applied at same time'](assert) {\n let BaseMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n }\n });\n\n let MyMixin = _metal.Mixin.create({\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = (0, _metal.mixin)({}, BaseMixin, MyMixin);\n validateAliasMethod(assert, obj);\n }\n\n ['@test should alias methods from mixins already applied on object'](assert) {\n let BaseMixin = _metal.Mixin.create({\n quxMethod() {\n return 'qux';\n }\n });\n\n let MyMixin = _metal.Mixin.create({\n bar: (0, _metal.aliasMethod)('foo'),\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = {\n fooMethod() {\n return 'FOO';\n }\n };\n\n BaseMixin.apply(obj);\n MyMixin.apply(obj);\n\n validateAliasMethod(assert, obj);\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create({ foo: 'FOO', baz: K });\n let obj = {};\n (0, _metal.mixin)(obj, MixinA);\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 anonymous properties'](assert) {\n let obj = {};\n (0, _metal.mixin)(obj, {\n foo: 'FOO',\n baz: K\n });\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 let obj = { tagName: '' };\n (0, _metal.mixin)(obj, { tagName: undefined });\n\n assert.strictEqual((0, _metal.get)(obj, 'tagName'), '');\n }\n });\n});","enifed('@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 let MixinA, MixinB, MixinC, MixinD;\n let obj;\n\n MixinA = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return 'A';\n })\n });\n\n MixinB = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'B';\n })\n });\n\n MixinC = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'C';\n })\n });\n\n MixinD = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'D';\n })\n });\n\n obj = {};\n MixinB.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AB', 'should expose super for B');\n\n obj = {};\n MixinC.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AC', 'should expose super for C');\n\n obj = {};\n\n MixinA.apply(obj);\n MixinD.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AD', 'should define super for D');\n\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 let SuperMixin, SubMixin;\n let obj;\n\n let superGetOccurred = false;\n let superSetOccurred = false;\n\n SuperMixin = _metal.Mixin.create({\n aProp: (0, _metal.computed)({\n get() {\n superGetOccurred = true;\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 set() {\n return this._super(...arguments);\n }\n })\n });\n\n obj = {};\n SubMixin.apply(obj);\n\n (0, _metal.set)(obj, 'aProp', 'set thyself');\n assert.ok(superSetOccurred, 'should pass set to _super');\n\n superSetOccurred = false; // reset the set assertion\n\n obj = {};\n SubMixin.apply(obj);\n\n (0, _metal.get)(obj, 'aProp');\n assert.ok(superGetOccurred, 'should pass get to _super');\n\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 works properly when overriding computed properties'](assert) {\n let obj = {};\n\n let 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 let cpWasCalled = false;\n\n let MixinB = _metal.Mixin.create({\n cpWithSetter2: (0, _metal.computed)({\n get: K,\n set() {\n cpWasCalled = true;\n }\n }),\n\n cpWithSetter3: (0, _metal.computed)({\n get: K,\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\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\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\n (0, _metal.set)(obj, 'cpWithoutSetter', 'test');\n assert.equal((0, _metal.get)(obj, 'cpWithoutSetter'), 'test', 'The default setter was called, the value is correct');\n assert.ok(!cpWasCalled, 'The default setter was called, not the CP itself');\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n let MixinB = _metal.Mixin.create({\n foo: ['d', 'e', 'f']\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['a', 'b', 'c', 'd', 'e', 'f']);\n }\n\n ['@test defining concatenated properties should concat future version'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n let MixinB = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n\n assert.deepEqual(obj.concatenatedProperties, []);\n }\n\n ['@test concatenatedProperties should be concatenated'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n let MixinB = _metal.Mixin.create({\n concatenatedProperties: 'bar',\n foo: ['d', 'e', 'f'],\n bar: [1, 2, 3]\n });\n\n let MixinC = _metal.Mixin.create({\n bar: [4, 5, 6]\n });\n\n let 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 not an array should make array'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: [1, 2, 3]\n });\n\n let MixinB = _metal.Mixin.create({\n foo: 4\n });\n\n let 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 not an array should make array'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 'bar'\n });\n\n let 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 let mixinA = _metal.Mixin.create({\n foo: 1\n });\n\n let mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 2\n });\n\n let 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 let mixinA = _metal.Mixin.create({\n foobar: 'foo'\n });\n\n let mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foobar'],\n foobar: 'bar'\n });\n\n let obj = (0, _metal.mixin)({}, mixinA, mixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foobar'), ['foo', 'bar']);\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create();\n let obj = {};\n\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n\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 let MixinA = _metal.Mixin.create({});\n let MixinB = _metal.Mixin.create(MixinA);\n let obj = {};\n\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n\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 let MixinA = _metal.Mixin.create({});\n let MixinB = _metal.Mixin.create(MixinA);\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 let MixinA = _metal.Mixin.create();\n assert.equal(MixinA.detect(null), false);\n }\n });\n});","enifed('@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 const PrivateProperty = _metal.Mixin.create({\n _foo: '_FOO'\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\n const PublicProperty = _metal.Mixin.create({\n foo: 'FOO'\n });\n const PrivateMethod = _metal.Mixin.create({\n _fooMethod() {}\n });\n const PublicMethod = _metal.Mixin.create({\n fooMethod() {}\n });\n const BarProperties = _metal.Mixin.create({\n _bar: '_BAR',\n bar: 'bar'\n });\n const BarMethods = _metal.Mixin.create({\n _barMethod() {},\n barMethod() {}\n });\n\n const Combined = _metal.Mixin.create(BarProperties, BarMethods);\n\n let obj;\n\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 ['@test setting a NAME_KEY on a mixin does not error'](assert) {\n assert.expect(0);\n\n let instance = _metal.Mixin.create();\n instance[_utils.NAME_KEY] = 'My special name!';\n }\n\n ['@test setting a NAME_KEY on a mixin instance does not error'](assert) {\n assert.expect(0);\n\n _metal.Mixin.create({ [_utils.NAME_KEY]: 'My special name' });\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: { d: true, e: true, f: true }\n });\n\n let 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 let MixinA = _metal.Mixin.create({\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { d: true, e: true, f: true }\n });\n\n let 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 let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: null\n });\n\n let MixinB = _metal.Mixin.create({\n foo: null\n });\n\n let 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 let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: 1 }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: { a: 2 }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), { a: 2 });\n }\n\n ['@test mergedProperties should be concatenated'](assert) {\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n mergedProperties: 'bar',\n foo: { d: true, e: true, f: true },\n bar: { a: true, l: true }\n });\n\n let MixinC = _metal.Mixin.create({\n bar: { e: true, x: true }\n });\n\n let 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'), { a: true, b: true, c: true, d: true, e: true, f: true }, 'get foo');\n assert.deepEqual((0, _metal.get)(obj, 'bar'), { a: true, l: true, e: true, x: true }, 'get bar');\n }\n\n ['@test mergedProperties should exist even if not explicitly set on create'](assert) {\n let AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 'a',\n b: {\n c: 'ccc'\n }\n }\n });\n\n let obj = AnObj.create({\n options: {\n a: 'A'\n }\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 let AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 1\n }\n });\n\n let objA = AnObj.create({\n options: {\n a: 2\n }\n });\n let objB = AnObj.create({\n options: {\n a: 3\n }\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 let 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 let 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 let 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 let 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 let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let 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});","enifed('@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 let MixinA, obj, props;\n\n props = {\n publicMethod() {\n return 'publicMethod';\n },\n _privateMethod() {\n return 'privateMethod';\n }\n };\n\n MixinA = _metal.Mixin.create(props);\n obj = {};\n MixinA.apply(obj);\n\n // but should be defined\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 let MixinA, MixinB, MixinD, MixinF, obj;\n\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\n obj = {};\n MixinD.apply(obj);\n assert.equal(obj.publicMethod(), 'AD', 'should define super for A and B');\n\n obj = {};\n MixinA.apply(obj);\n MixinF.apply(obj);\n assert.equal(obj.publicMethod(), 'AF', 'should define super for A and F');\n\n obj = {\n publicMethod() {\n return 'obj';\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 let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let objA = {};\n MixinA.apply(objA);\n\n let objB = Object.create(objA);\n MixinB.apply(objB);\n\n cnt = 0;\n objB.foo();\n assert.equal(cnt, 2, 'should invoke both methods');\n\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 let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let MixinC = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let MixinD = _metal.Mixin.create(MixinB, MixinC, MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinD.apply(obj);\n MixinA.apply(obj); // try to apply again..\n\n cnt = 0;\n obj.foo();\n\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 let MixinA = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n\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 let remaining = 3;\n let MixinA = _metal.Mixin.create({\n foo() {\n if (remaining-- > 0) {\n this._super(...arguments);\n }\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n MixinB.apply(obj);\n\n obj.foo();\n assert.ok(true);\n }\n });\n\n // ..........................................................\n // CONFLICTS\n //\n (0, _internalTestHelpers.moduleFor)('Method Conflicts', class extends _internalTestHelpers.AbstractTestCase {\n ['@test overriding toString'](assert) {\n let MixinA = _metal.Mixin.create({\n toString() {\n return 'FOO';\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n\n obj = {};\n (0, _metal.mixin)(obj, {\n toString() {\n return 'FOO';\n }\n });\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n }\n });\n\n // ..........................................................\n // BUGS\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 let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let MixinC = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let obj = {};\n (0, _metal.mixin)(obj, MixinA); // sup already exists\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});","enifed('@ember/-internals/metal/tests/mixin/observer_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin observer', class extends _internalTestHelpers.AbstractTestCase {\n ['@test global observer helper'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test global observer helper takes multiple params'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', 'baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer after change');\n }\n\n ['@test replacing observer should remove old observer'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let 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 let obj = (0, _metal.mixin)({}, MyMixin, Mixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 10, 'should invoke observer after change');\n }\n\n ['@test observing chain with property before'](assert) {\n let obj2 = { baz: 'baz' };\n\n let 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 let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property after'](assert) {\n let obj2 = { baz: 'baz' };\n\n let 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 let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin applied later'](assert) {\n let obj2 = { baz: 'baz' };\n\n let 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 let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n MyMixin2.apply(obj);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with existing property'](assert) {\n let obj2 = { baz: 'baz' };\n\n let 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 let obj = (0, _metal.mixin)({ bar: obj2 }, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin before'](assert) {\n let obj2 = { baz: 'baz' };\n let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let 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 let obj = (0, _metal.mixin)({}, MyMixin2, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin after'](assert) {\n let obj2 = { baz: 'baz' };\n let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let 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 let obj = (0, _metal.mixin)({}, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with overridden property'](assert) {\n let obj2 = { baz: 'baz' };\n let obj3 = { baz: 'foo' };\n\n let MyMixin2 = _metal.Mixin.create({ bar: obj3 });\n\n let 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 let obj = (0, _metal.mixin)({ bar: obj2 }, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n assert.equal((0, _metal.isWatching)(obj2, 'baz'), false, 'should not be watching baz');\n assert.equal((0, _metal.isWatching)(obj3, 'baz'), true, 'should be watching baz');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj3, 'baz', 'BEAR');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create({ foo: 'FOO', baz: 'BAZ' });\n MixinA.reopen({ bar: 'BAR', foo: 'FOO2' });\n let obj = {};\n MixinA.apply(obj);\n\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 let 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 return 'Breakfast!';\n }\n });\n\n Taco.reopen({\n createBreakfast() {\n return this._super(...arguments);\n }\n });\n\n let taco = Taco.create();\n\n let 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\n assert.equal(result, 'Breakfast!');\n }\n });\n});","enifed('@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 let MixinA = _metal.Mixin.create({\n foo: 'FOO',\n bar: 'BAR'\n });\n\n let MixinB = MixinA.without('bar');\n\n let obj = {};\n MixinB.apply(obj);\n\n assert.equal(obj.foo, 'FOO', 'should defined foo');\n assert.equal(obj.bar, undefined, 'should not define bar');\n }\n });\n});","enifed('@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 let mixin = _metal.Mixin.create();\n assert.equal(mixin.toString(), '(unknown)', 'this = null should be handled on Mixin.toString() call');\n }\n });\n});","enifed('@ember/-internals/metal/tests/observer_test', ['@ember/-internals/environment', '@ember/-internals/metal', 'internal-test-helpers'], function (_environment, _metal, _internalTestHelpers) {\n 'use strict';\n\n function K() {}\n\n // ..........................................................\n // ADD OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('addObserver', class extends _internalTestHelpers.AbstractTestCase {\n ['@test observer should assert to invalid input']() {\n expectAssertion(() => {\n (0, _metal.observer)(() => {});\n }, 'observer called without valid path');\n\n expectAssertion(() => {\n (0, _metal.observer)(null);\n }, 'observer called without a function');\n }\n\n ['@test observer should fire when property is modified'](assert) {\n let obj = {};\n let count = 0;\n\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\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n ['@test observer should fire when dependent property is modified'](assert) {\n let obj = { bar: 'bar' };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toUpperCase();\n }).property('bar'));\n\n (0, _metal.get)(obj, 'foo');\n\n let 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\n (0, _metal.set)(obj, 'bar', 'baz');\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n ['@test observer should continue to fire after dependent properties are accessed'](assert) {\n let observerCount = 0;\n let obj = {};\n\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\n (0, _metal.addObserver)(obj, 'prop', function () {\n observerCount++;\n });\n\n (0, _metal.get)(obj, 'anotherProp');\n\n for (let i = 0; i < 10; i++) {\n (0, _metal.notifyPropertyChange)(obj, 'prop');\n }\n\n assert.equal(observerCount, 10, 'should continue to fire indefinitely');\n }\n\n ['@test observer added declaratively via brace expansion should fire when property changes'](assert) {\n if (_environment.ENV.EXTEND_PROTOTYPES.Function) {\n let obj = {};\n let count = 0;\n\n (0, _metal.mixin)(obj, {\n observeFooAndBar: function () {\n count++;\n }.observes('{foo,bar}')\n });\n\n (0, _metal.set)(obj, 'foo', 'foo');\n assert.equal(count, 1, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'bar', 'bar');\n assert.equal(count, 2, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'baz', 'baz');\n assert.equal(count, 2, 'observer not invoked on unspecified property');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observer specified declaratively via brace expansion should fire when dependent property changes'](assert) {\n if (_environment.ENV.EXTEND_PROTOTYPES.Function) {\n let obj = { baz: 'Initial' };\n let count = 0;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toLowerCase();\n }).property('bar'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'baz').toUpperCase();\n }).property('baz'));\n\n (0, _metal.mixin)(obj, {\n fooAndBarWatcher: function () {\n count++;\n }.observes('{foo,bar}')\n });\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'baz', 'Baz');\n // fire once for foo, once for bar\n assert.equal(count, 2, 'observer specified via brace expansion invoked on dependent property change');\n\n (0, _metal.set)(obj, 'quux', 'Quux');\n assert.equal(count, 2, 'observer not fired on unspecified property');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observers watching multiple properties via brace expansion should fire when the properties change'](assert) {\n let obj = {};\n let count = 0;\n\n (0, _metal.mixin)(obj, {\n observeFooAndBar: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n\n (0, _metal.set)(obj, 'foo', 'foo');\n assert.equal(count, 1, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'bar', 'bar');\n assert.equal(count, 2, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'baz', 'baz');\n assert.equal(count, 2, 'observer not invoked on unspecified property');\n }\n\n ['@test observers watching multiple properties via brace expansion should fire when dependent properties change'](assert) {\n let obj = { baz: 'Initial' };\n let count = 0;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toLowerCase();\n }).property('bar'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'baz').toUpperCase();\n }).property('baz'));\n\n (0, _metal.mixin)(obj, {\n fooAndBarWatcher: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'baz', 'Baz');\n // fire once for foo, once for bar\n assert.equal(count, 2, 'observer specified via brace expansion invoked on dependent property change');\n\n (0, _metal.set)(obj, 'quux', 'Quux');\n assert.equal(count, 2, 'observer not fired on unspecified property');\n }\n\n ['@test nested observers should fire in order'](assert) {\n let obj = { foo: 'foo', bar: 'bar' };\n let fooCount = 0;\n let barCount = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n (0, _metal.addObserver)(obj, 'bar', function () {\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(fooCount, 1, 'fooCount should have fired already');\n barCount++;\n });\n\n (0, _metal.set)(obj, 'bar', 'BIFF');\n assert.equal(barCount, 1, 'barCount should have fired');\n assert.equal(fooCount, 1, 'foo should have fired');\n }\n\n ['@test removing an chain observer on change should not fail'](assert) {\n let foo = { bar: 'bar' };\n let obj1 = { foo: foo };\n let obj2 = { foo: foo };\n let obj3 = { foo: foo };\n let obj4 = { foo: foo };\n let count1 = 0;\n let count2 = 0;\n let count3 = 0;\n let count4 = 0;\n\n function observer1() {\n count1++;\n }\n function observer2() {\n count2++;\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 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\n (0, _metal.set)(foo, 'bar', 'baz');\n\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 }\n\n ['@test deferring property change notifications'](assert) {\n let obj = { foo: 'foo' };\n let fooCount = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n\n (0, _metal.beginPropertyChanges)();\n (0, _metal.set)(obj, 'foo', 'BIFF');\n (0, _metal.set)(obj, 'foo', 'BAZ');\n (0, _metal.endPropertyChanges)();\n\n assert.equal(fooCount, 1, 'foo should have fired once');\n }\n\n ['@test deferring property change notifications safely despite exceptions'](assert) {\n let obj = { foo: 'foo' };\n let fooCount = 0;\n let exc = new Error('Something unexpected happened!');\n\n assert.expect(2);\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n\n try {\n (0, _metal.changeProperties)(function () {\n (0, _metal.set)(obj, 'foo', 'BIFF');\n (0, _metal.set)(obj, 'foo', 'BAZ');\n throw exc;\n });\n } catch (err) {\n if (err !== exc) {\n throw err;\n }\n }\n\n assert.equal(fooCount, 1, 'foo should have fired once');\n\n (0, _metal.changeProperties)(function () {\n (0, _metal.set)(obj, 'foo', 'BIFF2');\n (0, _metal.set)(obj, 'foo', 'BAZ2');\n });\n\n assert.equal(fooCount, 2, 'foo should have fired again once');\n }\n\n ['@test addObserver should propagate through prototype'](assert) {\n let obj = { foo: 'foo', count: 0 };\n let obj2;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n this.count++;\n });\n obj2 = Object.create(obj);\n\n (0, _metal.set)(obj2, 'foo', 'bar');\n\n assert.equal(obj2.count, 1, 'should have invoked observer on inherited');\n assert.equal(obj.count, 0, 'should not have invoked observer on parent');\n\n obj2.count = 0;\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(obj.count, 0, 'should not have invoked observer on parent');\n assert.equal(obj2.count, 0, 'should not have invoked observer on inherited');\n }\n\n ['@test addObserver should respect targets with methods'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange(obj, keyName) {\n let 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 let target2 = {\n count: 0,\n\n didChange(obj, keyName) {\n let 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\n (0, _metal.set)(observed, 'foo', 'BAZ');\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 ['@test addObserver should allow multiple objects to observe a property'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n let 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\n (0, _metal.set)(observed, 'foo', 'BAZ');\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 // ..........................................................\n // REMOVE OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('removeObserver', class extends _internalTestHelpers.AbstractTestCase {\n ['@test removing observer should stop firing'](assert) {\n let obj = {};\n let count = 0;\n function F() {\n count++;\n }\n (0, _metal.addObserver)(obj, 'foo', F);\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1, 'should have invoked observer');\n\n (0, _metal.removeObserver)(obj, 'foo', F);\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, \"removed observer shouldn't fire\");\n }\n\n ['@test local observers can be removed'](assert) {\n let barObserved = 0;\n\n let MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.observer)('bar', function () {\n barObserved++;\n }),\n\n foo2: (0, _metal.observer)('bar', function () {\n barObserved++;\n })\n });\n\n let obj = {};\n MyMixin.apply(obj);\n\n (0, _metal.set)(obj, 'bar', 'HI!');\n assert.equal(barObserved, 2, 'precond - observers should be fired');\n\n (0, _metal.removeObserver)(obj, 'bar', null, 'foo1');\n\n barObserved = 0;\n (0, _metal.set)(obj, 'bar', 'HI AGAIN!');\n\n assert.equal(barObserved, 1, 'removed observers should not be called');\n }\n\n ['@test removeObserver should respect targets with methods'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n let 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\n (0, _metal.set)(observed, 'foo', 'BAZ');\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n\n (0, _metal.removeObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.removeObserver)(observed, 'foo', target2, target2.didChange);\n\n target1.count = target2.count = 0;\n (0, _metal.set)(observed, 'foo', 'BAZ');\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 // ..........................................................\n // CHAINED OBSERVERS\n //\n\n let obj, count;\n\n (0, _internalTestHelpers.moduleFor)('addObserver - dependentkey with chained properties', class extends _internalTestHelpers.AbstractTestCase {\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\n count = 0;\n }\n\n afterEach() {\n obj = count = null;\n }\n\n ['@test depending on a chain with a computed property'](assert) {\n (0, _metal.defineProperty)(obj, 'computed', (0, _metal.computed)(function () {\n return { foo: 'bar' };\n }));\n\n let changed = 0;\n (0, _metal.addObserver)(obj, 'computed.foo', function () {\n changed++;\n });\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'computed'), undefined, 'addObserver should not compute CP');\n\n (0, _metal.set)(obj, 'computed.foo', 'baz');\n\n assert.equal(changed, 1, 'should fire observer');\n }\n\n ['@test depending on a simple chain'](assert) {\n let val;\n (0, _metal.addObserver)(obj, 'foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(target, key);\n count++;\n });\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', { biff: 'BLARG' });\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n\n let foo = (0, _metal.get)(obj, 'foo');\n\n (0, _metal.set)(obj, 'foo', 'BOO');\n assert.equal(val, undefined);\n assert.equal(count, 6);\n\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n\n ['@test depending on a chain with a capitalized first key'](assert) {\n let val;\n\n (0, _metal.addObserver)(obj, 'Capital.foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(obj, key);\n count++;\n });\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar'), 'baz', { biff: 'BLARG' });\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n\n (0, _metal.set)(obj, 'Capital.foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n\n let foo = (0, _metal.get)(obj, 'foo');\n\n (0, _metal.set)(obj, 'Capital.foo', 'BOO');\n assert.equal(val, undefined);\n assert.equal(count, 6);\n\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n });\n\n // ..........................................................\n // SETTING IDENTICAL VALUES\n //\n\n (0, _internalTestHelpers.moduleFor)('props/observer_test - setting identical values', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setting simple prop should not trigger'](assert) {\n let obj = { foo: 'bar' };\n let count = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 0, 'should not trigger observer');\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, 'should trigger observer');\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, 'should not trigger observer again');\n }\n\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 ['@test setting a cached computed property whose value has changed should trigger'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get: function () {\n return (0, _metal.get)(this, 'baz');\n },\n set: function (key, value) {\n return value;\n }\n }).property('baz'));\n\n let count = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n\n (0, _metal.set)(obj, 'baz', 'qux');\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(obj, 'foo'), 'qux');\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 3);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('changeProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test observers added/removed during changeProperties should do the right thing.'](assert) {\n let obj = {\n foo: 0\n };\n function Observer() {\n this.didChangeCount = 0;\n }\n Observer.prototype = {\n add() {\n (0, _metal.addObserver)(obj, 'foo', this, 'didChange');\n },\n remove() {\n (0, _metal.removeObserver)(obj, 'foo', this, 'didChange');\n },\n didChange() {\n this.didChangeCount++;\n }\n };\n let addedBeforeFirstChangeObserver = new Observer();\n let addedAfterFirstChangeObserver = new Observer();\n let addedAfterLastChangeObserver = new Observer();\n let removedBeforeFirstChangeObserver = new Observer();\n let removedBeforeLastChangeObserver = new Observer();\n let removedAfterLastChangeObserver = new Observer();\n removedBeforeFirstChangeObserver.add();\n removedBeforeLastChangeObserver.add();\n removedAfterLastChangeObserver.add();\n (0, _metal.changeProperties)(function () {\n removedBeforeFirstChangeObserver.remove();\n addedBeforeFirstChangeObserver.add();\n\n (0, _metal.set)(obj, 'foo', 1);\n\n assert.equal(addedBeforeFirstChangeObserver.didChangeCount, 0, 'addObserver called before the first change is deferred');\n\n addedAfterFirstChangeObserver.add();\n removedBeforeLastChangeObserver.remove();\n\n (0, _metal.set)(obj, 'foo', 2);\n\n assert.equal(addedAfterFirstChangeObserver.didChangeCount, 0, 'addObserver called after the first change is deferred');\n\n addedAfterLastChangeObserver.add();\n removedAfterLastChangeObserver.remove();\n });\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 let obj = { foo: 0 };\n let fooDidChange = 0;\n\n (0, _metal.addObserver)(obj, 'foo', () => {\n fooDidChange++;\n (0, _metal.changeProperties)(() => {});\n });\n\n (0, _metal.changeProperties)(() => {\n (0, _metal.set)(obj, 'foo', 1);\n });\n\n assert.equal(fooDidChange, 1);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Keys behavior with observers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should not leak properties on the prototype'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(beer), []);\n (0, _metal.removeObserver)(beer, 'type', K);\n }\n\n ['@test observing a non existent property'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'brand', K);\n\n assert.deepEqual(Object.keys(beer), []);\n\n (0, _metal.set)(beer, 'brand', 'Corona');\n assert.deepEqual(Object.keys(beer), ['brand']);\n\n (0, _metal.removeObserver)(beer, 'brand', K);\n }\n\n ['@test with observers switched on and off'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n\n assert.deepEqual(Object.keys(beer), []);\n }\n\n ['@test observers switched on and off with setter in between'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.set)(beer, 'type', 'ale');\n (0, _metal.removeObserver)(beer, 'type', K);\n\n assert.deepEqual(Object.keys(beer), ['type']);\n }\n\n ['@test observer switched on and off and then setter'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n (0, _metal.set)(beer, 'type', 'ale');\n\n assert.deepEqual(Object.keys(beer), ['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 let beer = new Beer();\n (0, _metal.set)(beer, 'type', 'ale');\n assert.deepEqual(Object.keys(beer), ['type'], 'only set');\n\n let 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\n let yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n\n let itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\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 Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n (0, _metal.set)(beer, 'type', 'ale');\n assert.deepEqual(Object.keys(beer), ['type'], 'after set');\n\n let 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\n let yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n\n let itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\n }\n });\n});","enifed('@ember/-internals/metal/tests/performance_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\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 ['@test computed properties that depend on multiple properties should run only once per run loop'](assert) {\n let obj = { a: 'a', b: 'b', c: 'c' };\n let cpCount = 0;\n let obsCount = 0;\n\n (0, _metal.defineProperty)(obj, 'abc', (0, _metal.computed)(function (key) {\n cpCount++;\n return 'computed ' + key;\n }).property('a', 'b', 'c'));\n\n (0, _metal.get)(obj, 'abc');\n\n cpCount = 0;\n\n (0, _metal.addObserver)(obj, 'abc', function () {\n obsCount++;\n });\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\n (0, _metal.get)(obj, 'abc');\n\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 let foo = { bar: { baz: {} } };\n\n let count = 0;\n\n (0, _metal.defineProperty)(foo.bar.baz, 'bam', (0, _metal.computed)(function () {\n count++;\n }));\n\n (0, _metal.addObserver)(foo, 'bar.baz.bam', function () {});\n\n (0, _metal.notifyPropertyChange)((0, _metal.get)(foo, 'bar.baz'), 'bam');\n\n assert.equal(count, 0, 'should not have recomputed property');\n }\n });\n});","enifed('@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 let 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 ['@test for data properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'foo', 'key name should be foo');\n assert.equal(value, 'bar', 'value should be bar');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'foo', undefined, 'bar');\n }\n\n ['@test for computed properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let computedProperty = (0, _metal.computed)(function () {\n return this;\n });\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'foo', 'key name should be foo');\n assert.strictEqual(value, computedProperty, 'value should be passed as computed property');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'foo', computedProperty);\n }\n\n ['@test for descriptor properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let descriptor = {\n writable: true,\n configurable: false,\n enumerable: true,\n value: 42\n };\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'answer', 'key name should be answer');\n assert.strictEqual(value, descriptor, 'value should be passed as descriptor');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'answer', descriptor);\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 let obj = { foo: 'bar' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', until: 'some.version' });\n\n expectDeprecation();\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n\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 let obj = { foo: 'bar', blammo: 'whammy' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', until: 'some.version' });\n\n for (let prop in obj) {\n if (obj.hasOwnProperty(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 let obj = { foo: 'bar' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', 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});","enifed('@ember/-internals/metal/tests/property_did_change_hook', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('PROPERTY_DID_CHANGE', class extends _internalTestHelpers.AbstractTestCase {\n ['@test alias and cp'](assert) {\n let counts = {};\n let obj = {\n child: {},\n [_metal.PROPERTY_DID_CHANGE](keyName) {\n counts[keyName] = (counts[keyName] || 0) + 1;\n }\n };\n\n (0, _metal.defineProperty)(obj, 'cost', (0, _metal.alias)('child.cost'));\n (0, _metal.defineProperty)(obj, 'tax', (0, _metal.alias)('child.tax'));\n\n (0, _metal.defineProperty)(obj, 'total', (0, _metal.computed)('cost', 'tax', {\n get() {\n return (0, _metal.get)(this, 'cost') + (0, _metal.get)(this, 'tax');\n }\n }));\n\n assert.ok(!(0, _metal.isWatching)(obj, 'child.cost'), 'precond alias target `child.cost` is not watched');\n assert.equal((0, _metal.get)(obj, 'cost'), undefined);\n // this is how PROPERTY_DID_CHANGE will get notified\n assert.ok((0, _metal.isWatching)(obj, 'child.cost'), 'alias target `child.cost` is watched after consumption');\n\n assert.ok(!(0, _metal.isWatching)(obj, 'child.tax'), 'precond alias target `child.tax` is not watched');\n assert.equal((0, _metal.get)(obj, 'tax'), undefined);\n // this is how PROPERTY_DID_CHANGE will get notified\n assert.ok((0, _metal.isWatching)(obj, 'child.tax'), 'alias target `child.cost` is watched after consumption');\n\n // increments the watching count on the alias itself to 1\n assert.ok(isNaN((0, _metal.get)(obj, 'total')), 'total is initialized');\n\n // decrements the watching count on the alias itself to 0\n (0, _metal.set)(obj, 'child', {\n cost: 399.0,\n tax: 32.93\n });\n\n // this should have called PROPERTY_DID_CHANGE for all of them\n assert.equal(counts['cost'], 1, 'PROPERTY_DID_CHANGE called with cost');\n assert.equal(counts['tax'], 1, 'PROPERTY_DID_CHANGE called with tax');\n assert.equal(counts['total'], 1, 'PROPERTY_DID_CHANGE called with total');\n\n // we should still have a dependency installed\n assert.ok((0, _metal.isWatching)(obj, 'child.cost'), 'watching child.cost');\n assert.ok((0, _metal.isWatching)(obj, 'child.tax'), 'watching child.tax');\n\n (0, _metal.set)(obj, 'child', {\n cost: 100.0,\n tax: 10.0\n });\n\n assert.equal(counts['cost'], 2, 'PROPERTY_DID_CHANGE called with cost');\n assert.equal(counts['tax'], 2, 'PROPERTY_DID_CHANGE called with tax');\n assert.equal(counts['total'], 1, 'PROPERTY_DID_CHANGE called with total');\n }\n });\n});","enifed('@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 let foo = new Foo();\n\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 let foo = new Foo();\n\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 let foo = new Foo();\n\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\n let foo = {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'baz', 'property change notified');\n }\n };\n\n let bar = Object.create(foo);\n\n (0, _meta.meta)(foo); // setup meta for prototype\n (0, _meta.meta)(bar); // setup meta for instance, switch prototype\n\n (0, _metal.notifyPropertyChange)(foo, 'baz');\n }\n });\n});","enifed('@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\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\n let props = (0, _metal.setProperties)({}, { foo: undefined });\n assert.deepEqual(props, { foo: undefined }, 'Setting undefined value');\n assert.ok('foo' in props, 'Setting undefined value');\n assert.deepEqual(Object.keys(props), ['foo'], 'Setting undefined value');\n\n assert.deepEqual((0, _metal.setProperties)({}, { foo: 1 }), { foo: 1 }, 'Set a single property');\n\n assert.deepEqual((0, _metal.setProperties)({}, { foo: 1, bar: 1 }), { foo: 1, bar: 1 }, 'Set multiple properties');\n\n assert.deepEqual((0, _metal.setProperties)({ foo: 2, baz: 2 }, { foo: 1 }), { foo: 1 }, 'Set one of multiple properties');\n\n assert.deepEqual((0, _metal.setProperties)({ foo: 2, baz: 2 }, { bar: 2 }), {\n bar: 2\n }, 'Set an additional, previously unset property');\n }\n });\n});","enifed(\"@ember/-internals/metal/tests/tracked/computed_test\", [\"@ember/-internals/metal\", \"@ember/canary-features\", \"internal-test-helpers\"], function (_metal, _canaryFeatures, _internalTestHelpers) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n (0, _internalTestHelpers.moduleFor)('@tracked getters', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works without get'](assert) {\n let count = 0;\n class Count {\n get foo() {\n count++;\n return `computed foo`;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"foo\", null);\n let obj = new Count();\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n ['@test defining computed property should invoke property on get'](assert) {\n let count = 0;\n class Count {\n get foo() {\n count++;\n return `computed foo`;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"foo\", null);\n let obj = new Count();\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 ['@test defining computed property should invoke property on set'](assert) {\n let count = 0;\n class Foo {\n constructor() {\n this.__foo = '';\n }\n get foo() {\n return this.__foo;\n }\n set foo(value) {\n count++;\n this.__foo = `computed ${value}`;\n }\n }\n __decorate([_metal.tracked], Foo.prototype, \"foo\", null);\n let obj = new Foo();\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 }\n });\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/get_test\", [\"@ember/canary-features\", \"internal-test-helpers\", \"@ember/-internals/metal\"], function (_canaryFeatures, _internalTestHelpers, _metal) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n function createObj() {\n class Obj {\n constructor() {\n this.string = 'string';\n this.number = 23;\n this.boolTrue = true;\n this.boolFalse = false;\n this.nullValue = null;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"string\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"number\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolTrue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolFalse\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"nullValue\", void 0);\n return new Obj();\n }\n (0, _internalTestHelpers.moduleFor)('@tracked decorator: get', class extends _internalTestHelpers.AbstractTestCase {\n '@test should get arbitrary properties on an object'() {\n let obj = createObj();\n for (let key in obj) {\n this.assert.equal((0, _metal.get)(obj, key), obj[key], key);\n }\n }\n '@test should retrieve a number key on an object'() {\n class Obj {\n constructor() {\n this[1] = 'first';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, 1, void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, '1'), 'first');\n }\n '@test should retrieve an empty key on an object'() {\n class Obj {\n constructor() {\n this[''] = 'empty';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"\", void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, ''), 'empty');\n }\n '@test should get a @tracked path'() {\n class Key {\n constructor() {\n this.value = 'value';\n }\n }\n __decorate([_metal.tracked], Key.prototype, \"value\", void 0);\n class Path {\n constructor() {\n this.key = new Key();\n }\n }\n __decorate([_metal.tracked], Path.prototype, \"key\", void 0);\n class Obj {\n constructor() {\n this.path = new Path();\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"path\", void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, 'path.key.value'), 'value');\n }\n '@test should not access a property more than once'() {\n let count = 20;\n class Count {\n get id() {\n return ++count;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"id\", null);\n let obj = new Count();\n (0, _metal.get)(obj, 'id');\n this.assert.equal(count, 21);\n }\n });\n (0, _internalTestHelpers.moduleFor)('@tracked decorator: getWithDefault', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object']() {\n let obj = createObj();\n for (let key in obj) {\n this.assert.equal((0, _metal.getWithDefault)(obj, key, 'fail'), obj[key], key);\n }\n class Obj {\n constructor() {\n this.undef = undefined;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"undef\", void 0);\n let obj2 = new Obj();\n this.assert.equal((0, _metal.getWithDefault)(obj2, 'undef', 'default'), 'default', 'explicit undefined retrieves the default');\n this.assert.equal((0, _metal.getWithDefault)(obj2, 'not-present', 'default'), 'default', 'non-present key retrieves the default');\n }\n });\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/set_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/canary-features\"], function (_internalTestHelpers, _metal, _canaryFeatures) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n const createObj = () => {\n class Obj {\n constructor() {\n this.string = 'string';\n this.number = 23;\n this.boolTrue = true;\n this.boolFalse = false;\n this.nullValue = null;\n this.undefinedValue = undefined;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"string\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"number\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolTrue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolFalse\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"nullValue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"undefinedValue\", void 0);\n return new Obj();\n };\n (0, _internalTestHelpers.moduleFor)('@tracked set', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should set arbitrary properties on an object'](assert) {\n let obj = createObj();\n class Obj {\n constructor() {\n this.undefinedValue = 'emberjs';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"undefinedValue\", void 0);\n let newObj = new Obj();\n for (let 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 ['@test should set a number key on an object'](assert) {\n class Obj {\n constructor() {\n this[1] = 'original';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, 1, void 0);\n let obj = new Obj();\n (0, _metal.set)(obj, '1', 'first');\n assert.equal(obj[1], 'first');\n }\n });\n }\n});","enifed('@ember/-internals/metal/tests/tracked/support', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.createTracked = createTracked;\n exports.createWithDescriptors = createWithDescriptors;\n function createTracked(values, proto = {}) {\n function Class() {\n for (let prop in values) {\n this[prop] = values[prop];\n }\n }\n\n for (let prop in values) {\n Object.defineProperty(proto, prop, (0, _metal.tracked)(proto, prop, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: values[prop]\n }));\n }\n\n Class.prototype = proto;\n\n return new Class();\n }\n\n function createWithDescriptors(values) {\n function Class() {}\n\n for (let prop in values) {\n let descriptor = Object.getOwnPropertyDescriptor(values, prop);\n Object.defineProperty(Class.prototype, prop, (0, _metal.tracked)(Class.prototype, prop, descriptor));\n }\n\n return new Class();\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/validation_test\", [\"@ember/-internals/metal\", \"@ember/canary-features\", \"internal-test-helpers\"], function (_metal, _canaryFeatures, _internalTestHelpers) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n (0, _internalTestHelpers.moduleFor)('@tracked get validation', class extends _internalTestHelpers.AbstractTestCase {\n [`@test validators for tracked getters with dependencies should invalidate when the dependencies invalidate`](assert) {\n class Tracked {\n constructor(first, last) {\n this.first = undefined;\n this.last = undefined;\n this.first = first;\n this.last = last;\n }\n get full() {\n return `${this.first} ${this.last}`;\n }\n }\n __decorate([_metal.tracked], Tracked.prototype, \"first\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"last\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"full\", null);\n let obj = new Tracked('Tom', 'Dale');\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = obj.full;\n assert.equal(full, 'Tom Dale', 'The full name starts correct');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n obj.first = 'Thomas';\n assert.equal(tag.validate(snapshot), false);\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\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 get full() {\n return `${(0, _metal.get)(this.name, 'first')} ${(0, _metal.get)(this.name, 'last')}`;\n }\n }\n __decorate([_metal.tracked], Tracked.prototype, \"name\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"full\", null);\n let tom = { first: 'Tom', last: 'Dale' };\n let obj = new Tracked(tom);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = obj.full;\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember set');\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n }\n [`@test interaction with Ember object model (Ember computed property depending on tracked property)`](assert) {\n class EmberObject {\n constructor(name) {\n this.name = name;\n }\n }\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('name', function () {\n let name = (0, _metal.get)(this, 'name');\n return `${name.first} ${name.last}`;\n }));\n class Name {\n constructor(first, last) {\n this.first = first;\n this.last = last;\n }\n }\n __decorate([_metal.tracked], Name.prototype, \"first\", void 0);\n __decorate([_metal.tracked], Name.prototype, \"last\", void 0);\n let tom = new Name('Tom', 'Dale');\n let obj = new EmberObject(tom);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n tom.first = 'Thomas';\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with tracked properties');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n }\n ['@test interaction with the Ember object model (paths going through tracked properties)'](assert) {\n let self;\n class EmberObject {\n constructor(contact) {\n this.contact = contact;\n self = this;\n }\n }\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('contact.name.first', 'contact.name.last', function () {\n let contact = (0, _metal.get)(self, 'contact');\n return `${(0, _metal.get)(contact.name, 'first')} ${(0, _metal.get)(contact.name, 'last')}`;\n }));\n class Contact {\n constructor(name) {\n this.name = undefined;\n this.name = name;\n }\n }\n __decorate([_metal.tracked], Contact.prototype, \"name\", void 0);\n class EmberName {\n constructor(first, last) {\n this.first = first;\n this.last = last;\n }\n }\n let tom = new EmberName('Tom', 'Dale');\n let contact = new Contact(tom);\n let obj = new EmberObject(contact);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = tag.value();\n tom = contact.name = new EmberName('T', 'Dale');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'T Dale');\n snapshot = tag.value();\n (0, _metal.set)(tom, 'first', 'Tizzle');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Tizzle Dale');\n }\n });\n }\n});","enifed('@ember/-internals/metal/tests/watching/is_watching_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function testObserver(assert, setup, teardown, key = 'key') {\n let obj = {};\n\n assert.equal((0, _metal.isWatching)(obj, key), false, 'precond - isWatching is false by default');\n setup(obj, key, 'fn');\n assert.equal((0, _metal.isWatching)(obj, key), true, 'isWatching is true when observers are added');\n teardown(obj, key, 'fn');\n assert.equal((0, _metal.isWatching)(obj, key), false, 'isWatching is false after observers are removed');\n }\n\n (0, _internalTestHelpers.moduleFor)('isWatching', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isWatching is true for regular local observers'](assert) {\n testObserver(assert, (obj, key, fn) => {\n _metal.Mixin.create({\n [fn]: (0, _metal.observer)(key, function () {})\n }).apply(obj);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, key, obj, fn));\n }\n\n ['@test isWatching is true for nonlocal observers'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.addObserver)(obj, key, obj, fn);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, key, obj, fn));\n }\n\n ['@test isWatching is true for chained observers'](assert) {\n testObserver(assert, function (obj, key, fn) {\n (0, _metal.addObserver)(obj, key + '.bar', obj, fn);\n }, function (obj, key, fn) {\n (0, _metal.removeObserver)(obj, key + '.bar', obj, fn);\n });\n }\n\n ['@test isWatching is true for computed properties'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, fn, (0, _metal.computed)(function () {}).property(key));\n (0, _metal.get)(obj, fn);\n }, (obj, key, fn) => (0, _metal.defineProperty)(obj, fn, null));\n }\n\n ['@test isWatching is true for chained computed properties'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, fn, (0, _metal.computed)(function () {}).property(key + '.bar'));\n (0, _metal.get)(obj, fn);\n }, (obj, key, fn) => (0, _metal.defineProperty)(obj, fn, null));\n }\n\n // can't watch length on Array - it is special...\n // But you should be able to watch a length property of an object\n [\"@test isWatching is true for 'length' property on object\"](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, 'length', null, '26.2 miles');\n (0, _metal.addObserver)(obj, 'length', obj, fn);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, 'length', obj, fn), 'length');\n }\n });\n});","enifed('@ember/-internals/metal/tests/watching/unwatch_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let didCount;\n\n function addListeners(obj, keyPath) {\n (0, _metal.addListener)(obj, keyPath + ':change', () => didCount++);\n }\n\n (0, _internalTestHelpers.moduleFor)('unwatch', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n didCount = 0;\n }\n\n ['@test unwatching a computed property - regular get/set'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {\n return this.__foo;\n },\n set(keyName, value) {\n this.__foo = value;\n return this.__foo;\n }\n }));\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching a regular property - regular get/set'](assert) {\n let obj = { foo: 'BIFF' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching should be nested'](assert) {\n let obj = { foo: 'BIFF' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 1, 'should NOT have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching \"length\" property on an object'](assert) {\n let obj = { foo: 'RUN' };\n addListeners(obj, 'length');\n\n // Can watch length when it is undefined\n (0, _metal.watch)(obj, 'length');\n (0, _metal.set)(obj, 'length', '10k');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n // Should stop watching despite length now being defined (making object 'array-like')\n (0, _metal.unwatch)(obj, 'length');\n didCount = 0;\n (0, _metal.set)(obj, 'length', '5k');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching should not destroy non MANDATORY_SETTER descriptor'](assert) {\n let obj = {\n get foo() {\n return 'RUN';\n }\n };\n\n assert.equal(obj.foo, 'RUN', 'obj.foo');\n (0, _metal.watch)(obj, 'foo');\n assert.equal(obj.foo, 'RUN', 'obj.foo after watch');\n (0, _metal.unwatch)(obj, 'foo');\n assert.equal(obj.foo, 'RUN', 'obj.foo after unwatch');\n }\n });\n});","enifed('@ember/-internals/metal/tests/watching/watch_test', ['@ember/-internals/environment', '@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_environment, _metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let didCount, didKeys, originalLookup;\n\n function addListeners(obj, keyPath) {\n (0, _metal.addListener)(obj, keyPath + ':change', function () {\n didCount++;\n didKeys.push(keyPath);\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('watch', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n didCount = 0;\n didKeys = [];\n\n originalLookup = _environment.context.lookup;\n _environment.context.lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test watching a computed property'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {\n return this.__foo;\n },\n set(keyName, value) {\n if (value !== undefined) {\n this.__foo = value;\n }\n return this.__foo;\n }\n }));\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n }\n\n ['@test watching a regular defined property'](assert) {\n let obj = { foo: 'baz' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'should have original prop');\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should get new value');\n assert.equal(obj.foo, 'bar', 'property should be accessible on obj');\n }\n\n ['@test watching a regular undefined property'](assert) {\n let obj = {};\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n\n assert.equal('foo' in obj, false, 'precond undefined');\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should get new value');\n assert.equal(obj.foo, 'bar', 'property should be accessible on obj');\n }\n\n ['@test watches should inherit'](assert) {\n let obj = { foo: 'baz' };\n let objB = Object.create(obj);\n\n addListeners(obj, 'foo');\n (0, _metal.watch)(obj, 'foo');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'should have original prop');\n\n (0, _metal.set)(objB, 'foo', 'bar');\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(didCount, 1, 'should have invoked didCount once only');\n }\n\n ['@test watching an object THEN defining it should work also'](assert) {\n let obj = {};\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n\n (0, _metal.defineProperty)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should have set');\n assert.equal(didCount, 1, 'should have invoked didChange once');\n }\n\n ['@test watching a chain then defining the property'](assert) {\n let obj = {};\n let foo = { bar: 'bar' };\n addListeners(obj, 'foo.bar');\n addListeners(foo, 'bar');\n\n (0, _metal.watch)(obj, 'foo.bar');\n\n (0, _metal.defineProperty)(obj, 'foo', undefined, foo);\n (0, _metal.set)(foo, 'bar', 'baz');\n\n assert.deepEqual(didKeys, ['foo.bar', 'bar'], 'should have invoked didChange with bar, foo.bar');\n assert.equal(didCount, 2, 'should have invoked didChange twice');\n }\n\n ['@test watching a chain then defining the nested property'](assert) {\n let bar = {};\n let obj = { foo: bar };\n let baz = { baz: 'baz' };\n addListeners(obj, 'foo.bar.baz');\n addListeners(baz, 'baz');\n\n (0, _metal.watch)(obj, 'foo.bar.baz');\n\n (0, _metal.defineProperty)(bar, 'bar', undefined, baz);\n (0, _metal.set)(baz, 'baz', 'BOO');\n\n assert.deepEqual(didKeys, ['foo.bar.baz', 'baz'], 'should have invoked didChange with bar, foo.bar');\n assert.equal(didCount, 2, 'should have invoked didChange twice');\n }\n\n ['@test watching an object value then unwatching should restore old value'](assert) {\n let obj = { foo: { bar: { baz: { biff: 'BIFF' } } } };\n addListeners(obj, 'foo.bar.baz.biff');\n\n (0, _metal.watch)(obj, 'foo.bar.baz.biff');\n\n let foo = (0, _metal.get)(obj, 'foo');\n assert.equal((0, _metal.get)((0, _metal.get)((0, _metal.get)(foo, 'bar'), 'baz'), 'biff'), 'BIFF', 'biff should exist');\n\n (0, _metal.unwatch)(obj, 'foo.bar.baz.biff');\n assert.equal((0, _metal.get)((0, _metal.get)((0, _metal.get)(foo, 'bar'), 'baz'), 'biff'), 'BIFF', 'biff should exist');\n }\n\n ['@test when watching another object, destroy should remove chain watchers from the other object'](assert) {\n let objA = {};\n let objB = { foo: 'bar' };\n objA.b = objB;\n addListeners(objA, 'b.foo');\n\n (0, _metal.watch)(objA, 'b.foo');\n\n let meta_objB = (0, _meta.meta)(objB);\n let chainNode = (0, _meta.meta)(objA).readableChains().chains.b.chains.foo;\n\n assert.equal(meta_objB.peekWatching('foo'), 1, 'should be watching foo');\n assert.equal(meta_objB.readableChainWatchers().has('foo', chainNode), true, 'should have chain watcher');\n\n (0, _meta.deleteMeta)(objA);\n\n assert.equal(meta_objB.peekWatching('foo'), 0, 'should not be watching foo');\n assert.equal(meta_objB.readableChainWatchers().has('foo', chainNode), false, 'should not have chain watcher');\n }\n\n // TESTS for length property\n\n ['@test watching \"length\" property on an object'](assert) {\n let obj = { length: '26.2 miles' };\n addListeners(obj, 'length');\n\n (0, _metal.watch)(obj, 'length');\n assert.equal((0, _metal.get)(obj, 'length'), '26.2 miles', 'should have original prop');\n\n (0, _metal.set)(obj, 'length', '10k');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'length'), '10k', 'should get new value');\n assert.equal(obj.length, '10k', 'property should be accessible on obj');\n }\n\n ['@test watching \"length\" property on an array'](assert) {\n let arr = [];\n addListeners(arr, 'length');\n\n (0, _metal.watch)(arr, 'length');\n assert.equal((0, _metal.get)(arr, 'length'), 0, 'should have original prop');\n\n (0, _metal.set)(arr, 'length', '10');\n assert.equal(didCount, 1, 'should NOT have invoked didCount');\n\n assert.equal((0, _metal.get)(arr, 'length'), 10, 'should get new value');\n assert.equal(arr.length, 10, 'property should be accessible on arr');\n }\n\n ['@test watch + ES5 getter'](assert) {\n let parent = { b: 1 };\n let child = {\n get b() {\n return parent.b;\n }\n };\n\n assert.equal(parent.b, 1, 'parent.b should be 1');\n assert.equal(child.b, 1, 'child.b should be 1');\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") should be 1');\n\n (0, _metal.watch)(child, 'b');\n\n assert.equal(parent.b, 1, 'parent.b should be 1 (after watch)');\n assert.equal(child.b, 1, 'child.b should be 1 (after watch)');\n\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") should be 1 (after watch)');\n }\n\n ['@test watch + set + no-descriptor'](assert) {\n let child = {};\n\n assert.equal(child.b, undefined, 'child.b ');\n assert.equal((0, _metal.get)(child, 'b'), undefined, 'get(child, \"b\")');\n\n (0, _metal.watch)(child, 'b');\n (0, _metal.set)(child, 'b', 1);\n\n assert.equal(child.b, 1, 'child.b (after watch)');\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") (after watch)');\n }\n });\n});","enifed('@ember/-internals/owner/index', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.OWNER = undefined;\n exports.getOwner = getOwner;\n exports.setOwner = setOwner;\n const OWNER = exports.OWNER = (0, _utils.symbol)('OWNER');\n /**\n Framework objects in an Ember application (components, services, routes, etc.)\n are created via a factory and dependency injection system. Each of these\n objects is the responsibility of an \"owner\", which handled its\n instantiation and manages its lifetime.\n \n `getOwner` fetches the owner object responsible for an instance. This can\n be used to lookup or resolve other class instances, or register new factories\n into the owner.\n \n For example, this component dynamically looks up a service based on the\n `audioType` passed as an attribute:\n \n ```app/components/play-audio.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n import { getOwner } from '@ember/application';\n \n // Usage:\n //\n // {{play-audio audioType=model.audioType audioFile=model.file}}\n //\n export default Component.extend({\n audioService: computed('audioType', function() {\n let owner = getOwner(this);\n return owner.lookup(`service:${this.get('audioType')}`);\n }),\n \n click() {\n let player = this.get('audioService');\n player.play(this.get('audioFile'));\n }\n });\n ```\n \n @method getOwner\n @static\n @for @ember/application\n @param {Object} object An object with an owner.\n @return {Object} An owner object.\n @since 2.3.0\n @public\n */\n /**\n @module @ember/application\n */\n function getOwner(object) {\n return object[OWNER];\n }\n /**\n `setOwner` forces a new owner on a given object instance. This is primarily\n useful in some testing cases.\n \n @method setOwner\n @static\n @for @ember/application\n @param {Object} object An object instance.\n @param {Object} object The new owner object of the object instance.\n @since 2.3.0\n @public\n */\n function setOwner(object, owner) {\n object[OWNER] = owner;\n }\n});","enifed('@ember/-internals/routing/index', ['exports', '@ember/-internals/routing/lib/location/api', '@ember/-internals/routing/lib/location/none_location', '@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/system/generate_controller', '@ember/-internals/routing/lib/system/controller_for', '@ember/-internals/routing/lib/system/dsl', '@ember/-internals/routing/lib/system/router', '@ember/-internals/routing/lib/system/route', '@ember/-internals/routing/lib/system/query_params', '@ember/-internals/routing/lib/services/routing', '@ember/-internals/routing/lib/services/router', '@ember/-internals/routing/lib/system/cache', '@ember/-internals/routing/lib/ext/controller'], function (exports, _api, _none_location, _hash_location, _history_location, _auto_location, _generate_controller, _controller_for, _dsl, _router, _route, _query_params, _routing, _router2, _cache) {\n 'use strict';\n\n exports.__esModule = true;\n exports.BucketCache = exports.RouterService = exports.RoutingService = exports.QueryParams = exports.Route = exports.Router = exports.RouterDSL = exports.controllerFor = exports.generateControllerFactory = exports.generateController = exports.AutoLocation = exports.HistoryLocation = exports.HashLocation = exports.NoneLocation = exports.Location = undefined;\n Object.defineProperty(exports, 'Location', {\n enumerable: true,\n get: function () {\n return _api.default;\n }\n });\n Object.defineProperty(exports, 'NoneLocation', {\n enumerable: true,\n get: function () {\n return _none_location.default;\n }\n });\n Object.defineProperty(exports, 'HashLocation', {\n enumerable: true,\n get: function () {\n return _hash_location.default;\n }\n });\n Object.defineProperty(exports, 'HistoryLocation', {\n enumerable: true,\n get: function () {\n return _history_location.default;\n }\n });\n Object.defineProperty(exports, 'AutoLocation', {\n enumerable: true,\n get: function () {\n return _auto_location.default;\n }\n });\n Object.defineProperty(exports, 'generateController', {\n enumerable: true,\n get: function () {\n return _generate_controller.default;\n }\n });\n Object.defineProperty(exports, 'generateControllerFactory', {\n enumerable: true,\n get: function () {\n return _generate_controller.generateControllerFactory;\n }\n });\n Object.defineProperty(exports, 'controllerFor', {\n enumerable: true,\n get: function () {\n return _controller_for.default;\n }\n });\n Object.defineProperty(exports, 'RouterDSL', {\n enumerable: true,\n get: function () {\n return _dsl.default;\n }\n });\n Object.defineProperty(exports, 'Router', {\n enumerable: true,\n get: function () {\n return _router.default;\n }\n });\n Object.defineProperty(exports, 'Route', {\n enumerable: true,\n get: function () {\n return _route.default;\n }\n });\n Object.defineProperty(exports, 'QueryParams', {\n enumerable: true,\n get: function () {\n return _query_params.default;\n }\n });\n Object.defineProperty(exports, 'RoutingService', {\n enumerable: true,\n get: function () {\n return _routing.default;\n }\n });\n Object.defineProperty(exports, 'RouterService', {\n enumerable: true,\n get: function () {\n return _router2.default;\n }\n });\n Object.defineProperty(exports, 'BucketCache', {\n enumerable: true,\n get: function () {\n return _cache.default;\n }\n });\n});","enifed('@ember/-internals/routing/lib/ext/controller', ['exports', '@ember/-internals/metal', '@ember/controller/lib/controller_mixin', '@ember/-internals/routing/lib/utils'], function (exports, _metal, _controller_mixin, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module ember\n */\n _controller_mixin.default.reopen({\n concatenatedProperties: ['queryParams'],\n /**\n Defines which query parameters the controller accepts.\n If you give the names `['category','page']` it will bind\n the values of these query parameters to the variables\n `this.category` and `this.page`.\n By default, Ember coerces query parameter values using `toggleProperty`.\n This behavior may lead to unexpected results.\n To explicitly configure a query parameter property so it coerces as expected, you must define a type property:\n ```javascript\n queryParams: [{\n category: {\n type: 'boolean'\n }\n }]\n ```\n @for Ember.ControllerMixin\n @property queryParams\n @public\n */\n queryParams: null,\n /**\n This property is updated to various different callback functions depending on\n the current \"state\" of the backing route. It is used by\n `Controller.prototype._qpChanged`.\n The methods backing each state can be found in the `Route.prototype._qp` computed\n property return value (the `.states` property). The current values are listed here for\n the sanity of future travelers:\n * `inactive` - This state is used when this controller instance is not part of the active\n route hierarchy. Set in `Route.prototype._reset` (a `router.js` microlib hook) and\n `Route.prototype.actions.finalizeQueryParamChange`.\n * `active` - This state is used when this controller instance is part of the active\n route hierarchy. Set in `Route.prototype.actions.finalizeQueryParamChange`.\n * `allowOverrides` - This state is used in `Route.prototype.setup` (`route.js` microlib hook).\n @method _qpDelegate\n @private\n */\n _qpDelegate: null,\n /**\n During `Route#setup` observers are created to invoke this method\n when any of the query params declared in `Controller#queryParams` property\n are changed.\n When invoked this method uses the currently active query param update delegate\n (see `Controller.prototype._qpDelegate` for details) and invokes it with\n the QP key/value being changed.\n @method _qpChanged\n @private\n */\n _qpChanged(controller, _prop) {\n let prop = _prop.substr(0, _prop.length - 3);\n let delegate = controller._qpDelegate;\n let value = (0, _metal.get)(controller, prop);\n delegate(prop, value);\n },\n /**\n Transition the application into another route. The route may\n be either a single route or route path:\n ```javascript\n aController.transitionToRoute('blogPosts');\n aController.transitionToRoute('blogPosts.recentEntries');\n ```\n Optionally supply a model for the route in question. The model\n will be serialized into the URL using the `serialize` hook of\n the route:\n ```javascript\n aController.transitionToRoute('blogPost', aPost);\n ```\n If a literal is passed (such as a number or a string), it will\n be treated as an identifier instead. In this case, the `model`\n hook of the route will be triggered:\n ```javascript\n aController.transitionToRoute('blogPost', 1);\n ```\n Multiple models will be applied last to first recursively up the\n route tree.\n ```app/router.js\n Router.map(function() {\n this.route('blogPost', { path: ':blogPostId' }, function() {\n this.route('blogComment', { path: ':blogCommentId', resetNamespace: true });\n });\n });\n ```\n ```javascript\n aController.transitionToRoute('blogComment', aPost, aComment);\n aController.transitionToRoute('blogComment', 1, 13);\n ```\n It is also possible to pass a URL (a string that starts with a\n `/`). This is intended for testing and debugging purposes and\n should rarely be used in production code.\n ```javascript\n aController.transitionToRoute('/');\n aController.transitionToRoute('/blog/post/1/comment/13');\n aController.transitionToRoute('/blog/posts?sort=title');\n ```\n An options hash with a `queryParams` property may be provided as\n the final argument to add query parameters to the destination URL.\n ```javascript\n aController.transitionToRoute('blogPost', 1, {\n queryParams: { showComments: 'true' }\n });\n // if you just want to transition the query parameters without changing the route\n aController.transitionToRoute({ queryParams: { sort: 'date' } });\n ```\n See also [replaceRoute](/api/ember/release/classes/Ember.ControllerMixin/methods/replaceRoute?anchor=replaceRoute).\n @param {String} name the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used\n while transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @for Ember.ControllerMixin\n @method transitionToRoute\n @public\n */\n transitionToRoute(...args) {\n // target may be either another controller or a router\n let target = (0, _metal.get)(this, 'target');\n let method = target.transitionToRoute || target.transitionTo;\n return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));\n },\n /**\n Transition into another route while replacing the current URL, if possible.\n This will replace the current history entry instead of adding a new one.\n Beside that, it is identical to `transitionToRoute` in all other respects.\n ```javascript\n aController.replaceRoute('blogPosts');\n aController.replaceRoute('blogPosts.recentEntries');\n ```\n Optionally supply a model for the route in question. The model\n will be serialized into the URL using the `serialize` hook of\n the route:\n ```javascript\n aController.replaceRoute('blogPost', aPost);\n ```\n If a literal is passed (such as a number or a string), it will\n be treated as an identifier instead. In this case, the `model`\n hook of the route will be triggered:\n ```javascript\n aController.replaceRoute('blogPost', 1);\n ```\n Multiple models will be applied last to first recursively up the\n route tree.\n ```app/router.js\n Router.map(function() {\n this.route('blogPost', { path: ':blogPostId' }, function() {\n this.route('blogComment', { path: ':blogCommentId', resetNamespace: true });\n });\n });\n ```\n ```\n aController.replaceRoute('blogComment', aPost, aComment);\n aController.replaceRoute('blogComment', 1, 13);\n ```\n It is also possible to pass a URL (a string that starts with a\n `/`). This is intended for testing and debugging purposes and\n should rarely be used in production code.\n ```javascript\n aController.replaceRoute('/');\n aController.replaceRoute('/blog/post/1/comment/13');\n ```\n @param {String} name the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used\n while transitioning to the route.\n @for Ember.ControllerMixin\n @method replaceRoute\n @public\n */\n replaceRoute(...args) {\n // target may be either another controller or a router\n let target = (0, _metal.get)(this, 'target');\n let method = target.replaceRoute || target.replaceWith;\n return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));\n }\n });\n exports.default = _controller_mixin.default;\n});","enifed('@ember/-internals/routing/lib/location/api', ['exports', '@ember/-internals/browser-environment', '@ember/debug'], function (exports, _browserEnvironment, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = {\n /**\n This is deprecated in favor of using the container to lookup the location\n implementation as desired.\n For example:\n ```javascript\n // Given a location registered as follows:\n container.register('location:history-test', HistoryTestLocation);\n // You could create a new instance via:\n container.lookup('location:history-test');\n ```\n @method create\n @param {Object} options\n @return {Object} an instance of an implementation of the `location` API\n @deprecated Use the container to lookup the location implementation that you\n need.\n @private\n */\n create(options) {\n let implementation = options && options.implementation;\n (0, _debug.assert)(\"Location.create: you must specify a 'implementation' option\", !!implementation);\n let implementationClass = this.implementations[implementation];\n (0, _debug.assert)(`Location.create: ${implementation} is not a valid implementation`, !!implementationClass);\n return implementationClass.create(...arguments);\n },\n implementations: {},\n _location: _browserEnvironment.location\n };\n});","enifed('@ember/-internals/routing/lib/location/auto_location', ['exports', '@ember/-internals/browser-environment', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/-internals/runtime', '@ember/-internals/utils', '@ember/debug', '@ember/-internals/routing/lib/location/util'], function (exports, _browserEnvironment, _metal, _owner, _runtime, _utils, _debug, _util) {\n 'use strict';\n\n exports.__esModule = true;\n exports.getHistoryPath = getHistoryPath;\n exports.getHashPath = getHashPath;\n\n /**\n @module @ember/routing\n */\n /**\n AutoLocation will select the best location option based off browser\n support with the priority order: history, hash, none.\n \n Clean pushState paths accessed by hashchange-only browsers will be redirected\n to the hash-equivalent and vice versa so future transitions are consistent.\n \n Keep in mind that since some of your users will use `HistoryLocation`, your\n server must serve the Ember app at all the routes you define.\n \n Browsers that support the `history` API will use `HistoryLocation`, those that\n do not, but still support the `hashchange` event will use `HashLocation`, and\n in the rare case neither is supported will use `NoneLocation`.\n \n Example:\n \n ```app/router.js\n Router.map(function() {\n this.route('posts', function() {\n this.route('new');\n });\n });\n \n Router.reopen({\n location: 'auto'\n });\n ```\n \n This will result in a posts.new url of `/posts/new` for modern browsers that\n support the `history` api or `/#/posts/new` for older ones, like Internet\n Explorer 9 and below.\n \n When a user visits a link to your application, they will be automatically\n upgraded or downgraded to the appropriate `Location` class, with the URL\n transformed accordingly, if needed.\n \n Keep in mind that since some of your users will use `HistoryLocation`, your\n server must serve the Ember app at all the routes you define.\n \n @class AutoLocation\n @static\n @protected\n */\n class AutoLocation extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.implementation = 'auto';\n }\n /**\n Called by the router to instruct the location to do any feature detection\n necessary. In the case of AutoLocation, we detect whether to use history\n or hash concrete implementations.\n @private\n */\n detect() {\n let rootURL = this.rootURL;\n (0, _debug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/');\n let implementation = detectImplementation({\n location: this.location,\n history: this.history,\n userAgent: this.userAgent,\n rootURL,\n documentMode: this.documentMode,\n global: this.global\n });\n if (implementation === false) {\n (0, _metal.set)(this, 'cancelRouterSetup', true);\n implementation = 'none';\n }\n let concrete = (0, _owner.getOwner)(this).lookup(`location:${implementation}`);\n (0, _metal.set)(concrete, 'rootURL', rootURL);\n (0, _debug.assert)(`Could not find location '${implementation}'.`, !!concrete);\n (0, _metal.set)(this, 'concreteImplementation', concrete);\n }\n willDestroy() {\n let concreteImplementation = (0, _metal.get)(this, 'concreteImplementation');\n if (concreteImplementation) {\n concreteImplementation.destroy();\n }\n }\n }\n exports.default = AutoLocation;\n AutoLocation.reopen({\n /**\n @private\n Will be pre-pended to path upon state change.\n @since 1.5.1\n @property rootURL\n @default '/'\n */\n rootURL: '/',\n initState: delegateToConcreteImplementation('initState'),\n getURL: delegateToConcreteImplementation('getURL'),\n setURL: delegateToConcreteImplementation('setURL'),\n replaceURL: delegateToConcreteImplementation('replaceURL'),\n onUpdateURL: delegateToConcreteImplementation('onUpdateURL'),\n formatURL: delegateToConcreteImplementation('formatURL'),\n /**\n @private\n The browser's `location` object. This is typically equivalent to\n `window.location`, but may be overridden for testing.\n @property location\n @default environment.location\n */\n location: _browserEnvironment.location,\n /**\n @private\n The browser's `history` object. This is typically equivalent to\n `window.history`, but may be overridden for testing.\n @since 1.5.1\n @property history\n @default environment.history\n */\n history: _browserEnvironment.history,\n /**\n @private\n The user agent's global variable. In browsers, this will be `window`.\n @since 1.11\n @property global\n @default window\n */\n global: _browserEnvironment.window,\n /**\n @private\n The browser's `userAgent`. This is typically equivalent to\n `navigator.userAgent`, but may be overridden for testing.\n @since 1.5.1\n @property userAgent\n @default environment.history\n */\n userAgent: _browserEnvironment.userAgent,\n /**\n @private\n This property is used by the router to know whether to cancel the routing\n setup process, which is needed while we redirect the browser.\n @since 1.5.1\n @property cancelRouterSetup\n @default false\n */\n cancelRouterSetup: false\n });\n function delegateToConcreteImplementation(methodName) {\n return function (...args) {\n let concreteImplementation = (0, _metal.get)(this, 'concreteImplementation');\n (0, _debug.assert)(\"AutoLocation's detect() method should be called before calling any other hooks.\", !!concreteImplementation);\n return (0, _utils.tryInvoke)(concreteImplementation, methodName, args);\n };\n }\n function detectImplementation(options) {\n let { location, userAgent, history, documentMode, global, rootURL } = options;\n let implementation = 'none';\n let cancelRouterSetup = false;\n let currentPath = (0, _util.getFullPath)(location);\n if ((0, _util.supportsHistory)(userAgent, history)) {\n let historyPath = getHistoryPath(rootURL, location);\n // If the browser supports history and we have a history path, we can use\n // the history location with no redirects.\n if (currentPath === historyPath) {\n implementation = 'history';\n } else if (currentPath.substr(0, 2) === '/#') {\n history.replaceState({ path: historyPath }, undefined, historyPath);\n implementation = 'history';\n } else {\n cancelRouterSetup = true;\n (0, _util.replacePath)(location, historyPath);\n }\n } else if ((0, _util.supportsHashChange)(documentMode, global)) {\n let hashPath = getHashPath(rootURL, location);\n // Be sure we're using a hashed path, otherwise let's switch over it to so\n // we start off clean and consistent. We'll count an index path with no\n // hash as \"good enough\" as well.\n if (currentPath === hashPath || currentPath === '/' && hashPath === '/#/') {\n implementation = 'hash';\n } else {\n // Our URL isn't in the expected hash-supported format, so we want to\n // cancel the router setup and replace the URL to start off clean\n cancelRouterSetup = true;\n (0, _util.replacePath)(location, hashPath);\n }\n }\n if (cancelRouterSetup) {\n return false;\n }\n return implementation;\n }\n /**\n @private\n \n Returns the current path as it should appear for HistoryLocation supported\n browsers. This may very well differ from the real current path (e.g. if it\n starts off as a hashed URL)\n */\n function getHistoryPath(rootURL, location) {\n let path = (0, _util.getPath)(location);\n let hash = (0, _util.getHash)(location);\n let query = (0, _util.getQuery)(location);\n let rootURLIndex = path.indexOf(rootURL);\n let routeHash, hashParts;\n (0, _debug.assert)(`Path ${path} does not start with the provided rootURL ${rootURL}`, rootURLIndex === 0);\n // By convention, Ember.js routes using HashLocation are required to start\n // with `#/`. Anything else should NOT be considered a route and should\n // be passed straight through, without transformation.\n if (hash.substr(0, 2) === '#/') {\n // There could be extra hash segments after the route\n hashParts = hash.substr(1).split('#');\n // The first one is always the route url\n routeHash = hashParts.shift();\n // If the path already has a trailing slash, remove the one\n // from the hashed route so we don't double up.\n if (path.charAt(path.length - 1) === '/') {\n routeHash = routeHash.substr(1);\n }\n // This is the \"expected\" final order\n path += routeHash + query;\n if (hashParts.length) {\n path += `#${hashParts.join('#')}`;\n }\n } else {\n path += query + hash;\n }\n return path;\n }\n /**\n @private\n \n Returns the current path as it should appear for HashLocation supported\n browsers. This may very well differ from the real current path.\n \n @method _getHashPath\n */\n function getHashPath(rootURL, location) {\n let path = rootURL;\n let historyPath = getHistoryPath(rootURL, location);\n let routePath = historyPath.substr(rootURL.length);\n if (routePath !== '') {\n if (routePath[0] !== '/') {\n routePath = `/${routePath}`;\n }\n path += `#${routePath}`;\n }\n return path;\n }\n});","enifed('@ember/-internals/routing/lib/location/hash_location', ['exports', '@ember/-internals/metal', '@ember/runloop', '@ember/-internals/runtime', '@ember/-internals/routing/lib/location/util'], function (exports, _metal, _runloop, _runtime, _util) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module @ember/routing\n */\n /**\n `HashLocation` implements the location API using the browser's\n hash. At present, it relies on a `hashchange` event existing in the\n browser.\n \n Using `HashLocation` results in URLs with a `#` (hash sign) separating the\n server side URL portion of the URL from the portion that is used by Ember.\n \n Example:\n \n ```app/router.js\n Router.map(function() {\n this.route('posts', function() {\n this.route('new');\n });\n });\n \n Router.reopen({\n location: 'hash'\n });\n ```\n \n This will result in a posts.new url of `/#/posts/new`.\n \n @class HashLocation\n @extends EmberObject\n @protected\n */\n class HashLocation extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.implementation = 'hash';\n }\n init() {\n (0, _metal.set)(this, 'location', (0, _metal.get)(this, '_location') || window.location);\n this._hashchangeHandler = undefined;\n }\n /**\n @private\n Returns normalized location.hash\n @since 1.5.1\n @method getHash\n */\n getHash() {\n return (0, _util.getHash)((0, _metal.get)(this, 'location'));\n }\n /**\n Returns the normalized URL, constructed from `location.hash`.\n e.g. `#/foo` => `/foo` as well as `#/foo#bar` => `/foo#bar`.\n By convention, hashed paths must begin with a forward slash, otherwise they\n are not treated as a path so we can distinguish intent.\n @private\n @method getURL\n */\n getURL() {\n let originalPath = this.getHash().substr(1);\n let outPath = originalPath;\n if (outPath[0] !== '/') {\n outPath = '/';\n // Only add the # if the path isn't empty.\n // We do NOT want `/#` since the ampersand\n // is only included (conventionally) when\n // the location.hash has a value\n if (originalPath) {\n outPath += `#${originalPath}`;\n }\n }\n return outPath;\n }\n /**\n Set the `location.hash` and remembers what was set. This prevents\n `onUpdateURL` callbacks from triggering when the hash was set by\n `HashLocation`.\n @private\n @method setURL\n @param path {String}\n */\n setURL(path) {\n (0, _metal.get)(this, 'location').hash = path;\n (0, _metal.set)(this, 'lastSetURL', path);\n }\n /**\n Uses location.replace to update the url without a page reload\n or history modification.\n @private\n @method replaceURL\n @param path {String}\n */\n replaceURL(path) {\n (0, _metal.get)(this, 'location').replace(`#${path}`);\n (0, _metal.set)(this, 'lastSetURL', path);\n }\n /**\n Register a callback to be invoked when the hash changes. These\n callbacks will execute when the user presses the back or forward\n button, but not after `setURL` is invoked.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL(callback) {\n this._removeEventListener();\n this._hashchangeHandler = (0, _runloop.bind)(this, function () {\n let path = this.getURL();\n if ((0, _metal.get)(this, 'lastSetURL') === path) {\n return;\n }\n (0, _metal.set)(this, 'lastSetURL', null);\n callback(path);\n });\n window.addEventListener('hashchange', this._hashchangeHandler);\n }\n /**\n Given a URL, formats it to be placed into the page as part\n of an element's `href` attribute.\n This is used, for example, when using the {{action}} helper\n to generate a URL based on an event.\n @private\n @method formatURL\n @param url {String}\n */\n formatURL(url) {\n return `#${url}`;\n }\n /**\n Cleans up the HashLocation event listener.\n @private\n @method willDestroy\n */\n willDestroy() {\n this._removeEventListener();\n }\n _removeEventListener() {\n if (this._hashchangeHandler) {\n window.removeEventListener('hashchange', this._hashchangeHandler);\n }\n }\n }\n exports.default = HashLocation;\n});","enifed('@ember/-internals/routing/lib/location/history_location', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/routing/lib/location/util'], function (exports, _metal, _runtime, _util) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module @ember/routing\n */\n let popstateFired = false;\n function _uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n let r, v;\n r = Math.random() * 16 | 0;\n v = c === 'x' ? r : r & 3 | 8;\n return v.toString(16);\n });\n }\n /**\n HistoryLocation implements the location API using the browser's\n history.pushState API.\n \n Using `HistoryLocation` results in URLs that are indistinguishable from a\n standard URL. This relies upon the browser's `history` API.\n \n Example:\n \n ```app/router.js\n Router.map(function() {\n this.route('posts', function() {\n this.route('new');\n });\n });\n \n Router.reopen({\n location: 'history'\n });\n ```\n \n This will result in a posts.new url of `/posts/new`.\n \n Keep in mind that your server must serve the Ember app at all the routes you\n define.\n \n @class HistoryLocation\n @extends EmberObject\n @protected\n */\n class HistoryLocation extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.implementation = 'history';\n /**\n Will be pre-pended to path upon state change\n @property rootURL\n @default '/'\n @private\n */\n this.rootURL = '/';\n }\n /**\n @private\n Returns normalized location.hash\n @method getHash\n */\n getHash() {\n return (0, _util.getHash)((0, _metal.get)(this, 'location'));\n }\n init() {\n this._super(...arguments);\n let base = document.querySelector('base');\n let baseURL = '';\n if (base) {\n baseURL = base.getAttribute('href');\n }\n (0, _metal.set)(this, 'baseURL', baseURL);\n (0, _metal.set)(this, 'location', (0, _metal.get)(this, 'location') || window.location);\n this._popstateHandler = undefined;\n }\n /**\n Used to set state on first call to setURL\n @private\n @method initState\n */\n initState() {\n let history = (0, _metal.get)(this, 'history') || window.history;\n (0, _metal.set)(this, 'history', history);\n if (history && 'state' in history) {\n this.supportsHistory = true;\n }\n let state = this.getState();\n let path = this.formatURL(this.getURL());\n if (state && state.path === path) {\n // preserve existing state\n // used for webkit workaround, since there will be no initial popstate event\n this._previousURL = this.getURL();\n } else {\n this.replaceState(path);\n }\n }\n /**\n Returns the current `location.pathname` without `rootURL` or `baseURL`\n @private\n @method getURL\n @return url {String}\n */\n getURL() {\n let location = (0, _metal.get)(this, 'location');\n let path = location.pathname;\n let rootURL = (0, _metal.get)(this, 'rootURL');\n let baseURL = (0, _metal.get)(this, 'baseURL');\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n baseURL = baseURL.replace(/\\/$/, '');\n // remove baseURL and rootURL from start of path\n let url = path.replace(new RegExp(`^${baseURL}(?=/|$)`), '').replace(new RegExp(`^${rootURL}(?=/|$)`), '').replace(/\\/\\/$/g, '/'); // remove extra slashes\n let search = location.search || '';\n url += search + this.getHash();\n return url;\n }\n /**\n Uses `history.pushState` to update the url without a page reload.\n @private\n @method setURL\n @param path {String}\n */\n setURL(path) {\n let state = this.getState();\n path = this.formatURL(path);\n if (!state || state.path !== path) {\n this.pushState(path);\n }\n }\n /**\n Uses `history.replaceState` to update the url without a page reload\n or history modification.\n @private\n @method replaceURL\n @param path {String}\n */\n replaceURL(path) {\n let state = this.getState();\n path = this.formatURL(path);\n if (!state || state.path !== path) {\n this.replaceState(path);\n }\n }\n /**\n Get the current `history.state`. Checks for if a polyfill is\n required and if so fetches this._historyState. The state returned\n from getState may be null if an iframe has changed a window's\n history.\n The object returned will contain a `path` for the given state as well\n as a unique state `id`. The state index will allow the app to distinguish\n between two states with similar paths but should be unique from one another.\n @private\n @method getState\n @return state {Object}\n */\n getState() {\n if (this.supportsHistory) {\n return (0, _metal.get)(this, 'history').state;\n }\n return this._historyState;\n }\n /**\n Pushes a new state.\n @private\n @method pushState\n @param path {String}\n */\n pushState(path) {\n let state = { path, uuid: _uuid() };\n (0, _metal.get)(this, 'history').pushState(state, null, path);\n this._historyState = state;\n // used for webkit workaround\n this._previousURL = this.getURL();\n }\n /**\n Replaces the current state.\n @private\n @method replaceState\n @param path {String}\n */\n replaceState(path) {\n let state = { path, uuid: _uuid() };\n (0, _metal.get)(this, 'history').replaceState(state, null, path);\n this._historyState = state;\n // used for webkit workaround\n this._previousURL = this.getURL();\n }\n /**\n Register a callback to be invoked whenever the browser\n history changes, including using forward and back buttons.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL(callback) {\n this._removeEventListener();\n this._popstateHandler = () => {\n // Ignore initial page load popstate event in Chrome\n if (!popstateFired) {\n popstateFired = true;\n if (this.getURL() === this._previousURL) {\n return;\n }\n }\n callback(this.getURL());\n };\n window.addEventListener('popstate', this._popstateHandler);\n }\n /**\n Used when using `{{action}}` helper. The url is always appended to the rootURL.\n @private\n @method formatURL\n @param url {String}\n @return formatted url {String}\n */\n formatURL(url) {\n let rootURL = (0, _metal.get)(this, 'rootURL');\n let baseURL = (0, _metal.get)(this, 'baseURL');\n if (url !== '') {\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n baseURL = baseURL.replace(/\\/$/, '');\n } else if (baseURL[0] === '/' && rootURL[0] === '/') {\n // if baseURL and rootURL both start with a slash\n // ... remove trailing slash from baseURL if it exists\n baseURL = baseURL.replace(/\\/$/, '');\n }\n return baseURL + rootURL + url;\n }\n /**\n Cleans up the HistoryLocation event listener.\n @private\n @method willDestroy\n */\n willDestroy() {\n this._removeEventListener();\n }\n _removeEventListener() {\n if (this._popstateHandler) {\n window.removeEventListener('popstate', this._popstateHandler);\n }\n }\n }\n exports.default = HistoryLocation;\n});","enifed('@ember/-internals/routing/lib/location/none_location', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/debug'], function (exports, _metal, _runtime, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n @module @ember/routing\n */\n /**\n NoneLocation does not interact with the browser. It is useful for\n testing, or when you need to manage state with your Router, but temporarily\n don't want it to muck with the URL (for example when you embed your\n application in a larger page).\n \n Using `NoneLocation` causes Ember to not store the applications URL state\n in the actual URL. This is generally used for testing purposes, and is one\n of the changes made when calling `App.setupForTesting()`.\n \n @class NoneLocation\n @extends EmberObject\n @protected\n */\n class NoneLocation extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.implementation = 'none';\n }\n detect() {\n let rootURL = this.rootURL;\n (0, _debug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/');\n }\n /**\n Returns the current path without `rootURL`.\n @private\n @method getURL\n @return {String} path\n */\n getURL() {\n let path = (0, _metal.get)(this, 'path');\n let rootURL = (0, _metal.get)(this, 'rootURL');\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n // remove rootURL from url\n return path.replace(new RegExp(`^${rootURL}(?=/|$)`), '');\n }\n /**\n Set the path and remembers what was set. Using this method\n to change the path will not invoke the `updateURL` callback.\n @private\n @method setURL\n @param path {String}\n */\n setURL(path) {\n (0, _metal.set)(this, 'path', path);\n }\n /**\n Register a callback to be invoked when the path changes. These\n callbacks will execute when the user presses the back or forward\n button, but not after `setURL` is invoked.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL(callback) {\n this.updateCallback = callback;\n }\n /**\n Sets the path and calls the `updateURL` callback.\n @private\n @method handleURL\n @param url {String}\n */\n handleURL(url) {\n (0, _metal.set)(this, 'path', url);\n this.updateCallback(url);\n }\n /**\n Given a URL, formats it to be placed into the page as part\n of an element's `href` attribute.\n This is used, for example, when using the {{action}} helper\n to generate a URL based on an event.\n @private\n @method formatURL\n @param url {String}\n @return {String} url\n */\n formatURL(url) {\n let rootURL = (0, _metal.get)(this, 'rootURL');\n if (url !== '') {\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n }\n return rootURL + url;\n }\n }\n exports.default = NoneLocation;\n NoneLocation.reopen({\n path: '',\n /**\n Will be pre-pended to path.\n @private\n @property rootURL\n @default '/'\n */\n rootURL: '/'\n });\n});","enifed('@ember/-internals/routing/lib/location/util', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.getPath = getPath;\n exports.getQuery = getQuery;\n exports.getHash = getHash;\n exports.getFullPath = getFullPath;\n exports.getOrigin = getOrigin;\n exports.supportsHashChange = supportsHashChange;\n exports.supportsHistory = supportsHistory;\n exports.replacePath = replacePath;\n /**\n @private\n \n Returns the current `location.pathname`, normalized for IE inconsistencies.\n */\n function getPath(location) {\n let pathname = location.pathname;\n // Various versions of IE/Opera don't always return a leading slash\n if (pathname[0] !== '/') {\n pathname = `/${pathname}`;\n }\n return pathname;\n }\n /**\n @private\n \n Returns the current `location.search`.\n */\n function getQuery(location) {\n return location.search;\n }\n /**\n @private\n \n Returns the hash or empty string\n */\n function getHash(location) {\n if (location.hash !== undefined) {\n return location.hash.substr(0);\n }\n return '';\n }\n function getFullPath(location) {\n return getPath(location) + getQuery(location) + getHash(location);\n }\n function getOrigin(location) {\n let origin = location.origin;\n // Older browsers, especially IE, don't have origin\n if (!origin) {\n origin = `${location.protocol}//${location.hostname}`;\n if (location.port) {\n origin += `:${location.port}`;\n }\n }\n return origin;\n }\n /*\n `documentMode` only exist in Internet Explorer, and it's tested because IE8 running in\n IE7 compatibility mode claims to support `onhashchange` but actually does not.\n \n `global` is an object that may have an `onhashchange` property.\n \n @private\n @function supportsHashChange\n */\n function supportsHashChange(documentMode, global) {\n return global && 'onhashchange' in global && (documentMode === undefined || documentMode > 7);\n }\n /*\n `userAgent` is a user agent string. We use user agent testing here, because\n the stock Android browser is known to have buggy versions of the History API,\n in some Android versions.\n \n @private\n @function supportsHistory\n */\n function supportsHistory(userAgent, history) {\n // Boosted from Modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n // The stock browser on Android 2.2 & 2.3, and 4.0.x returns positive on history support\n // Unfortunately support is really buggy and there is no clean way to detect\n // these bugs, so we fall back to a user agent sniff :(\n // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies\n // itself as 'Mobile Safari' as well, nor Windows Phone.\n if ((userAgent.indexOf('Android 2.') !== -1 || userAgent.indexOf('Android 4.0') !== -1) && userAgent.indexOf('Mobile Safari') !== -1 && userAgent.indexOf('Chrome') === -1 && userAgent.indexOf('Windows Phone') === -1) {\n return false;\n }\n return !!(history && 'pushState' in history);\n }\n /**\n Replaces the current location, making sure we explicitly include the origin\n to prevent redirecting to a different origin.\n \n @private\n */\n function replacePath(location, path) {\n location.replace(getOrigin(location) + path);\n }\n});","enifed('@ember/-internals/routing/lib/services/router', ['exports', '@ember/-internals/runtime', '@ember/canary-features', '@ember/debug', '@ember/object/computed', '@ember/service', '@glimmer/env', '@ember/-internals/routing/lib/utils'], function (exports, _runtime, _canaryFeatures, _debug, _computed, _service, _env, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n let freezeRouteInfo;\n if (_env.DEBUG) {\n freezeRouteInfo = transition => {\n if (transition.from !== null && !Object.isFrozen(transition.from)) {\n Object.freeze(transition.from);\n }\n if (transition.to !== null && !Object.isFrozen(transition.to)) {\n Object.freeze(transition.to);\n }\n };\n }\n /**\n The Router service is the public API that provides access to the router.\n \n The immediate benefit of the Router service is that you can inject it into components,\n giving them a friendly way to initiate transitions and ask questions about the current\n global router state.\n \n In this example, the Router service is injected into a component to initiate a transition\n to a dedicated route:\n ```javascript\n import Component from '@ember/component';\n import { inject as service } from '@ember/service';\n \n export default Component.extend({\n router: service(),\n \n actions: {\n next() {\n this.get('router').transitionTo('other.route');\n }\n }\n });\n ```\n \n Like any service, it can also be injected into helpers, routes, etc.\n \n @public\n @class RouterService\n */\n class RouterService extends _service.default {\n /**\n Transition the application into another route. The route may\n be either a single route or route path:\n See [transitionTo](/api/ember/release/classes/Route/methods/transitionTo?anchor=transitionTo) for more info.\n Calling `transitionTo` from the Router service will cause default query parameter values to be included in the URL.\n This behavior is different from calling `transitionTo` on a route or `transitionToRoute` on a controller.\n See the [Router Service RFC](https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#query-parameter-semantics) for more info.\n @method transitionTo\n @param {String} routeNameOrUrl the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {Transition} the transition object associated with this\n attempted transition\n @public\n */\n transitionTo(...args) {\n if ((0, _utils.resemblesURL)(args[0])) {\n return this._router._doURLTransition('transitionTo', args[0]);\n }\n let { routeName, models, queryParams } = (0, _utils.extractRouteArgs)(args);\n let transition = this._router._doTransition(routeName, models, queryParams, true);\n transition['_keepDefaultQueryParamValues'] = true;\n return transition;\n }\n /**\n Transition into another route while replacing the current URL, if possible.\n The route may be either a single route or route path:\n See [replaceWith](/api/ember/release/classes/Route/methods/replaceWith?anchor=replaceWith) for more info.\n Calling `replaceWith` from the Router service will cause default query parameter values to be included in the URL.\n This behavior is different from calling `replaceWith` on a route.\n See the [Router Service RFC](https://github.com/emberjs/rfcs/blob/master/text/0095-router-service.md#query-parameter-semantics) for more info.\n @method replaceWith\n @param {String} routeNameOrUrl the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {Transition} the transition object associated with this\n attempted transition\n @public\n */\n replaceWith() /* routeNameOrUrl, ...models, options */{\n return this.transitionTo(...arguments).method('replace');\n }\n /**\n Generate a URL based on the supplied route name.\n @method urlFor\n @param {String} routeName the name of the route\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {String} the string representing the generated URL\n @public\n */\n urlFor(routeName, ...args) {\n return this._router.generate(routeName, ...args);\n }\n /**\n Determines whether a route is active.\n @method isActive\n @param {String} routeName the name of the route\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {boolean} true if the provided routeName/models/queryParams are active\n @public\n */\n isActive(...args) {\n let { routeName, models, queryParams } = (0, _utils.extractRouteArgs)(args);\n let routerMicrolib = this._router._routerMicrolib;\n if (!routerMicrolib.isActiveIntent(routeName, models)) {\n return false;\n }\n let hasQueryParams = Object.keys(queryParams).length > 0;\n if (hasQueryParams) {\n this._router._prepareQueryParams(routeName, models, queryParams, true /* fromRouterService */);\n return (0, _utils.shallowEqual)(queryParams, routerMicrolib.state.queryParams);\n }\n return true;\n }\n }\n exports.default = RouterService;\n RouterService.reopen({\n /**\n Name of the current route.\n This property represents the logical name of the route,\n which is comma separated.\n For the following router:\n ```app/router.js\n Router.map(function() {\n this.route('about');\n this.route('blog', function () {\n this.route('post', { path: ':post_id' });\n });\n });\n ```\n It will return:\n * `index` when you visit `/`\n * `about` when you visit `/about`\n * `blog.index` when you visit `/blog`\n * `blog.post` when you visit `/blog/some-post-id`\n @property currentRouteName\n @type String\n @public\n */\n currentRouteName: (0, _computed.readOnly)('_router.currentRouteName'),\n /**\n Current URL for the application.\n This property represents the URL path for this route.\n For the following router:\n ```app/router.js\n Router.map(function() {\n this.route('about');\n this.route('blog', function () {\n this.route('post', { path: ':post_id' });\n });\n });\n ```\n It will return:\n * `/` when you visit `/`\n * `/about` when you visit `/about`\n * `/blog` when you visit `/blog`\n * `/blog/some-post-id` when you visit `/blog/some-post-id`\n @property currentURL\n @type String\n @public\n */\n currentURL: (0, _computed.readOnly)('_router.currentURL'),\n /**\n The `location` property determines the type of URL's that your\n application will use.\n The following location types are currently available:\n * `auto`\n * `hash`\n * `history`\n * `none`\n @property location\n @default 'hash'\n @see {Location}\n @public\n */\n location: (0, _computed.readOnly)('_router.location'),\n /**\n The `rootURL` property represents the URL of the root of\n the application, '/' by default.\n This prefix is assumed on all routes defined on this app.\n IF you change the `rootURL` in your environment configuration\n like so:\n ```config/environment.js\n 'use strict';\n module.exports = function(environment) {\n let ENV = {\n modulePrefix: 'router-service',\n environment,\n rootURL: '/my-root',\n …\n }\n ]\n ```\n This property will return `/my-root`.\n @property rootURL\n @default '/'\n @public\n */\n rootURL: (0, _computed.readOnly)('_router.rootURL')\n });\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n RouterService.reopen(_runtime.Evented, {\n init() {\n this._super(...arguments);\n this._router.on('routeWillChange', transition => {\n if (_env.DEBUG) {\n freezeRouteInfo(transition);\n }\n this.trigger('routeWillChange', transition);\n });\n this._router.on('routeDidChange', transition => {\n if (_env.DEBUG) {\n freezeRouteInfo(transition);\n }\n this.trigger('routeDidChange', transition);\n });\n },\n /**\n A RouteInfo that represents the current leaf route.\n It is guaranteed to change whenever a route transition\n happens (even when that transition only changes parameters\n and doesn't change the active route)\n @property currentRoute\n @type RouteInfo\n @category ember-routing-router-service\n @public\n */\n currentRoute: (0, _computed.readOnly)('_router.currentRoute'),\n /**\n Takes a string URL and returns a `RouteInfo` for the leafmost route represented\n by the URL. Returns `null` if the URL is not recognized. This method expects to\n receive the actual URL as seen by the browser including the app's `rootURL`.\n @method recognize\n @param {String} url\n @category ember-routing-router-service\n @public\n */\n recognize(url) {\n (0, _debug.assert)(`You must pass a url that begins with the application's rootURL \"${this.rootURL}\"`, url.indexOf(this.rootURL) === 0);\n let internalURL = cleanURL(url, this.rootURL);\n return this._router._routerMicrolib.recognize(internalURL);\n },\n /**\n Takes a string URL and returns a promise that resolves to a\n `RouteInfoWithAttributes` for the leafmost route represented by the URL.\n The promise rejects if the URL is not recognized or an unhandled exception\n is encountered. This method expects to receive the actual URL as seen by\n the browser including the app's `rootURL`.\n @method recognizeAndLoad\n @param {String} url\n @category ember-routing-router-service\n @public\n */\n recognizeAndLoad(url) {\n (0, _debug.assert)(`You must pass a url that begins with the application's rootURL \"${this.rootURL}\"`, url.indexOf(this.rootURL) === 0);\n let internalURL = cleanURL(url, this.rootURL);\n return this._router._routerMicrolib.recognizeAndLoad(internalURL);\n }\n });\n function cleanURL(url, rootURL) {\n if (rootURL === '/') {\n return url;\n }\n return url.substr(rootURL.length, url.length);\n }\n }\n});","enifed('@ember/-internals/routing/lib/services/routing', ['exports', '@ember/-internals/metal', '@ember/object/computed', '@ember/polyfills', '@ember/service'], function (exports, _metal, _computed, _polyfills, _service) {\n 'use strict';\n\n exports.__esModule = true;\n\n /**\n The Routing service is used by LinkComponent, and provides facilities for\n the component/view layer to interact with the router.\n \n This is a private service for internal usage only. For public usage,\n refer to the `Router` service.\n \n @private\n @class RoutingService\n */\n /**\n @module ember\n */\n class RoutingService extends _service.default {\n hasRoute(routeName) {\n return (0, _metal.get)(this, 'router').hasRoute(routeName);\n }\n transitionTo(routeName, models, queryParams, shouldReplace) {\n let router = (0, _metal.get)(this, 'router');\n let transition = router._doTransition(routeName, models, queryParams);\n if (shouldReplace) {\n transition.method('replace');\n }\n return transition;\n }\n normalizeQueryParams(routeName, models, queryParams) {\n (0, _metal.get)(this, 'router')._prepareQueryParams(routeName, models, queryParams);\n }\n generateURL(routeName, models, queryParams) {\n let router = (0, _metal.get)(this, 'router');\n // return early when the router microlib is not present, which is the case for {{link-to}} in integration tests\n if (!router._routerMicrolib) {\n return;\n }\n let visibleQueryParams = {};\n if (queryParams) {\n (0, _polyfills.assign)(visibleQueryParams, queryParams);\n this.normalizeQueryParams(routeName, models, visibleQueryParams);\n }\n return router.generate(routeName, ...models, {\n queryParams: visibleQueryParams\n });\n }\n isActiveForRoute(contexts, queryParams, routeName, routerState, isCurrentWhenSpecified) {\n let router = (0, _metal.get)(this, 'router');\n let handlers = router._routerMicrolib.recognizer.handlersFor(routeName);\n let leafName = handlers[handlers.length - 1].handler;\n let maximumContexts = numberOfContextsAcceptedByHandler(routeName, handlers);\n // NOTE: any ugliness in the calculation of activeness is largely\n // due to the fact that we support automatic normalizing of\n // `resource` -> `resource.index`, even though there might be\n // dynamic segments / query params defined on `resource.index`\n // which complicates (and makes somewhat ambiguous) the calculation\n // of activeness for links that link to `resource` instead of\n // directly to `resource.index`.\n // if we don't have enough contexts revert back to full route name\n // this is because the leaf route will use one of the contexts\n if (contexts.length > maximumContexts) {\n routeName = leafName;\n }\n return routerState.isActiveIntent(routeName, contexts, queryParams, !isCurrentWhenSpecified);\n }\n }\n exports.default = RoutingService;\n RoutingService.reopen({\n targetState: (0, _computed.readOnly)('router.targetState'),\n currentState: (0, _computed.readOnly)('router.currentState'),\n currentRouteName: (0, _computed.readOnly)('router.currentRouteName'),\n currentPath: (0, _computed.readOnly)('router.currentPath')\n });\n function numberOfContextsAcceptedByHandler(handlerName, handlerInfos) {\n let req = 0;\n for (let i = 0; i < handlerInfos.length; i++) {\n req += handlerInfos[i].names.length;\n if (handlerInfos[i].handler === handlerName) {\n break;\n }\n }\n return req;\n }\n});","enifed(\"@ember/-internals/routing/lib/system/cache\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n /**\n A two-tiered cache with support for fallback values when doing lookups.\n Uses \"buckets\" and then \"keys\" to cache values.\n \n @private\n @class BucketCache\n */\n class BucketCache {\n constructor() {\n this.cache = new Map();\n }\n has(bucketKey) {\n return this.cache.has(bucketKey);\n }\n stash(bucketKey, key, value) {\n let bucket = this.cache.get(bucketKey);\n if (bucket === undefined) {\n bucket = new Map();\n this.cache.set(bucketKey, bucket);\n }\n bucket.set(key, value);\n }\n lookup(bucketKey, prop, defaultValue) {\n if (!this.has(bucketKey)) {\n return defaultValue;\n }\n let bucket = this.cache.get(bucketKey);\n if (bucket.has(prop)) {\n return bucket.get(prop);\n } else {\n return defaultValue;\n }\n }\n }\n exports.default = BucketCache;\n});","enifed(\"@ember/-internals/routing/lib/system/controller_for\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = controllerFor;\n /**\n @module ember\n */\n /**\n Finds a controller instance.\n \n @for Ember\n @method controllerFor\n @private\n */\n function controllerFor(container, controllerName, lookupOptions) {\n return container.lookup(`controller:${controllerName}`, lookupOptions);\n }\n});","enifed('@ember/-internals/routing/lib/system/dsl', ['exports', '@ember/debug', '@ember/polyfills'], function (exports, _debug, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n\n let uuid = 0;\n class DSL {\n constructor(name = null, options) {\n this.explicitIndex = false;\n this.parent = name;\n this.enableLoadingSubstates = !!(options && options.enableLoadingSubstates);\n this.matches = [];\n this.options = options;\n }\n route(name, options = {}, callback) {\n let dummyErrorRoute = `/_unused_dummy_error_path_route_${name}/:error`;\n if (arguments.length === 2 && typeof options === 'function') {\n callback = options;\n options = {};\n }\n (0, _debug.assert)(`'${name}' cannot be used as a route name.`, (() => {\n if (options.overrideNameAssertion === true) {\n return true;\n }\n return ['basic', 'application'].indexOf(name) === -1;\n })());\n (0, _debug.assert)(`'${name}' is not a valid route name. It cannot contain a ':'. You may want to use the 'path' option instead.`, name.indexOf(':') === -1);\n if (this.enableLoadingSubstates) {\n createRoute(this, `${name}_loading`, {\n resetNamespace: options.resetNamespace\n });\n createRoute(this, `${name}_error`, {\n resetNamespace: options.resetNamespace,\n path: dummyErrorRoute\n });\n }\n if (callback) {\n let fullName = getFullName(this, name, options.resetNamespace);\n let dsl = new DSL(fullName, this.options);\n createRoute(dsl, 'loading');\n createRoute(dsl, 'error', { path: dummyErrorRoute });\n callback.call(dsl);\n createRoute(this, name, options, dsl.generate());\n } else {\n createRoute(this, name, options);\n }\n }\n push(url, name, callback, serialize) {\n let parts = name.split('.');\n if (this.options.engineInfo) {\n let localFullName = name.slice(this.options.engineInfo.fullName.length + 1);\n let routeInfo = (0, _polyfills.assign)({ localFullName }, this.options.engineInfo);\n if (serialize) {\n routeInfo.serializeMethod = serialize;\n }\n this.options.addRouteForEngine(name, routeInfo);\n } else if (serialize) {\n throw new Error(`Defining a route serializer on route '${name}' outside an Engine is not allowed.`);\n }\n if (url === '' || url === '/' || parts[parts.length - 1] === 'index') {\n this.explicitIndex = true;\n }\n this.matches.push(url, name, callback);\n }\n generate() {\n let dslMatches = this.matches;\n if (!this.explicitIndex) {\n this.route('index', { path: '/' });\n }\n return match => {\n for (let i = 0; i < dslMatches.length; i += 3) {\n match(dslMatches[i]).to(dslMatches[i + 1], dslMatches[i + 2]);\n }\n };\n }\n mount(_name, options = {}) {\n let engineRouteMap = this.options.resolveRouteMap(_name);\n let name = _name;\n if (options.as) {\n name = options.as;\n }\n let fullName = getFullName(this, name, options.resetNamespace);\n let engineInfo = {\n name: _name,\n instanceId: uuid++,\n mountPoint: fullName,\n fullName\n };\n let path = options.path;\n if (typeof path !== 'string') {\n path = `/${name}`;\n }\n let callback;\n let dummyErrorRoute = `/_unused_dummy_error_path_route_${name}/:error`;\n if (engineRouteMap) {\n let shouldResetEngineInfo = false;\n let oldEngineInfo = this.options.engineInfo;\n if (oldEngineInfo) {\n shouldResetEngineInfo = true;\n this.options.engineInfo = engineInfo;\n }\n let optionsForChild = (0, _polyfills.assign)({ engineInfo }, this.options);\n let childDSL = new DSL(fullName, optionsForChild);\n createRoute(childDSL, 'loading');\n createRoute(childDSL, 'error', { path: dummyErrorRoute });\n engineRouteMap.class.call(childDSL);\n callback = childDSL.generate();\n if (shouldResetEngineInfo) {\n this.options.engineInfo = oldEngineInfo;\n }\n }\n let localFullName = 'application';\n let routeInfo = (0, _polyfills.assign)({ localFullName }, engineInfo);\n if (this.enableLoadingSubstates) {\n // These values are important to register the loading routes under their\n // proper names for the Router and within the Engine's registry.\n let substateName = `${name}_loading`;\n let localFullName = `application_loading`;\n let routeInfo = (0, _polyfills.assign)({ localFullName }, engineInfo);\n createRoute(this, substateName, {\n resetNamespace: options.resetNamespace\n });\n this.options.addRouteForEngine(substateName, routeInfo);\n substateName = `${name}_error`;\n localFullName = `application_error`;\n routeInfo = (0, _polyfills.assign)({ localFullName }, engineInfo);\n createRoute(this, substateName, {\n resetNamespace: options.resetNamespace,\n path: dummyErrorRoute\n });\n this.options.addRouteForEngine(substateName, routeInfo);\n }\n this.options.addRouteForEngine(fullName, routeInfo);\n this.push(path, fullName, callback);\n }\n }\n exports.default = DSL;\n\n function canNest(dsl) {\n return dsl.parent !== 'application';\n }\n function getFullName(dsl, name, resetNamespace) {\n if (canNest(dsl) && resetNamespace !== true) {\n return `${dsl.parent}.${name}`;\n } else {\n return name;\n }\n }\n function createRoute(dsl, name, options = {}, callback) {\n let fullName = getFullName(dsl, name, options.resetNamespace);\n if (typeof options.path !== 'string') {\n options.path = `/${name}`;\n }\n dsl.push(options.path, fullName, callback, options.serialize);\n }\n});","enifed(\"@ember/-internals/routing/lib/system/engines\", [], function () {\n \"use strict\";\n});","enifed('@ember/-internals/routing/lib/system/generate_controller', ['exports', '@ember/-internals/metal', '@ember/debug', '@glimmer/env'], function (exports, _metal, _debug, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.generateControllerFactory = generateControllerFactory;\n exports.default = generateController;\n\n /**\n @module ember\n */\n /**\n Generates a controller factory\n \n @for Ember\n @method generateControllerFactory\n @private\n */\n function generateControllerFactory(owner, controllerName) {\n let Factory = owner.factoryFor('controller:basic').class;\n Factory = Factory.extend({\n toString() {\n return `(generated ${controllerName} controller)`;\n }\n });\n let fullName = `controller:${controllerName}`;\n owner.register(fullName, Factory);\n return Factory;\n }\n /**\n Generates and instantiates a controller extending from `controller:basic`\n if present, or `Controller` if not.\n \n @for Ember\n @method generateController\n @private\n @since 1.3.0\n */\n function generateController(owner, controllerName) {\n generateControllerFactory(owner, controllerName);\n let fullName = `controller:${controllerName}`;\n let instance = owner.lookup(fullName);\n if (_env.DEBUG) {\n if ((0, _metal.get)(instance, 'namespace.LOG_ACTIVE_GENERATION')) {\n (0, _debug.info)(`generated -> ${fullName}`, { fullName });\n }\n }\n return instance;\n }\n});","enifed(\"@ember/-internals/routing/lib/system/query_params\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n class QueryParams {\n constructor(values = null) {\n this.isQueryParams = true;\n this.values = values;\n }\n }\n exports.default = QueryParams;\n});","enifed(\"@ember/-internals/routing/lib/system/route-info\", [], function () {\n \"use strict\";\n /**\n A `RouteInfoWithAttributes` is an object that contains\n metadata, including the resolved value from the routes\n `model` hook. Like `RouteInfo`, a `RouteInfoWithAttributes`\n represents a specific route with in a Transition.\n It is read-only and internally immutable. It is also not\n observable, because a Transition instance is never\n changed after creation.\n \n @class RouteInfoWithAttributes\n @category ember-routing-router-service\n @public\n */\n /**\n The dot-separated, fully-qualified name of the\n route, like \"people.index\".\n @property {String} name\n @category ember-routing-router-service\n @public\n */\n /**\n The final segment of the fully-qualified name of\n the route, like \"index\"\n @property {String} localName\n @category ember-routing-router-service\n @public\n */\n /**\n The values of the route's parametes. These are the\n same params that are recieved as arguments to the\n route's model hook. Contains only the parameters\n valid for this route, if any (params for parent or\n child routes are not merged).\n @property {Object} params\n @category ember-routing-router-service\n @public\n */\n /**\n The ordered list of the names of the params\n required for this route. It will contain the same\n strings as Object.keys(params), but here the order\n is significant. This allows users to correctly pass\n params into routes programmatically.\n @property {Array} paramNames\n @category ember-routing-router-service\n @public\n */\n /**\n The values of any queryParams on this route.\n @property {Object} queryParams\n @category ember-routing-router-service\n @public\n */\n /**\n This is the resolved return value from the\n route's model hook.\n @property {Object|Array|String} attributes\n @category ember-routing-router-service\n @public\n */\n /**\n A reference to the parent route's RouteInfo.\n This can be used to traverse upward to the topmost\n `RouteInfo`.\n @property {RouteInfo|null} parent\n @category ember-routing-router-service\n @public\n */\n /**\n A reference to the child route's RouteInfo.\n This can be used to traverse downward to the\n leafmost `RouteInfo`.\n @property {RouteInfo|null} child\n @category ember-routing-router-service\n @public\n \n Allows you to traverse through the linked list\n of `RouteInfo`s from the topmost to leafmost.\n Returns the first `RouteInfo` in the linked list\n for which the callback returns true.\n \n This method is similar to the `find()` method\n defined in ECMAScript 2015.\n \n The callback method you provide should have the\n following signature (all parameters are optional):\n \n ```javascript\n function(item, index, array);\n ```\n \n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n \n It should return the `true` to include the item in\n the results, `false` otherwise.\n \n Note that in addition to a callback, you can also\n pass an optional target object that will be set as\n `this` on the context.\n \n @method find\n @param {Function} callback the callback to execute\n @param {Object} [target*] optional target to use\n @returns {Object} Found item or undefined\n @category ember-routing-router-service\n @public\n */\n /**\n A RouteInfo is an object that contains metadata\n about a specific route with in a Transition. It is\n read-only and internally immutable. It is also not\n observable, because a Transition instance is never\n changed after creation.\n \n @class RouteInfo\n @category ember-routing-router-service\n @public\n */\n /**\n The dot-separated, fully-qualified name of the\n route, like \"people.index\".\n @property {String} name\n @category ember-routing-router-service\n @public\n */\n /**\n The final segment of the fully-qualified name of\n the route, like \"index\"\n @property {String} localName\n @category ember-routing-router-service\n @public\n */\n /**\n The values of the route's parametes. These are the\n same params that are recieved as arguments to the\n route's model hook. Contains only the parameters\n valid for this route, if any (params for parent or\n child routes are not merged).\n @property {Object} params\n @category ember-routing-router-service\n @public\n */\n /**\n The ordered list of the names of the params\n required for this route. It will contain the same\n strings as Object.keys(params), but here the order\n is significant. This allows users to correctly pass\n params into routes programmatically.\n @property {Array} paramNames\n @category ember-routing-router-service\n @public\n */\n /**\n The values of any queryParams on this route.\n @property {Object} queryParams\n @category ember-routing-router-service\n @public\n */\n /**\n A reference to the parent route's RouteInfo.\n This can be used to traverse upward to the topmost\n `RouteInfo`.\n @property {RouteInfo|null} parent\n @category ember-routing-router-service\n @public\n */\n /**\n A reference to the child route's RouteInfo.\n This can be used to traverse downward to the\n leafmost `RouteInfo`.\n @property {RouteInfo|null} child\n @category ember-routing-router-service\n @public\n \n Allows you to traverse through the linked list\n of `RouteInfo`s from the topmost to leafmost.\n Returns the first `RouteInfo` in the linked list\n for which the callback returns true.\n \n This method is similar to the `find()` method\n defined in ECMAScript 2015.\n \n The callback method you provide should have the\n following signature (all parameters are optional):\n \n ```javascript\n function(item, index, array);\n ```\n \n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n \n It should return the `true` to include the item in\n the results, `false` otherwise.\n \n Note that in addition to a callback, you can also\n pass an optional target object that will be set as\n `this` on the context.\n \n @method find\n @param {Function} callback the callback to execute\n @param {Object} [target*] optional target to use\n @returns {Object} Found item or undefined\n @category ember-routing-router-service\n @public\n */\n});","enifed('@ember/-internals/routing/lib/system/route', ['exports', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/-internals/runtime', '@ember/canary-features', '@ember/debug', '@ember/deprecated-features', '@ember/polyfills', '@ember/runloop', '@ember/string', '@glimmer/env', 'router_js', '@ember/-internals/routing/lib/utils', '@ember/-internals/routing/lib/system/generate_controller'], function (exports, _metal, _owner, _runtime, _canaryFeatures, _debug, _deprecatedFeatures, _polyfills, _runloop, _string, _env, _router_js, _utils, _generate_controller) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ROUTER_EVENT_DEPRECATIONS = undefined;\n exports.defaultSerialize = defaultSerialize;\n exports.hasDefaultSerialize = hasDefaultSerialize;\n function defaultSerialize(model, params) {\n if (params.length < 1 || !model) {\n return;\n }\n let object = {};\n if (params.length === 1) {\n let [name] = params;\n if (name in model) {\n object[name] = (0, _metal.get)(model, name);\n } else if (/_id$/.test(name)) {\n object[name] = (0, _metal.get)(model, 'id');\n }\n } else {\n object = (0, _metal.getProperties)(model, params);\n }\n return object;\n }\n function hasDefaultSerialize(route) {\n return route.serialize === defaultSerialize;\n }\n /**\n @module @ember/routing\n */\n /**\n The `Route` class is used to define individual routes. Refer to\n the [routing guide](https://guides.emberjs.com/release/routing/) for documentation.\n \n @class Route\n @extends EmberObject\n @uses ActionHandler\n @uses Evented\n @since 1.0.0\n @public\n */\n class Route extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.context = {};\n }\n /**\n The name of the route, dot-delimited.\n For example, a route found at `app/routes/posts/post.js` will have\n a `routeName` of `posts.post`.\n @property routeName\n @for Route\n @type String\n @since 1.0.0\n @public\n */\n /**\n The name of the route, dot-delimited, including the engine prefix\n if applicable.\n For example, a route found at `addon/routes/posts/post.js` within an\n engine named `admin` will have a `fullRouteName` of `admin.posts.post`.\n @property fullRouteName\n @for Route\n @type String\n @since 2.10.0\n @public\n */\n /**\n Sets the name for this route, including a fully resolved name for routes\n inside engines.\n @private\n @method _setRouteName\n @param {String} name\n */\n _setRouteName(name) {\n this.routeName = name;\n this.fullRouteName = getEngineRouteName((0, _owner.getOwner)(this), name);\n }\n /**\n @private\n @method _stashNames\n */\n _stashNames(routeInfo, dynamicParent) {\n if (this._names) {\n return;\n }\n let names = this._names = routeInfo['_names'];\n if (!names.length) {\n routeInfo = dynamicParent;\n names = routeInfo && routeInfo['_names'] || [];\n }\n let qps = (0, _metal.get)(this, '_qp.qps');\n let namePaths = new Array(names.length);\n for (let a = 0; a < names.length; ++a) {\n namePaths[a] = `${routeInfo.name}.${names[a]}`;\n }\n for (let i = 0; i < qps.length; ++i) {\n let qp = qps[i];\n if (qp.scope === 'model') {\n qp.parts = namePaths;\n }\n }\n }\n /**\n @private\n @property _activeQPChanged\n */\n _activeQPChanged(qp, value) {\n this._router._activeQPChanged(qp.scopedPropertyName, value);\n }\n /**\n @private\n @method _updatingQPChanged\n */\n _updatingQPChanged(qp) {\n this._router._updatingQPChanged(qp.urlKey);\n }\n /**\n Returns a hash containing the parameters of an ancestor route.\n Example\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('member', { path: ':name' }, function() {\n this.route('interest', { path: ':interest' });\n });\n });\n ```\n ```app/routes/member.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n queryParams: {\n memberQp: { refreshModel: true }\n }\n });\n ```\n ```app/routes/member/interest.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n queryParams: {\n interestQp: { refreshModel: true }\n },\n model() {\n return this.paramsFor('member');\n }\n });\n ```\n If we visit `/turing/maths?memberQp=member&interestQp=interest` the model for\n the `member.interest` route is a hash with:\n * `name`: `turing`\n * `memberQp`: `member`\n @method paramsFor\n @param {String} name\n @return {Object} hash containing the parameters of the route `name`\n @since 1.4.0\n @public\n */\n paramsFor(name) {\n let route = (0, _owner.getOwner)(this).lookup(`route:${name}`);\n if (!route) {\n return {};\n }\n let transition = this._router._routerMicrolib.activeTransition;\n let state = transition ? transition[_router_js.STATE_SYMBOL] : this._router._routerMicrolib.state;\n let fullName = route.fullRouteName;\n let params = (0, _polyfills.assign)({}, state.params[fullName]);\n let queryParams = getQueryParamsFor(route, state);\n return Object.keys(queryParams).reduce((params, key) => {\n (0, _debug.assert)(`The route '${this.routeName}' has both a dynamic segment and query param with name '${key}'. Please rename one to avoid collisions.`, !params[key]);\n params[key] = queryParams[key];\n return params;\n }, params);\n }\n /**\n Serializes the query parameter key\n @method serializeQueryParamKey\n @param {String} controllerPropertyName\n @private\n */\n serializeQueryParamKey(controllerPropertyName) {\n return controllerPropertyName;\n }\n /**\n Serializes value of the query parameter based on defaultValueType\n @method serializeQueryParam\n @param {Object} value\n @param {String} urlKey\n @param {String} defaultValueType\n @private\n */\n serializeQueryParam(value, _urlKey, defaultValueType) {\n // urlKey isn't used here, but anyone overriding\n // can use it to provide serialization specific\n // to a certain query param.\n return this._router._serializeQueryParam(value, defaultValueType);\n }\n /**\n Deserializes value of the query parameter based on defaultValueType\n @method deserializeQueryParam\n @param {Object} value\n @param {String} urlKey\n @param {String} defaultValueType\n @private\n */\n deserializeQueryParam(value, _urlKey, defaultValueType) {\n // urlKey isn't used here, but anyone overriding\n // can use it to provide deserialization specific\n // to a certain query param.\n return this._router._deserializeQueryParam(value, defaultValueType);\n }\n /**\n @private\n @property _optionsForQueryParam\n */\n _optionsForQueryParam(qp) {\n return (0, _metal.get)(this, `queryParams.${qp.urlKey}`) || (0, _metal.get)(this, `queryParams.${qp.prop}`) || {};\n }\n /**\n A hook you can use to reset controller values either when the model\n changes or the route is exiting.\n ```app/routes/articles.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n resetController(controller, isExiting, transition) {\n if (isExiting && transition.targetName !== 'error') {\n controller.set('page', 1);\n }\n }\n });\n ```\n @method resetController\n @param {Controller} controller instance\n @param {Boolean} isExiting\n @param {Object} transition\n @since 1.7.0\n @public\n */\n resetController(_controller, _isExiting, _transition) {\n return this;\n }\n /**\n @private\n @method exit\n */\n exit() {\n this.deactivate();\n this.trigger('deactivate');\n this.teardownViews();\n }\n /**\n @private\n @method _internalReset\n @since 3.6.0\n */\n _internalReset(isExiting, transition) {\n let controller = this.controller;\n controller._qpDelegate = (0, _metal.get)(this, '_qp.states.inactive');\n this.resetController(controller, isExiting, transition);\n }\n /**\n @private\n @method enter\n */\n enter() {\n this.connections = [];\n this.activate();\n this.trigger('activate');\n }\n /**\n The `willTransition` action is fired at the beginning of any\n attempted transition with a `Transition` object as the sole\n argument. This action can be used for aborting, redirecting,\n or decorating the transition from the currently active routes.\n A good example is preventing navigation when a form is\n half-filled out:\n ```app/routes/contact-form.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n willTransition(transition) {\n if (this.controller.get('userHasEnteredData')) {\n this.controller.displayNavigationConfirm();\n transition.abort();\n }\n }\n }\n });\n ```\n You can also redirect elsewhere by calling\n `this.transitionTo('elsewhere')` from within `willTransition`.\n Note that `willTransition` will not be fired for the\n redirecting `transitionTo`, since `willTransition` doesn't\n fire when there is already a transition underway. If you want\n subsequent `willTransition` actions to fire for the redirecting\n transition, you must first explicitly call\n `transition.abort()`.\n To allow the `willTransition` event to continue bubbling to the parent\n route, use `return true;`. When the `willTransition` method has a\n return value of `true` then the parent route's `willTransition` method\n will be fired, enabling \"bubbling\" behavior for the event.\n @event willTransition\n @param {Transition} transition\n @since 1.0.0\n @public\n */\n /**\n The `didTransition` action is fired after a transition has\n successfully been completed. This occurs after the normal model\n hooks (`beforeModel`, `model`, `afterModel`, `setupController`)\n have resolved. The `didTransition` action has no arguments,\n however, it can be useful for tracking page views or resetting\n state on the controller.\n ```app/routes/login.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n didTransition() {\n this.controller.get('errors.base').clear();\n return true; // Bubble the didTransition event\n }\n }\n });\n ```\n @event didTransition\n @since 1.2.0\n @public\n */\n /**\n The `loading` action is fired on the route when a route's `model`\n hook returns a promise that is not already resolved. The current\n `Transition` object is the first parameter and the route that\n triggered the loading event is the second parameter.\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n loading(transition, route) {\n let controller = this.controllerFor('foo');\n controller.set('currentlyLoading', true);\n transition.finally(function() {\n controller.set('currentlyLoading', false);\n });\n }\n }\n });\n ```\n @event loading\n @param {Transition} transition\n @param {Route} route The route that triggered the loading event\n @since 1.2.0\n @public\n */\n /**\n When attempting to transition into a route, any of the hooks\n may return a promise that rejects, at which point an `error`\n action will be fired on the partially-entered routes, allowing\n for per-route error handling logic, or shared error handling\n logic defined on a parent route.\n Here is an example of an error handler that will be invoked\n for rejected promises from the various hooks on the route,\n as well as any unhandled errors from child routes:\n ```app/routes/admin.js\n import { reject } from 'rsvp';\n import Route from '@ember/routing/route';\n export default Route.extend({\n beforeModel() {\n return reject('bad things!');\n },\n actions: {\n error(error, transition) {\n // Assuming we got here due to the error in `beforeModel`,\n // we can expect that error === \"bad things!\",\n // but a promise model rejecting would also\n // call this hook, as would any errors encountered\n // in `afterModel`.\n // The `error` hook is also provided the failed\n // `transition`, which can be stored and later\n // `.retry()`d if desired.\n this.transitionTo('login');\n }\n }\n });\n ```\n `error` actions that bubble up all the way to `ApplicationRoute`\n will fire a default error handler that logs the error. You can\n specify your own global default error handler by overriding the\n `error` handler on `ApplicationRoute`:\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n error(error, transition) {\n this.controllerFor('banner').displayError(error.message);\n }\n }\n });\n ```\n @event error\n @param {Error} error\n @param {Transition} transition\n @since 1.0.0\n @public\n */\n /**\n This event is triggered when the router enters the route. It is\n not executed when the model for the route changes.\n ```app/routes/application.js\n import { on } from '@ember/object/evented';\n import Route from '@ember/routing/route';\n export default Route.extend({\n collectAnalytics: on('activate', function(){\n collectAnalytics();\n })\n });\n ```\n @event activate\n @since 1.9.0\n @public\n */\n /**\n This event is triggered when the router completely exits this\n route. It is not executed when the model for the route changes.\n ```app/routes/index.js\n import { on } from '@ember/object/evented';\n import Route from '@ember/routing/route';\n export default Route.extend({\n trackPageLeaveAnalytics: on('deactivate', function(){\n trackPageLeaveAnalytics();\n })\n });\n ```\n @event deactivate\n @since 1.9.0\n @public\n */\n /**\n This hook is executed when the router completely exits this route. It is\n not executed when the model for the route changes.\n @method deactivate\n @since 1.0.0\n @public\n */\n deactivate() {}\n /**\n This hook is executed when the router enters the route. It is not executed\n when the model for the route changes.\n @method activate\n @since 1.0.0\n @public\n */\n activate() {}\n /**\n Transition the application into another route. The route may\n be either a single route or route path:\n ```javascript\n this.transitionTo('blogPosts');\n this.transitionTo('blogPosts.recentEntries');\n ```\n Optionally supply a model for the route in question. The model\n will be serialized into the URL using the `serialize` hook of\n the route:\n ```javascript\n this.transitionTo('blogPost', aPost);\n ```\n If a literal is passed (such as a number or a string), it will\n be treated as an identifier instead. In this case, the `model`\n hook of the route will be triggered:\n ```javascript\n this.transitionTo('blogPost', 1);\n ```\n Multiple models will be applied last to first recursively up the\n route tree.\n ```app/routes.js\n // ...\n Router.map(function() {\n this.route('blogPost', { path:':blogPostId' }, function() {\n this.route('blogComment', { path: ':blogCommentId' });\n });\n });\n export default Router;\n ```\n ```javascript\n this.transitionTo('blogComment', aPost, aComment);\n this.transitionTo('blogComment', 1, 13);\n ```\n It is also possible to pass a URL (a string that starts with a\n `/`). This is intended for testing and debugging purposes and\n should rarely be used in production code.\n ```javascript\n this.transitionTo('/');\n this.transitionTo('/blog/post/1/comment/13');\n this.transitionTo('/blog/posts?sort=title');\n ```\n An options hash with a `queryParams` property may be provided as\n the final argument to add query parameters to the destination URL.\n ```javascript\n this.transitionTo('blogPost', 1, {\n queryParams: { showComments: 'true' }\n });\n // if you just want to transition the query parameters without changing the route\n this.transitionTo({ queryParams: { sort: 'date' } });\n ```\n See also [replaceWith](#method_replaceWith).\n Simple Transition Example\n ```app/routes.js\n // ...\n Router.map(function() {\n this.route('index');\n this.route('secret');\n this.route('fourOhFour', { path: '*:' });\n });\n export default Router;\n ```\n ```app/routes/index.js\n import Route from '@ember/routing/route';\n export Route.extend({\n actions: {\n moveToSecret(context) {\n if (authorized()) {\n this.transitionTo('secret', context);\n } else {\n this.transitionTo('fourOhFour');\n }\n }\n }\n });\n ```\n Transition to a nested route\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('articles', { path: '/articles' }, function() {\n this.route('new');\n });\n });\n export default Router;\n ```\n ```app/routes/index.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n transitionToNewArticle() {\n this.transitionTo('articles.new');\n }\n }\n });\n ```\n Multiple Models Example\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('index');\n this.route('breakfast', { path: ':breakfastId' }, function() {\n this.route('cereal', { path: ':cerealId' });\n });\n });\n export default Router;\n ```\n ```app/routes/index.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n moveToChocolateCereal() {\n let cereal = { cerealId: 'ChocolateYumminess' };\n let breakfast = { breakfastId: 'CerealAndMilk' };\n this.transitionTo('breakfast.cereal', breakfast, cereal);\n }\n }\n });\n ```\n Nested Route with Query String Example\n ```app/routes.js\n // ...\n Router.map(function() {\n this.route('fruits', function() {\n this.route('apples');\n });\n });\n export default Router;\n ```\n ```app/routes/index.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n transitionToApples() {\n this.transitionTo('fruits.apples', { queryParams: { color: 'red' } });\n }\n }\n });\n ```\n @method transitionTo\n @param {String} name the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {Transition} the transition object associated with this\n attempted transition\n @since 1.0.0\n @public\n */\n transitionTo(...args) {\n // eslint-disable-line no-unused-vars\n return this._router.transitionTo(...(0, _utils.prefixRouteNameArg)(this, args));\n }\n /**\n Perform a synchronous transition into another route without attempting\n to resolve promises, update the URL, or abort any currently active\n asynchronous transitions (i.e. regular transitions caused by\n `transitionTo` or URL changes).\n This method is handy for performing intermediate transitions on the\n way to a final destination route, and is called internally by the\n default implementations of the `error` and `loading` handlers.\n @method intermediateTransitionTo\n @param {String} name the name of the route\n @param {...Object} models the model(s) to be used while transitioning\n to the route.\n @since 1.2.0\n @public\n */\n intermediateTransitionTo(...args) {\n let [name, ...preparedArgs] = (0, _utils.prefixRouteNameArg)(this, args);\n this._router.intermediateTransitionTo(name, ...preparedArgs);\n }\n /**\n Refresh the model on this route and any child routes, firing the\n `beforeModel`, `model`, and `afterModel` hooks in a similar fashion\n to how routes are entered when transitioning in from other route.\n The current route params (e.g. `article_id`) will be passed in\n to the respective model hooks, and if a different model is returned,\n `setupController` and associated route hooks will re-fire as well.\n An example usage of this method is re-querying the server for the\n latest information using the same parameters as when the route\n was first entered.\n Note that this will cause `model` hooks to fire even on routes\n that were provided a model object when the route was initially\n entered.\n @method refresh\n @return {Transition} the transition object associated with this\n attempted transition\n @since 1.4.0\n @public\n */\n refresh() {\n return this._router._routerMicrolib.refresh(this);\n }\n /**\n Transition into another route while replacing the current URL, if possible.\n This will replace the current history entry instead of adding a new one.\n Beside that, it is identical to `transitionTo` in all other respects. See\n 'transitionTo' for additional information regarding multiple models.\n Example\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('index');\n this.route('secret');\n });\n export default Router;\n ```\n ```app/routes/secret.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n afterModel() {\n if (!authorized()){\n this.replaceWith('index');\n }\n }\n });\n ```\n @method replaceWith\n @param {String} name the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {Transition} the transition object associated with this\n attempted transition\n @since 1.0.0\n @public\n */\n replaceWith(...args) {\n return this._router.replaceWith(...(0, _utils.prefixRouteNameArg)(this, args));\n }\n /**\n This hook is the entry point for router.js\n @private\n @method setup\n */\n setup(context, transition) {\n let controller;\n let controllerName = this.controllerName || this.routeName;\n let definedController = this.controllerFor(controllerName, true);\n if (definedController) {\n controller = definedController;\n } else {\n controller = this.generateController(controllerName);\n }\n // Assign the route's controller so that it can more easily be\n // referenced in action handlers. Side effects. Side effects everywhere.\n if (!this.controller) {\n let qp = (0, _metal.get)(this, '_qp');\n let propNames = qp !== undefined ? (0, _metal.get)(qp, 'propertyNames') : [];\n addQueryParamsObservers(controller, propNames);\n this.controller = controller;\n }\n let queryParams = (0, _metal.get)(this, '_qp');\n let states = queryParams.states;\n controller._qpDelegate = states.allowOverrides;\n if (transition) {\n // Update the model dep values used to calculate cache keys.\n (0, _utils.stashParamNames)(this._router, transition[_router_js.STATE_SYMBOL].routeInfos);\n let cache = this._bucketCache;\n let params = transition[_router_js.PARAMS_SYMBOL];\n let allParams = queryParams.propertyNames;\n allParams.forEach(prop => {\n let aQp = queryParams.map[prop];\n aQp.values = params;\n let cacheKey = (0, _utils.calculateCacheKey)(aQp.route.fullRouteName, aQp.parts, aQp.values);\n let value = cache.lookup(cacheKey, prop, aQp.undecoratedDefaultValue);\n (0, _metal.set)(controller, prop, value);\n });\n let qpValues = getQueryParamsFor(this, transition[_router_js.STATE_SYMBOL]);\n (0, _metal.setProperties)(controller, qpValues);\n }\n this.setupController(controller, context, transition);\n if (this._environment.options.shouldRender) {\n this.renderTemplate(controller, context);\n }\n }\n /*\n Called when a query parameter for this route changes, regardless of whether the route\n is currently part of the active route hierarchy. This will update the query parameter's\n value in the cache so if this route becomes active, the cache value has been updated.\n */\n _qpChanged(prop, value, qp) {\n if (!qp) {\n return;\n }\n // Update model-dep cache\n let cache = this._bucketCache;\n let cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, qp.values);\n cache.stash(cacheKey, prop, value);\n }\n /**\n This hook is the first of the route entry validation hooks\n called when an attempt is made to transition into a route\n or one of its children. It is called before `model` and\n `afterModel`, and is appropriate for cases when:\n 1) A decision can be made to redirect elsewhere without\n needing to resolve the model first.\n 2) Any async operations need to occur first before the\n model is attempted to be resolved.\n This hook is provided the current `transition` attempt\n as a parameter, which can be used to `.abort()` the transition,\n save it for a later `.retry()`, or retrieve values set\n on it from a previous hook. You can also just call\n `this.transitionTo` to another route to implicitly\n abort the `transition`.\n You can return a promise from this hook to pause the\n transition until the promise resolves (or rejects). This could\n be useful, for instance, for retrieving async code from\n the server that is required to enter a route.\n @method beforeModel\n @param {Transition} transition\n @return {any | Promise} if the value returned from this hook is\n a promise, the transition will pause until the transition\n resolves. Otherwise, non-promise return values are not\n utilized in any way.\n @since 1.0.0\n @public\n */\n beforeModel() {}\n /**\n This hook is called after this route's model has resolved.\n It follows identical async/promise semantics to `beforeModel`\n but is provided the route's resolved model in addition to\n the `transition`, and is therefore suited to performing\n logic that can only take place after the model has already\n resolved.\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n afterModel(posts, transition) {\n if (posts.get('length') === 1) {\n this.transitionTo('post.show', posts.get('firstObject'));\n }\n }\n });\n ```\n Refer to documentation for `beforeModel` for a description\n of transition-pausing semantics when a promise is returned\n from this hook.\n @method afterModel\n @param {Object} resolvedModel the value returned from `model`,\n or its resolved value if it was a promise\n @param {Transition} transition\n @return {any | Promise} if the value returned from this hook is\n a promise, the transition will pause until the transition\n resolves. Otherwise, non-promise return values are not\n utilized in any way.\n @since 1.0.0\n @public\n */\n afterModel() {}\n /**\n A hook you can implement to optionally redirect to another route.\n If you call `this.transitionTo` from inside of this hook, this route\n will not be entered in favor of the other hook.\n `redirect` and `afterModel` behave very similarly and are\n called almost at the same time, but they have an important\n distinction in the case that, from one of these hooks, a\n redirect into a child route of this route occurs: redirects\n from `afterModel` essentially invalidate the current attempt\n to enter this route, and will result in this route's `beforeModel`,\n `model`, and `afterModel` hooks being fired again within\n the new, redirecting transition. Redirects that occur within\n the `redirect` hook, on the other hand, will _not_ cause\n these hooks to be fired again the second time around; in\n other words, by the time the `redirect` hook has been called,\n both the resolved model and attempted entry into this route\n are considered to be fully validated.\n @method redirect\n @param {Object} model the model for this route\n @param {Transition} transition the transition object associated with the current transition\n @since 1.0.0\n @public\n */\n redirect() {}\n /**\n Called when the context is changed by router.js.\n @private\n @method contextDidChange\n */\n contextDidChange() {\n this.currentModel = this.context;\n }\n /**\n A hook you can implement to convert the URL into the model for\n this route.\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('post', { path: '/posts/:post_id' });\n });\n export default Router;\n ```\n The model for the `post` route is `store.findRecord('post', params.post_id)`.\n By default, if your route has a dynamic segment ending in `_id`:\n * The model class is determined from the segment (`post_id`'s\n class is `App.Post`)\n * The find method is called on the model class with the value of\n the dynamic segment.\n Note that for routes with dynamic segments, this hook is not always\n executed. If the route is entered through a transition (e.g. when\n using the `link-to` Handlebars helper or the `transitionTo` method\n of routes), and a model context is already provided this hook\n is not called.\n A model context does not include a primitive string or number,\n which does cause the model hook to be called.\n Routes without dynamic segments will always execute the model hook.\n ```javascript\n // no dynamic segment, model hook always called\n this.transitionTo('posts');\n // model passed in, so model hook not called\n thePost = store.findRecord('post', 1);\n this.transitionTo('post', thePost);\n // integer passed in, model hook is called\n this.transitionTo('post', 1);\n // model id passed in, model hook is called\n // useful for forcing the hook to execute\n thePost = store.findRecord('post', 1);\n this.transitionTo('post', thePost.id);\n ```\n This hook follows the asynchronous/promise semantics\n described in the documentation for `beforeModel`. In particular,\n if a promise returned from `model` fails, the error will be\n handled by the `error` hook on `Route`.\n Example\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id);\n }\n });\n ```\n @method model\n @param {Object} params the parameters extracted from the URL\n @param {Transition} transition\n @return {any | Promise} the model for this route. If\n a promise is returned, the transition will pause until\n the promise resolves, and the resolved value of the promise\n will be used as the model for this route.\n @since 1.0.0\n @public\n */\n model(params, transition) {\n let name, sawParams, value;\n let queryParams = (0, _metal.get)(this, '_qp.map');\n for (let prop in params) {\n if (prop === 'queryParams' || queryParams && prop in queryParams) {\n continue;\n }\n let match = prop.match(/^(.*)_id$/);\n if (match !== null) {\n name = match[1];\n value = params[prop];\n }\n sawParams = true;\n }\n if (!name) {\n if (sawParams) {\n return Object.assign({}, params);\n } else {\n if (transition.resolveIndex < 1) {\n return;\n }\n return transition[_router_js.STATE_SYMBOL].routeInfos[transition.resolveIndex - 1].context;\n }\n }\n return this.findModel(name, value);\n }\n /**\n @private\n @method deserialize\n @param {Object} params the parameters extracted from the URL\n @param {Transition} transition\n @return {any | Promise} the model for this route.\n Router.js hook.\n */\n deserialize(_params, transition) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n return this.model(this._paramsFor(this.routeName, _params), transition);\n }\n return this.model(this.paramsFor(this.routeName), transition);\n }\n /**\n @method findModel\n @param {String} type the model type\n @param {Object} value the value passed to find\n @private\n */\n findModel(...args) {\n return (0, _metal.get)(this, 'store').find(...args);\n }\n /**\n A hook you can use to setup the controller for the current route.\n This method is called with the controller for the current route and the\n model supplied by the `model` hook.\n By default, the `setupController` hook sets the `model` property of\n the controller to the specified `model` when it is not `undefined`.\n If you implement the `setupController` hook in your Route, it will\n prevent this default behavior. If you want to preserve that behavior\n when implementing your `setupController` function, make sure to call\n `_super`:\n ```app/routes/photos.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model() {\n return this.store.findAll('photo');\n },\n setupController(controller, model) {\n // Call _super for default behavior\n this._super(controller, model);\n // Implement your custom setup after\n this.controllerFor('application').set('showingPhotos', true);\n }\n });\n ```\n The provided controller will be one resolved based on the name\n of this route.\n If no explicit controller is defined, Ember will automatically create one.\n As an example, consider the router:\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('post', { path: '/posts/:post_id' });\n });\n export default Router;\n ```\n For the `post` route, a controller named `App.PostController` would\n be used if it is defined. If it is not defined, a basic `Controller`\n instance would be used.\n Example\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n setupController(controller, model) {\n controller.set('model', model);\n }\n });\n ```\n @method setupController\n @param {Controller} controller instance\n @param {Object} model\n @since 1.0.0\n @public\n */\n setupController(controller, context, _transition) {\n // eslint-disable-line no-unused-vars\n if (controller && context !== undefined) {\n (0, _metal.set)(controller, 'model', context);\n }\n }\n /**\n Returns the controller of the current route, or a parent (or any ancestor)\n route in a route hierarchy.\n The controller instance must already have been created, either through entering the\n associated route or using `generateController`.\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n setupController(controller, post) {\n this._super(controller, post);\n this.controllerFor('posts').set('currentPost', post);\n }\n });\n ```\n @method controllerFor\n @param {String} name the name of the route or controller\n @return {Controller}\n @since 1.0.0\n @public\n */\n controllerFor(name, _skipAssert) {\n let owner = (0, _owner.getOwner)(this);\n let route = owner.lookup(`route:${name}`);\n let controller;\n if (route && route.controllerName) {\n name = route.controllerName;\n }\n controller = owner.lookup(`controller:${name}`);\n // NOTE: We're specifically checking that skipAssert is true, because according\n // to the old API the second parameter was model. We do not want people who\n // passed a model to skip the assertion.\n (0, _debug.assert)(`The controller named '${name}' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.`, !!controller || _skipAssert === true);\n return controller;\n }\n /**\n Generates a controller for a route.\n Example\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n setupController(controller, post) {\n this._super(controller, post);\n this.generateController('posts');\n }\n });\n ```\n @method generateController\n @param {String} name the name of the controller\n @private\n */\n generateController(name) {\n let owner = (0, _owner.getOwner)(this);\n return (0, _generate_controller.default)(owner, name);\n }\n /**\n Returns the resolved model of a parent (or any ancestor) route\n in a route hierarchy. During a transition, all routes\n must resolve a model object, and if a route\n needs access to a parent route's model in order to\n resolve a model (or just reuse the model from a parent),\n it can call `this.modelFor(theNameOfParentRoute)` to\n retrieve it. If the ancestor route's model was a promise,\n its resolved result is returned.\n Example\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('post', { path: '/posts/:post_id' }, function() {\n this.route('comments');\n });\n });\n export default Router;\n ```\n ```app/routes/post/comments.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model() {\n let post = this.modelFor('post');\n return post.get('comments');\n }\n });\n ```\n @method modelFor\n @param {String} name the name of the route\n @return {Object} the model object\n @since 1.0.0\n @public\n */\n modelFor(_name) {\n let name;\n let owner = (0, _owner.getOwner)(this);\n let transition = this._router && this._router._routerMicrolib ? this._router._routerMicrolib.activeTransition : undefined;\n // Only change the route name when there is an active transition.\n // Otherwise, use the passed in route name.\n if (owner.routable && transition !== undefined) {\n name = getEngineRouteName(owner, _name);\n } else {\n name = _name;\n }\n let route = owner.lookup(`route:${name}`);\n // If we are mid-transition, we want to try and look up\n // resolved parent contexts on the current transitionEvent.\n if (transition !== undefined && transition !== null) {\n let modelLookupName = route && route.routeName || name;\n if (transition.resolvedModels.hasOwnProperty(modelLookupName)) {\n return transition.resolvedModels[modelLookupName];\n }\n }\n return route && route.currentModel;\n }\n /**\n A hook you can use to render the template for the current route.\n This method is called with the controller for the current route and the\n model supplied by the `model` hook. By default, it renders the route's\n template, configured with the controller for the route.\n This method can be overridden to set up and render additional or\n alternative templates.\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n renderTemplate(controller, model) {\n let favController = this.controllerFor('favoritePost');\n // Render the `favoritePost` template into\n // the outlet `posts`, and display the `favoritePost`\n // controller.\n this.render('favoritePost', {\n outlet: 'posts',\n controller: favController\n });\n }\n });\n ```\n @method renderTemplate\n @param {Object} controller the route's controller\n @param {Object} model the route's model\n @since 1.0.0\n @public\n */\n renderTemplate(_controller, _model) {\n // eslint-disable-line no-unused-vars\n this.render();\n }\n /**\n `render` is used to render a template into a region of another template\n (indicated by an `{{outlet}}`). `render` is used both during the entry\n phase of routing (via the `renderTemplate` hook) and later in response to\n user interaction.\n For example, given the following minimal router and templates:\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('photos');\n });\n export default Router;\n ```\n ```handlebars\n \n
    \n {{outlet \"anOutletName\"}}\n
    \n ```\n ```handlebars\n \n

    Photos

    \n ```\n You can render `photos.hbs` into the `\"anOutletName\"` outlet of\n `application.hbs` by calling `render`:\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n renderTemplate() {\n this.render('photos', {\n into: 'application',\n outlet: 'anOutletName'\n })\n }\n });\n ```\n `render` additionally allows you to supply which `controller` and\n `model` objects should be loaded and associated with the rendered template.\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n renderTemplate(controller, model){\n this.render('posts', { // the template to render, referenced by name\n into: 'application', // the template to render into, referenced by name\n outlet: 'anOutletName', // the outlet inside `options.into` to render into.\n controller: 'someControllerName', // the controller to use for this template, referenced by name\n model: model // the model to set on `options.controller`.\n })\n }\n });\n ```\n The string values provided for the template name, and controller\n will eventually pass through to the resolver for lookup. See\n Resolver for how these are mapped to JavaScript objects in your\n application. The template to render into needs to be related to either the\n current route or one of its ancestors.\n Not all options need to be passed to `render`. Default values will be used\n based on the name of the route specified in the router or the Route's\n `controllerName` and `templateName` properties.\n For example:\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('index');\n this.route('post', { path: '/posts/:post_id' });\n });\n export default Router;\n ```\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n renderTemplate() {\n this.render(); // all defaults apply\n }\n });\n ```\n The name of the route, defined by the router, is `post`.\n The following equivalent default options will be applied when\n the Route calls `render`:\n ```javascript\n this.render('post', { // the template name associated with 'post' Route\n into: 'application', // the parent route to 'post' Route\n outlet: 'main', // {{outlet}} and {{outlet 'main'}} are synonymous,\n controller: 'post', // the controller associated with the 'post' Route\n })\n ```\n By default the controller's `model` will be the route's model, so it does not\n need to be passed unless you wish to change which model is being used.\n @method render\n @param {String} name the name of the template to render\n @param {Object} [options] the options\n @param {String} [options.into] the template to render into,\n referenced by name. Defaults to the parent template\n @param {String} [options.outlet] the outlet inside `options.into` to render into.\n Defaults to 'main'\n @param {String|Object} [options.controller] the controller to use for this template,\n referenced by name or as a controller instance. Defaults to the Route's paired controller\n @param {Object} [options.model] the model object to set on `options.controller`.\n Defaults to the return value of the Route's model hook\n @since 1.0.0\n @public\n */\n render(_name, options) {\n let name;\n let isDefaultRender = arguments.length === 0;\n if (!isDefaultRender) {\n if (typeof _name === 'object' && !options) {\n name = this.templateName || this.routeName;\n options = _name;\n } else {\n (0, _debug.assert)('The name in the given arguments is undefined or empty string', !(0, _metal.isEmpty)(_name));\n name = _name;\n }\n }\n let renderOptions = buildRenderOptions(this, isDefaultRender, name, options);\n this.connections.push(renderOptions);\n (0, _runloop.once)(this._router, '_setOutlets');\n }\n /**\n Disconnects a view that has been rendered into an outlet.\n You may pass any or all of the following options to `disconnectOutlet`:\n * `outlet`: the name of the outlet to clear (default: 'main')\n * `parentView`: the name of the view containing the outlet to clear\n (default: the view rendered by the parent route)\n Example:\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n showModal(evt) {\n this.render(evt.modalName, {\n outlet: 'modal',\n into: 'application'\n });\n },\n hideModal(evt) {\n this.disconnectOutlet({\n outlet: 'modal',\n parentView: 'application'\n });\n }\n }\n });\n ```\n Alternatively, you can pass the `outlet` name directly as a string.\n Example:\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n showModal(evt) {\n // ...\n },\n hideModal(evt) {\n this.disconnectOutlet('modal');\n }\n }\n });\n ```\n @method disconnectOutlet\n @param {Object|String} options the options hash or outlet name\n @since 1.0.0\n @public\n */\n disconnectOutlet(options) {\n let outletName;\n let parentView;\n if (options) {\n if (typeof options === 'string') {\n outletName = options;\n } else {\n outletName = options.outlet;\n parentView = options.parentView ? options.parentView.replace(/\\//g, '.') : undefined;\n (0, _debug.assert)('You passed undefined as the outlet name.', !('outlet' in options && options.outlet === undefined));\n }\n }\n outletName = outletName || 'main';\n this._disconnectOutlet(outletName, parentView);\n let routeInfos = this._router._routerMicrolib.currentRouteInfos;\n for (let i = 0; i < routeInfos.length; i++) {\n // This non-local state munging is sadly necessary to maintain\n // backward compatibility with our existing semantics, which allow\n // any route to disconnectOutlet things originally rendered by any\n // other route. This should all get cut in 2.0.\n routeInfos[i].route._disconnectOutlet(outletName, parentView);\n }\n }\n _disconnectOutlet(outletName, parentView) {\n let parent = parentRoute(this);\n if (parent && parentView === parent.routeName) {\n parentView = undefined;\n }\n for (let i = 0; i < this.connections.length; i++) {\n let connection = this.connections[i];\n if (connection.outlet === outletName && connection.into === parentView) {\n // This neuters the disconnected outlet such that it doesn't\n // render anything, but it leaves an entry in the outlet\n // hierarchy so that any existing other renders that target it\n // don't suddenly blow up. They will still stick themselves\n // into its outlets, which won't render anywhere. All of this\n // statefulness should get the machete in 2.0.\n this.connections[i] = {\n owner: connection.owner,\n into: connection.into,\n outlet: connection.outlet,\n name: connection.name,\n controller: undefined,\n template: undefined\n };\n (0, _runloop.once)(this._router, '_setOutlets');\n }\n }\n }\n willDestroy() {\n this.teardownViews();\n }\n /**\n @private\n @method teardownViews\n */\n teardownViews() {\n if (this.connections && this.connections.length > 0) {\n this.connections = [];\n (0, _runloop.once)(this._router, '_setOutlets');\n }\n }\n }\n Route.reopenClass({\n isRouteFactory: true\n });\n function parentRoute(route) {\n let routeInfo = routeInfoFor(route, route._router._routerMicrolib.state.routeInfos, -1);\n return routeInfo && routeInfo.route;\n }\n function routeInfoFor(route, routeInfos, offset = 0) {\n if (!routeInfos) {\n return;\n }\n let current;\n for (let i = 0; i < routeInfos.length; i++) {\n current = routeInfos[i].route;\n if (current === route) {\n return routeInfos[i + offset];\n }\n }\n return;\n }\n function buildRenderOptions(route, isDefaultRender, _name, options) {\n (0, _debug.assert)('You passed undefined as the outlet name.', isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined));\n let owner = (0, _owner.getOwner)(route);\n let name, templateName, into, outlet, controller, model;\n if (options) {\n into = options.into && options.into.replace(/\\//g, '.');\n outlet = options.outlet;\n controller = options.controller;\n model = options.model;\n }\n outlet = outlet || 'main';\n if (isDefaultRender) {\n name = route.routeName;\n templateName = route.templateName || name;\n } else {\n name = _name.replace(/\\//g, '.');\n templateName = name;\n }\n if (!controller) {\n if (isDefaultRender) {\n controller = route.controllerName || owner.lookup(`controller:${name}`);\n } else {\n controller = owner.lookup(`controller:${name}`) || route.controllerName || route.routeName;\n }\n }\n if (typeof controller === 'string') {\n let controllerName = controller;\n controller = owner.lookup(`controller:${controllerName}`);\n (0, _debug.assert)(`You passed \\`controller: '${controllerName}'\\` into the \\`render\\` method, but no such controller could be found.`, isDefaultRender || !!controller);\n }\n if (model) {\n controller.set('model', model);\n }\n let template = owner.lookup(`template:${templateName}`);\n (0, _debug.assert)(`Could not find \"${templateName}\" template, view, or component.`, isDefaultRender || !!template);\n let parent;\n if (into && (parent = parentRoute(route)) && into === parent.routeName) {\n into = undefined;\n }\n let renderOptions = {\n owner,\n into,\n outlet,\n name,\n controller: controller,\n template: template || route._topLevelViewTemplate\n };\n if (_env.DEBUG) {\n let LOG_VIEW_LOOKUPS = (0, _metal.get)(route._router, 'namespace.LOG_VIEW_LOOKUPS');\n if (LOG_VIEW_LOOKUPS && !template) {\n (0, _debug.info)(`Could not find \"${name}\" template. Nothing will be rendered`, {\n fullName: `template:${name}`\n });\n }\n }\n return renderOptions;\n }\n function getFullQueryParams(router, state) {\n if (state['fullQueryParams']) {\n return state['fullQueryParams'];\n }\n state['fullQueryParams'] = {};\n (0, _polyfills.assign)(state['fullQueryParams'], state.queryParams);\n router._deserializeQueryParams(state.routeInfos, state['fullQueryParams']);\n return state['fullQueryParams'];\n }\n function getQueryParamsFor(route, state) {\n state['queryParamsFor'] = state['queryParamsFor'] || {};\n let name = route.fullRouteName;\n if (state['queryParamsFor'][name]) {\n return state['queryParamsFor'][name];\n }\n let fullQueryParams = getFullQueryParams(route._router, state);\n let params = state['queryParamsFor'][name] = {};\n // Copy over all the query params for this route/controller into params hash.\n let qpMeta = (0, _metal.get)(route, '_qp');\n let qps = qpMeta.qps;\n for (let i = 0; i < qps.length; ++i) {\n // Put deserialized qp on params hash.\n let qp = qps[i];\n let qpValueWasPassedIn = qp.prop in fullQueryParams;\n params[qp.prop] = qpValueWasPassedIn ? fullQueryParams[qp.prop] : copyDefaultValue(qp.defaultValue);\n }\n return params;\n }\n function copyDefaultValue(value) {\n if (Array.isArray(value)) {\n return (0, _runtime.A)(value.slice());\n }\n return value;\n }\n /*\n Merges all query parameters from a controller with those from\n a route, returning a new object and avoiding any mutations to\n the existing objects.\n */\n function mergeEachQueryParams(controllerQP, routeQP) {\n let qps = {};\n let keysAlreadyMergedOrSkippable = {\n defaultValue: true,\n type: true,\n scope: true,\n as: true\n };\n // first loop over all controller qps, merging them with any matching route qps\n // into a new empty object to avoid mutating.\n for (let cqpName in controllerQP) {\n if (!controllerQP.hasOwnProperty(cqpName)) {\n continue;\n }\n let newControllerParameterConfiguration = {};\n (0, _polyfills.assign)(newControllerParameterConfiguration, controllerQP[cqpName], routeQP[cqpName]);\n qps[cqpName] = newControllerParameterConfiguration;\n // allows us to skip this QP when we check route QPs.\n keysAlreadyMergedOrSkippable[cqpName] = true;\n }\n // loop over all route qps, skipping those that were merged in the first pass\n // because they also appear in controller qps\n for (let rqpName in routeQP) {\n if (!routeQP.hasOwnProperty(rqpName) || keysAlreadyMergedOrSkippable[rqpName]) {\n continue;\n }\n let newRouteParameterConfiguration = {};\n (0, _polyfills.assign)(newRouteParameterConfiguration, routeQP[rqpName], controllerQP[rqpName]);\n qps[rqpName] = newRouteParameterConfiguration;\n }\n return qps;\n }\n function addQueryParamsObservers(controller, propNames) {\n propNames.forEach(prop => {\n controller.addObserver(`${prop}.[]`, controller, controller._qpChanged);\n });\n }\n function getEngineRouteName(engine, routeName) {\n if (engine.routable) {\n let prefix = engine.mountPoint;\n if (routeName === 'application') {\n return prefix;\n } else {\n return `${prefix}.${routeName}`;\n }\n }\n return routeName;\n }\n /**\n A hook you can implement to convert the route's model into parameters\n for the URL.\n \n ```app/router.js\n // ...\n \n Router.map(function() {\n this.route('post', { path: '/posts/:post_id' });\n });\n \n ```\n \n ```app/routes/post.js\n import $ from 'jquery';\n import Route from '@ember/routing/route';\n \n export default Route.extend({\n model(params) {\n // the server returns `{ id: 12 }`\n return $.getJSON('/posts/' + params.post_id);\n },\n \n serialize(model) {\n // this will make the URL `/posts/12`\n return { post_id: model.id };\n }\n });\n ```\n \n The default `serialize` method will insert the model's `id` into the\n route's dynamic segment (in this case, `:post_id`) if the segment contains '_id'.\n If the route has multiple dynamic segments or does not contain '_id', `serialize`\n will return `getProperties(model, params)`\n \n This method is called when `transitionTo` is called with a context\n in order to populate the URL.\n \n @method serialize\n @param {Object} model the routes model\n @param {Array} params an Array of parameter names for the current\n route (in the example, `['post_id']`.\n @return {Object} the serialized parameters\n @since 1.0.0\n @public\n */\n Route.prototype.serialize = defaultSerialize;\n Route.reopen(_runtime.ActionHandler, _runtime.Evented, {\n mergedProperties: ['queryParams'],\n /**\n Configuration hash for this route's queryParams. The possible\n configuration options and their defaults are as follows\n (assuming a query param whose controller property is `page`):\n ```javascript\n queryParams: {\n page: {\n // By default, controller query param properties don't\n // cause a full transition when they are changed, but\n // rather only cause the URL to update. Setting\n // `refreshModel` to true will cause an \"in-place\"\n // transition to occur, whereby the model hooks for\n // this route (and any child routes) will re-fire, allowing\n // you to reload models (e.g., from the server) using the\n // updated query param values.\n refreshModel: false,\n // By default, changes to controller query param properties\n // cause the URL to update via `pushState`, which means an\n // item will be added to the browser's history, allowing\n // you to use the back button to restore the app to the\n // previous state before the query param property was changed.\n // Setting `replace` to true will use `replaceState` (or its\n // hash location equivalent), which causes no browser history\n // item to be added. This options name and default value are\n // the same as the `link-to` helper's `replace` option.\n replace: false,\n // By default, the query param URL key is the same name as\n // the controller property name. Use `as` to specify a\n // different URL key.\n as: 'page'\n }\n }\n ```\n @property queryParams\n @for Route\n @type Object\n @since 1.6.0\n @public\n */\n queryParams: {},\n /**\n The name of the template to use by default when rendering this routes\n template.\n ```app/routes/posts/list.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n templateName: 'posts/list'\n });\n ```\n ```app/routes/posts/index.js\n import PostsList from '../posts/list';\n export default PostsList.extend();\n ```\n ```app/routes/posts/archived.js\n import PostsList from '../posts/list';\n export default PostsList.extend();\n ```\n @property templateName\n @type String\n @default null\n @since 1.4.0\n @public\n */\n templateName: null,\n /**\n @private\n @property _names\n */\n _names: null,\n /**\n The name of the controller to associate with this route.\n By default, Ember will lookup a route's controller that matches the name\n of the route (i.e. `posts.new`). However,\n if you would like to define a specific controller to use, you can do so\n using this property.\n This is useful in many ways, as the controller specified will be:\n * passed to the `setupController` method.\n * used as the controller for the template being rendered by the route.\n * returned from a call to `controllerFor` for the route.\n @property controllerName\n @type String\n @default null\n @since 1.4.0\n @public\n */\n controllerName: null,\n /**\n Store property provides a hook for data persistence libraries to inject themselves.\n By default, this store property provides the exact same functionality previously\n in the model hook.\n Currently, the required interface is:\n `store.find(modelName, findArguments)`\n @method store\n @param {Object} store\n @private\n */\n store: (0, _metal.computed)(function () {\n let owner = (0, _owner.getOwner)(this);\n let routeName = this.routeName;\n let namespace = (0, _metal.get)(this, '_router.namespace');\n return {\n find(name, value) {\n let modelClass = owner.factoryFor(`model:${name}`);\n (0, _debug.assert)(`You used the dynamic segment ${name}_id in your route ${routeName}, but ${namespace}.${(0, _string.classify)(name)} did not exist and you did not override your route's \\`model\\` hook.`, !!modelClass);\n if (!modelClass) {\n return;\n }\n modelClass = modelClass.class;\n (0, _debug.assert)(`${(0, _string.classify)(name)} has no method \\`find\\`.`, typeof modelClass.find === 'function');\n return modelClass.find(value);\n }\n };\n }),\n router: _deprecatedFeatures.ROUTER_ROUTER ? (0, _metal.computed)('_router', function () {\n (0, _debug.deprecate)('Route#router is an intimate API that has been renamed to Route#_router. However you might want to consider using the router service', false, {\n id: 'ember-routing.route-router',\n until: '3.5.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_ember-routing-route-router'\n });\n return this._router;\n }) : undefined,\n /**\n @private\n @property _qp\n */\n _qp: (0, _metal.computed)(function () {\n let combinedQueryParameterConfiguration;\n let controllerName = this.controllerName || this.routeName;\n let owner = (0, _owner.getOwner)(this);\n let controller = owner.lookup(`controller:${controllerName}`);\n let queryParameterConfiguraton = (0, _metal.get)(this, 'queryParams');\n let hasRouterDefinedQueryParams = Object.keys(queryParameterConfiguraton).length > 0;\n if (controller) {\n // the developer has authored a controller class in their application for\n // this route find its query params and normalize their object shape them\n // merge in the query params for the route. As a mergedProperty,\n // Route#queryParams is always at least `{}`\n let controllerDefinedQueryParameterConfiguration = (0, _metal.get)(controller, 'queryParams') || {};\n let normalizedControllerQueryParameterConfiguration = (0, _utils.normalizeControllerQueryParams)(controllerDefinedQueryParameterConfiguration);\n combinedQueryParameterConfiguration = mergeEachQueryParams(normalizedControllerQueryParameterConfiguration, queryParameterConfiguraton);\n } else if (hasRouterDefinedQueryParams) {\n // the developer has not defined a controller but *has* supplied route query params.\n // Generate a class for them so we can later insert default values\n controller = (0, _generate_controller.default)(owner, controllerName);\n combinedQueryParameterConfiguration = queryParameterConfiguraton;\n }\n let qps = [];\n let map = {};\n let propertyNames = [];\n for (let propName in combinedQueryParameterConfiguration) {\n if (!combinedQueryParameterConfiguration.hasOwnProperty(propName)) {\n continue;\n }\n // to support the dubious feature of using unknownProperty\n // on queryParams configuration\n if (propName === 'unknownProperty' || propName === '_super') {\n // possible todo: issue deprecation warning?\n continue;\n }\n let desc = combinedQueryParameterConfiguration[propName];\n let scope = desc.scope || 'model';\n let parts;\n if (scope === 'controller') {\n parts = [];\n }\n let urlKey = desc.as || this.serializeQueryParamKey(propName);\n let defaultValue = (0, _metal.get)(controller, propName);\n if (Array.isArray(defaultValue)) {\n defaultValue = (0, _runtime.A)(defaultValue.slice());\n }\n let type = desc.type || (0, _runtime.typeOf)(defaultValue);\n let defaultValueSerialized = this.serializeQueryParam(defaultValue, urlKey, type);\n let scopedPropertyName = `${controllerName}:${propName}`;\n let qp = {\n undecoratedDefaultValue: (0, _metal.get)(controller, propName),\n defaultValue,\n serializedDefaultValue: defaultValueSerialized,\n serializedValue: defaultValueSerialized,\n type,\n urlKey,\n prop: propName,\n scopedPropertyName,\n controllerName,\n route: this,\n parts,\n values: null,\n scope\n };\n map[propName] = map[urlKey] = map[scopedPropertyName] = qp;\n qps.push(qp);\n propertyNames.push(propName);\n }\n return {\n qps,\n map,\n propertyNames,\n states: {\n /*\n Called when a query parameter changes in the URL, this route cares\n about that query parameter, but the route is not currently\n in the active route hierarchy.\n */\n inactive: (prop, value) => {\n let qp = map[prop];\n this._qpChanged(prop, value, qp);\n },\n /*\n Called when a query parameter changes in the URL, this route cares\n about that query parameter, and the route is currently\n in the active route hierarchy.\n */\n active: (prop, value) => {\n let qp = map[prop];\n this._qpChanged(prop, value, qp);\n return this._activeQPChanged(qp, value);\n },\n /*\n Called when a value of a query parameter this route handles changes in a controller\n and the route is currently in the active route hierarchy.\n */\n allowOverrides: (prop, value) => {\n let qp = map[prop];\n this._qpChanged(prop, value, qp);\n return this._updatingQPChanged(qp);\n }\n }\n };\n }),\n /**\n Sends an action to the router, which will delegate it to the currently\n active route hierarchy per the bubbling rules explained under `actions`.\n Example\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('index');\n });\n export default Router;\n ```\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n track(arg) {\n console.log(arg, 'was clicked');\n }\n }\n });\n ```\n ```app/routes/index.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n trackIfDebug(arg) {\n if (debug) {\n this.send('track', arg);\n }\n }\n }\n });\n ```\n @method send\n @param {String} name the name of the action to trigger\n @param {...*} args\n @since 1.0.0\n @public\n */\n send(...args) {\n (0, _debug.assert)(`Attempted to call .send() with the action '${args[0]}' on the destroyed route '${this.routeName}'.`, !this.isDestroying && !this.isDestroyed);\n if (this._router && this._router._routerMicrolib || !(0, _debug.isTesting)()) {\n this._router.send(...args);\n } else {\n let name = args.shift();\n let action = this.actions[name];\n if (action) {\n return action.apply(this, args);\n }\n }\n },\n /**\n The controller associated with this route.\n Example\n ```app/routes/form.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n willTransition(transition) {\n if (this.controller.get('userHasEnteredData') &&\n !confirm('Are you sure you want to abandon progress?')) {\n transition.abort();\n } else {\n // Bubble the `willTransition` action so that\n // parent routes can decide whether or not to abort.\n return true;\n }\n }\n }\n });\n ```\n @property controller\n @type Controller\n @since 1.6.0\n @public\n */\n actions: {\n /**\n This action is called when one or more query params have changed. Bubbles.\n @method queryParamsDidChange\n @param changed {Object} Keys are names of query params that have changed.\n @param totalPresent {Object} Keys are names of query params that are currently set.\n @param removed {Object} Keys are names of query params that have been removed.\n @returns {boolean}\n @private\n */\n queryParamsDidChange(changed, _totalPresent, removed) {\n let qpMap = (0, _metal.get)(this, '_qp').map;\n let totalChanged = Object.keys(changed).concat(Object.keys(removed));\n for (let i = 0; i < totalChanged.length; ++i) {\n let qp = qpMap[totalChanged[i]];\n if (qp && (0, _metal.get)(this._optionsForQueryParam(qp), 'refreshModel') && this._router.currentState) {\n this.refresh();\n break;\n }\n }\n return true;\n },\n finalizeQueryParamChange(params, finalParams, transition) {\n if (this.fullRouteName !== 'application') {\n return true;\n }\n // Transition object is absent for intermediate transitions.\n if (!transition) {\n return;\n }\n let routeInfos = transition[_router_js.STATE_SYMBOL].routeInfos;\n let router = this._router;\n let qpMeta = router._queryParamsFor(routeInfos);\n let changes = router._qpUpdates;\n let replaceUrl;\n (0, _utils.stashParamNames)(router, routeInfos);\n for (let i = 0; i < qpMeta.qps.length; ++i) {\n let qp = qpMeta.qps[i];\n let route = qp.route;\n let controller = route.controller;\n let presentKey = qp.urlKey in params && qp.urlKey;\n // Do a reverse lookup to see if the changed query\n // param URL key corresponds to a QP property on\n // this controller.\n let value, svalue;\n if (changes.has(qp.urlKey)) {\n // Value updated in/before setupController\n value = (0, _metal.get)(controller, qp.prop);\n svalue = route.serializeQueryParam(value, qp.urlKey, qp.type);\n } else {\n if (presentKey) {\n svalue = params[presentKey];\n if (svalue !== undefined) {\n value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type);\n }\n } else {\n // No QP provided; use default value.\n svalue = qp.serializedDefaultValue;\n value = copyDefaultValue(qp.defaultValue);\n }\n }\n controller._qpDelegate = (0, _metal.get)(route, '_qp.states.inactive');\n let thisQueryParamChanged = svalue !== qp.serializedValue;\n if (thisQueryParamChanged) {\n if (transition.queryParamsOnly && replaceUrl !== false) {\n let options = route._optionsForQueryParam(qp);\n let replaceConfigValue = (0, _metal.get)(options, 'replace');\n if (replaceConfigValue) {\n replaceUrl = true;\n } else if (replaceConfigValue === false) {\n // Explicit pushState wins over any other replaceStates.\n replaceUrl = false;\n }\n }\n (0, _metal.set)(controller, qp.prop, value);\n }\n // Stash current serialized value of controller.\n qp.serializedValue = svalue;\n let thisQueryParamHasDefaultValue = qp.serializedDefaultValue === svalue;\n if (!thisQueryParamHasDefaultValue || transition._keepDefaultQueryParamValues) {\n finalParams.push({\n value: svalue,\n visible: true,\n key: presentKey || qp.urlKey\n });\n }\n }\n if (replaceUrl) {\n transition.method('replace');\n }\n qpMeta.qps.forEach(qp => {\n let routeQpMeta = (0, _metal.get)(qp.route, '_qp');\n let finalizedController = qp.route.controller;\n finalizedController._qpDelegate = (0, _metal.get)(routeQpMeta, 'states.active');\n });\n router._qpUpdates.clear();\n return;\n }\n }\n });\n let ROUTER_EVENT_DEPRECATIONS = exports.ROUTER_EVENT_DEPRECATIONS = undefined;\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE && _deprecatedFeatures.ROUTER_EVENTS) {\n exports.ROUTER_EVENT_DEPRECATIONS = ROUTER_EVENT_DEPRECATIONS = {\n on(name) {\n this._super(...arguments);\n let hasDidTransition = name === 'didTransition';\n let hasWillTransition = name === 'willTransition';\n if (hasDidTransition) {\n (0, _debug.deprecate)('You attempted to listen to the \"didTransition\" event which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.', false, {\n id: 'deprecate-router-events',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_deprecate-router-events'\n });\n }\n if (hasWillTransition) {\n (0, _debug.deprecate)('You attempted to listen to the \"willTransition\" event which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.', false, {\n id: 'deprecate-router-events',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_deprecate-router-events'\n });\n }\n }\n };\n Route.reopen(ROUTER_EVENT_DEPRECATIONS, {\n _paramsFor(routeName, params) {\n let transition = this._router._routerMicrolib.activeTransition;\n if (transition !== undefined) {\n return this.paramsFor(routeName);\n }\n return params;\n }\n });\n }\n exports.default = Route;\n});","enifed('@ember/-internals/routing/lib/system/router', ['exports', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/-internals/runtime', '@ember/canary-features', '@ember/debug', '@ember/deprecated-features', '@ember/error', '@ember/polyfills', '@ember/runloop', '@glimmer/env', '@ember/-internals/routing/lib/location/api', '@ember/-internals/routing/lib/utils', '@ember/-internals/routing/lib/system/dsl', '@ember/-internals/routing/lib/system/route', '@ember/-internals/routing/lib/system/router_state', 'router_js'], function (exports, _metal, _owner, _runtime, _canaryFeatures, _debug, _deprecatedFeatures, _error2, _polyfills, _runloop, _env, _api, _utils, _dsl, _route, _router_state, _router_js) {\n 'use strict';\n\n exports.__esModule = true;\n exports.triggerEvent = triggerEvent;\n\n function defaultDidTransition(infos) {\n updatePaths(this);\n this._cancelSlowTransitionTimer();\n this.notifyPropertyChange('url');\n this.set('currentState', this.targetState);\n // Put this in the runloop so url will be accurate. Seems\n // less surprising than didTransition being out of sync.\n (0, _runloop.once)(this, this.trigger, 'didTransition');\n if (_env.DEBUG) {\n if ((0, _metal.get)(this, 'namespace').LOG_TRANSITIONS) {\n // eslint-disable-next-line no-console\n console.log(`Transitioned into '${EmberRouter._routePath(infos)}'`);\n }\n }\n }\n function defaultWillTransition(oldInfos, newInfos, transition) {\n (0, _runloop.once)(this, this.trigger, 'willTransition', transition);\n if (_env.DEBUG) {\n if ((0, _metal.get)(this, 'namespace').LOG_TRANSITIONS) {\n // eslint-disable-next-line no-console\n console.log(`Preparing to transition from '${EmberRouter._routePath(oldInfos)}' to '${EmberRouter._routePath(newInfos)}'`);\n }\n }\n }\n if (_deprecatedFeatures.TRANSITION_STATE) {\n Object.defineProperty(_router_js.InternalTransition.prototype, 'state', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to read \"transition.state\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the public state on it.', false, {\n id: 'transition-state',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_transition-state'\n });\n }\n return this[_router_js.STATE_SYMBOL];\n }\n });\n Object.defineProperty(_router_js.InternalTransition.prototype, 'queryParams', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to read \"transition.queryParams\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the queryParams on it.', false, {\n id: 'transition-state',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_transition-state'\n });\n }\n return this[_router_js.QUERY_PARAMS_SYMBOL];\n }\n });\n Object.defineProperty(_router_js.InternalTransition.prototype, 'params', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to read \"transition.params\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the params on it.', false, {\n id: 'transition-state',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_transition-state'\n });\n }\n return this[_router_js.PARAMS_SYMBOL];\n }\n });\n }\n if (_deprecatedFeatures.HANDLER_INFOS) {\n Object.defineProperty(_router_js.InternalRouteInfo.prototype, 'handler', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n return this.route;\n },\n set(value) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to set \"handlerInfo.handler\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n this.route = value;\n }\n });\n Object.defineProperty(_router_js.InternalTransition.prototype, 'handlerInfos', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to use \"transition.handlerInfos\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n return this.routeInfos;\n }\n });\n Object.defineProperty(_router_js.TransitionState.prototype, 'handlerInfos', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to use \"transition.state.handlerInfos\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n return this.routeInfos;\n }\n });\n Object.defineProperty(_router_js.default.prototype, 'currentHandlerInfos', {\n get() {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to use \"_routerMicrolib.currentHandlerInfos\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n return this.currentRouteInfos;\n }\n });\n _router_js.default.prototype['getHandler'] = function (name) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _debug.deprecate)('You attempted to use \"_routerMicrolib.getHandler\" which is a private API that will be removed.', false, {\n id: 'remove-handler-infos',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_remove-handler-infos'\n });\n }\n return this.getRoute(name);\n };\n }\n function K() {\n return this;\n }\n const { slice } = Array.prototype;\n /**\n The `EmberRouter` class manages the application state and URLs. Refer to\n the [routing guide](https://guides.emberjs.com/release/routing/) for documentation.\n \n @class EmberRouter\n @extends EmberObject\n @uses Evented\n @public\n */\n class EmberRouter extends _runtime.Object {\n constructor() {\n super(...arguments);\n this.currentState = null;\n this.targetState = null;\n }\n _initRouterJs() {\n let location = (0, _metal.get)(this, 'location');\n let router = this;\n let owner = (0, _owner.getOwner)(this);\n let seen = Object.create(null);\n class PrivateRouter extends _router_js.default {\n getRoute(name) {\n let routeName = name;\n let routeOwner = owner;\n let engineInfo = router._engineInfoByRoute[routeName];\n if (engineInfo) {\n let engineInstance = router._getEngineInstance(engineInfo);\n routeOwner = engineInstance;\n routeName = engineInfo.localFullName;\n }\n let fullRouteName = `route:${routeName}`;\n let route = routeOwner.lookup(fullRouteName);\n if (seen[name]) {\n return route;\n }\n seen[name] = true;\n if (!route) {\n let DefaultRoute = routeOwner.factoryFor('route:basic').class;\n routeOwner.register(fullRouteName, DefaultRoute.extend());\n route = routeOwner.lookup(fullRouteName);\n if (_env.DEBUG) {\n if ((0, _metal.get)(router, 'namespace.LOG_ACTIVE_GENERATION')) {\n (0, _debug.info)(`generated -> ${fullRouteName}`, { fullName: fullRouteName });\n }\n }\n }\n route._setRouteName(routeName);\n if (engineInfo && !(0, _route.hasDefaultSerialize)(route)) {\n throw new Error('Defining a custom serialize method on an Engine route is not supported.');\n }\n return route;\n }\n getSerializer(name) {\n let engineInfo = router._engineInfoByRoute[name];\n // If this is not an Engine route, we fall back to the handler for serialization\n if (!engineInfo) {\n return;\n }\n return engineInfo.serializeMethod || _route.defaultSerialize;\n }\n updateURL(path) {\n (0, _runloop.once)(() => {\n location.setURL(path);\n (0, _metal.set)(router, 'currentURL', path);\n });\n }\n didTransition(infos) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE && _deprecatedFeatures.ROUTER_EVENTS) {\n if (router.didTransition !== defaultDidTransition) {\n (0, _debug.deprecate)('You attempted to override the \"didTransition\" method which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.', false, {\n id: 'deprecate-router-events',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_deprecate-router-events'\n });\n }\n }\n router.didTransition(infos);\n }\n willTransition(oldInfos, newInfos, transition) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE && _deprecatedFeatures.ROUTER_EVENTS) {\n if (router.willTransition !== defaultWillTransition) {\n (0, _debug.deprecate)('You attempted to override the \"willTransition\" method which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.', false, {\n id: 'deprecate-router-events',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_deprecate-router-events'\n });\n }\n }\n router.willTransition(oldInfos, newInfos, transition);\n }\n triggerEvent(routeInfos, ignoreFailure, name, args) {\n return triggerEvent.bind(router)(routeInfos, ignoreFailure, name, args);\n }\n routeWillChange(transition) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n router.trigger('routeWillChange', transition);\n }\n }\n routeDidChange(transition) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n router.set('currentRoute', transition.to);\n (0, _runloop.once)(() => {\n router.trigger('routeDidChange', transition);\n });\n }\n }\n transitionDidError(error, transition) {\n if (error.wasAborted || transition.isAborted) {\n // If the error was a transition erorr or the transition aborted\n // log the abort.\n return (0, _router_js.logAbort)(transition);\n } else {\n // Otherwise trigger the \"error\" event to attempt an intermediate\n // transition into an error substate\n transition.trigger(false, 'error', error.error, transition, error.route);\n if (router._isErrorHandled(error.error)) {\n // If we handled the error with a substate just roll the state back on\n // the transition and send the \"routeDidChange\" event for landing on\n // the error substate and return the error.\n transition.rollback();\n this.routeDidChange(transition);\n return error.error;\n } else {\n // If it was not handled, abort the transition completely and return\n // the error.\n transition.abort();\n return error.error;\n }\n }\n }\n _triggerWillChangeContext() {\n return router;\n }\n _triggerWillLeave() {\n return router;\n }\n replaceURL(url) {\n if (location.replaceURL) {\n let doReplaceURL = () => {\n location.replaceURL(url);\n (0, _metal.set)(router, 'currentURL', url);\n };\n (0, _runloop.once)(doReplaceURL);\n } else {\n this.updateURL(url);\n }\n }\n }\n let routerMicrolib = this._routerMicrolib = new PrivateRouter();\n let dslCallbacks = this.constructor.dslCallbacks || [K];\n let dsl = this._buildDSL();\n dsl.route('application', { path: '/', resetNamespace: true, overrideNameAssertion: true }, function () {\n for (let i = 0; i < dslCallbacks.length; i++) {\n dslCallbacks[i].call(this);\n }\n });\n if (_env.DEBUG) {\n if ((0, _metal.get)(this, 'namespace.LOG_TRANSITIONS_INTERNAL')) {\n routerMicrolib.log = console.log.bind(console); // eslint-disable-line no-console\n }\n }\n routerMicrolib.map(dsl.generate());\n }\n _buildDSL() {\n let enableLoadingSubstates = this._hasModuleBasedResolver();\n let router = this;\n let owner = (0, _owner.getOwner)(this);\n let options = {\n enableLoadingSubstates,\n resolveRouteMap(name) {\n return owner.factoryFor(`route-map:${name}`);\n },\n addRouteForEngine(name, engineInfo) {\n if (!router._engineInfoByRoute[name]) {\n router._engineInfoByRoute[name] = engineInfo;\n }\n }\n };\n return new _dsl.default(null, options);\n }\n init() {\n this._super(...arguments);\n this.currentURL = null;\n this.currentRouteName = null;\n this.currentPath = null;\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n this.currentRoute = null;\n }\n this._qpCache = Object.create(null);\n this._qpUpdates = new Set();\n this._resetQueuedQueryParameterChanges();\n this._handledErrors = new Set();\n this._engineInstances = Object.create(null);\n this._engineInfoByRoute = Object.create(null);\n }\n /*\n Resets all pending query parameter changes.\n Called after transitioning to a new route\n based on query parameter changes.\n */\n _resetQueuedQueryParameterChanges() {\n this._queuedQPChanges = {};\n }\n _hasModuleBasedResolver() {\n let owner = (0, _owner.getOwner)(this);\n if (!owner) {\n return false;\n }\n let resolver = (0, _metal.get)(owner, 'application.__registry__.resolver.moduleBasedResolver');\n return !!resolver;\n }\n /**\n Initializes the current router instance and sets up the change handling\n event listeners used by the instances `location` implementation.\n A property named `initialURL` will be used to determine the initial URL.\n If no value is found `/` will be used.\n @method startRouting\n @private\n */\n startRouting() {\n let initialURL = (0, _metal.get)(this, 'initialURL');\n if (this.setupRouter()) {\n if (initialURL === undefined) {\n initialURL = (0, _metal.get)(this, 'location').getURL();\n }\n let initialTransition = this.handleURL(initialURL);\n if (initialTransition && initialTransition.error) {\n throw initialTransition.error;\n }\n }\n }\n setupRouter() {\n this._setupLocation();\n let location = (0, _metal.get)(this, 'location');\n // Allow the Location class to cancel the router setup while it refreshes\n // the page\n if ((0, _metal.get)(location, 'cancelRouterSetup')) {\n return false;\n }\n this._initRouterJs();\n location.onUpdateURL(url => {\n this.handleURL(url);\n });\n return true;\n }\n _setOutlets() {\n // This is triggered async during Route#willDestroy.\n // If the router is also being destroyed we do not want to\n // to create another this._toplevelView (and leak the renderer)\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n let routeInfos = this._routerMicrolib.currentRouteInfos;\n let route;\n let defaultParentState;\n let liveRoutes = null;\n if (!routeInfos) {\n return;\n }\n for (let i = 0; i < routeInfos.length; i++) {\n route = routeInfos[i].route;\n let connections = route.connections;\n let ownState;\n for (let j = 0; j < connections.length; j++) {\n let appended = appendLiveRoute(liveRoutes, defaultParentState, connections[j]);\n liveRoutes = appended.liveRoutes;\n if (appended.ownState.render.name === route.routeName || appended.ownState.render.outlet === 'main') {\n ownState = appended.ownState;\n }\n }\n if (connections.length === 0) {\n ownState = representEmptyRoute(liveRoutes, defaultParentState, route);\n }\n defaultParentState = ownState;\n }\n // when a transitionTo happens after the validation phase\n // during the initial transition _setOutlets is called\n // when no routes are active. However, it will get called\n // again with the correct values during the next turn of\n // the runloop\n if (!liveRoutes) {\n return;\n }\n if (!this._toplevelView) {\n let owner = (0, _owner.getOwner)(this);\n let OutletView = owner.factoryFor('view:-outlet');\n this._toplevelView = OutletView.create();\n this._toplevelView.setOutletState(liveRoutes);\n let instance = owner.lookup('-application-instance:main');\n instance.didCreateRootView(this._toplevelView);\n } else {\n this._toplevelView.setOutletState(liveRoutes);\n }\n }\n handleURL(url) {\n // Until we have an ember-idiomatic way of accessing #hashes, we need to\n // remove it because router.js doesn't know how to handle it.\n let _url = url.split(/#(.+)?/)[0];\n return this._doURLTransition('handleURL', _url);\n }\n _doURLTransition(routerJsMethod, url) {\n let transition = this._routerMicrolib[routerJsMethod](url || '/');\n didBeginTransition(transition, this);\n return transition;\n }\n /**\n Transition the application into another route. The route may\n be either a single route or route path:\n See [transitionTo](/api/ember/release/classes/Route/methods/transitionTo?anchor=transitionTo) for more info.\n @method transitionTo\n @param {String} name the name of the route or a URL\n @param {...Object} models the model(s) or identifier(s) to be used while\n transitioning to the route.\n @param {Object} [options] optional hash with a queryParams property\n containing a mapping of query parameters\n @return {Transition} the transition object associated with this\n attempted transition\n @public\n */\n transitionTo(...args) {\n if ((0, _utils.resemblesURL)(args[0])) {\n (0, _debug.assert)(`A transition was attempted from '${this.currentRouteName}' to '${args[0]}' but the application instance has already been destroyed.`, !this.isDestroying && !this.isDestroyed);\n return this._doURLTransition('transitionTo', args[0]);\n }\n let { routeName, models, queryParams } = (0, _utils.extractRouteArgs)(args);\n (0, _debug.assert)(`A transition was attempted from '${this.currentRouteName}' to '${routeName}' but the application instance has already been destroyed.`, !this.isDestroying && !this.isDestroyed);\n return this._doTransition(routeName, models, queryParams);\n }\n intermediateTransitionTo(name, ...args) {\n this._routerMicrolib.intermediateTransitionTo(name, ...args);\n updatePaths(this);\n if (_env.DEBUG) {\n let infos = this._routerMicrolib.currentRouteInfos;\n if ((0, _metal.get)(this, 'namespace').LOG_TRANSITIONS) {\n // eslint-disable-next-line no-console\n console.log(`Intermediate-transitioned into '${EmberRouter._routePath(infos)}'`);\n }\n }\n }\n replaceWith(...args) {\n return this.transitionTo(...args).method('replace');\n }\n generate(name, ...args) {\n let url = this._routerMicrolib.generate(name, ...args);\n return this.location.formatURL(url);\n }\n /**\n Determines if the supplied route is currently active.\n @method isActive\n @param routeName\n @return {Boolean}\n @private\n */\n isActive(routeName) {\n return this._routerMicrolib.isActive(routeName);\n }\n /**\n An alternative form of `isActive` that doesn't require\n manual concatenation of the arguments into a single\n array.\n @method isActiveIntent\n @param routeName\n @param models\n @param queryParams\n @return {Boolean}\n @private\n @since 1.7.0\n */\n isActiveIntent(routeName, models, queryParams) {\n return this.currentState.isActiveIntent(routeName, models, queryParams);\n }\n send(name, ...args) {\n /*name, context*/\n this._routerMicrolib.trigger(name, ...args);\n }\n /**\n Does this router instance have the given route.\n @method hasRoute\n @return {Boolean}\n @private\n */\n hasRoute(route) {\n return this._routerMicrolib.hasRoute(route);\n }\n /**\n Resets the state of the router by clearing the current route\n handlers and deactivating them.\n @private\n @method reset\n */\n reset() {\n if (this._routerMicrolib) {\n this._routerMicrolib.reset();\n }\n }\n willDestroy() {\n if (this._toplevelView) {\n this._toplevelView.destroy();\n this._toplevelView = null;\n }\n this._super(...arguments);\n this.reset();\n let instances = this._engineInstances;\n for (let name in instances) {\n for (let id in instances[name]) {\n (0, _runloop.run)(instances[name][id], 'destroy');\n }\n }\n }\n /*\n Called when an active route's query parameter has changed.\n These changes are batched into a runloop run and trigger\n a single transition.\n */\n _activeQPChanged(queryParameterName, newValue) {\n this._queuedQPChanges[queryParameterName] = newValue;\n (0, _runloop.once)(this, this._fireQueryParamTransition);\n }\n _updatingQPChanged(queryParameterName) {\n this._qpUpdates.add(queryParameterName);\n }\n /*\n Triggers a transition to a route based on query parameter changes.\n This is called once per runloop, to batch changes.\n e.g.\n if these methods are called in succession:\n this._activeQPChanged('foo', '10');\n // results in _queuedQPChanges = { foo: '10' }\n this._activeQPChanged('bar', false);\n // results in _queuedQPChanges = { foo: '10', bar: false }\n _queuedQPChanges will represent both of these changes\n and the transition using `transitionTo` will be triggered\n once.\n */\n _fireQueryParamTransition() {\n this.transitionTo({ queryParams: this._queuedQPChanges });\n this._resetQueuedQueryParameterChanges();\n }\n _setupLocation() {\n let location = (0, _metal.get)(this, 'location');\n let rootURL = (0, _metal.get)(this, 'rootURL');\n let owner = (0, _owner.getOwner)(this);\n if ('string' === typeof location && owner) {\n let resolvedLocation = owner.lookup(`location:${location}`);\n if (resolvedLocation !== undefined) {\n location = (0, _metal.set)(this, 'location', resolvedLocation);\n } else {\n // Allow for deprecated registration of custom location API's\n let options = {\n implementation: location\n };\n location = (0, _metal.set)(this, 'location', _api.default.create(options));\n }\n }\n if (location !== null && typeof location === 'object') {\n if (rootURL) {\n (0, _metal.set)(location, 'rootURL', rootURL);\n }\n // Allow the location to do any feature detection, such as AutoLocation\n // detecting history support. This gives it a chance to set its\n // `cancelRouterSetup` property which aborts routing.\n if (typeof location.detect === 'function') {\n location.detect();\n }\n // ensure that initState is called AFTER the rootURL is set on\n // the location instance\n if (typeof location.initState === 'function') {\n location.initState();\n }\n }\n }\n /**\n Serializes the given query params according to their QP meta information.\n @private\n @method _serializeQueryParams\n @param {Arrray} routeInfos\n @param {Object} queryParams\n @return {Void}\n */\n _serializeQueryParams(routeInfos, queryParams) {\n forEachQueryParam(this, routeInfos, queryParams, (key, value, qp) => {\n if (qp) {\n delete queryParams[key];\n queryParams[qp.urlKey] = qp.route.serializeQueryParam(value, qp.urlKey, qp.type);\n } else if (value === undefined) {\n return; // We don't serialize undefined values\n } else {\n queryParams[key] = this._serializeQueryParam(value, (0, _runtime.typeOf)(value));\n }\n });\n }\n /**\n Serializes the value of a query parameter based on a type\n @private\n @method _serializeQueryParam\n @param {Object} value\n @param {String} type\n */\n _serializeQueryParam(value, type) {\n if (value === null || value === undefined) {\n return value;\n } else if (type === 'array') {\n return JSON.stringify(value);\n }\n return `${value}`;\n }\n /**\n Deserializes the given query params according to their QP meta information.\n @private\n @method _deserializeQueryParams\n @param {Array} routeInfos\n @param {Object} queryParams\n @return {Void}\n */\n _deserializeQueryParams(routeInfos, queryParams) {\n forEachQueryParam(this, routeInfos, queryParams, (key, value, qp) => {\n // If we don't have QP meta info for a given key, then we do nothing\n // because all values will be treated as strings\n if (qp) {\n delete queryParams[key];\n queryParams[qp.prop] = qp.route.deserializeQueryParam(value, qp.urlKey, qp.type);\n }\n });\n }\n /**\n Deserializes the value of a query parameter based on a default type\n @private\n @method _deserializeQueryParam\n @param {Object} value\n @param {String} defaultType\n */\n _deserializeQueryParam(value, defaultType) {\n if (value === null || value === undefined) {\n return value;\n } else if (defaultType === 'boolean') {\n return value === 'true';\n } else if (defaultType === 'number') {\n return Number(value).valueOf();\n } else if (defaultType === 'array') {\n return (0, _runtime.A)(JSON.parse(value));\n }\n return value;\n }\n /**\n Removes (prunes) any query params with default values from the given QP\n object. Default values are determined from the QP meta information per key.\n @private\n @method _pruneDefaultQueryParamValues\n @param {Array} routeInfos\n @param {Object} queryParams\n @return {Void}\n */\n _pruneDefaultQueryParamValues(routeInfos, queryParams) {\n let qps = this._queryParamsFor(routeInfos);\n for (let key in queryParams) {\n let qp = qps.map[key];\n if (qp && qp.serializedDefaultValue === queryParams[key]) {\n delete queryParams[key];\n }\n }\n }\n _doTransition(_targetRouteName, models, _queryParams, _keepDefaultQueryParamValues) {\n let targetRouteName = _targetRouteName || (0, _utils.getActiveTargetName)(this._routerMicrolib);\n (0, _debug.assert)(`The route ${targetRouteName} was not found`, !!targetRouteName && this._routerMicrolib.hasRoute(targetRouteName));\n let queryParams = {};\n this._processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams);\n (0, _polyfills.assign)(queryParams, _queryParams);\n this._prepareQueryParams(targetRouteName, models, queryParams, !!_keepDefaultQueryParamValues);\n let transition = this._routerMicrolib.transitionTo(targetRouteName, ...models, { queryParams });\n didBeginTransition(transition, this);\n return transition;\n }\n _processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams) {\n // merge in any queryParams from the active transition which could include\n // queryParams from the url on initial load.\n if (!this._routerMicrolib.activeTransition) {\n return;\n }\n let unchangedQPs = {};\n let qpUpdates = this._qpUpdates;\n let params = this._routerMicrolib.activeTransition[_router_js.QUERY_PARAMS_SYMBOL];\n for (let key in params) {\n if (!qpUpdates.has(key)) {\n unchangedQPs[key] = params[key];\n }\n }\n // We need to fully scope queryParams so that we can create one object\n // that represents both passed-in queryParams and ones that aren't changed\n // from the active transition.\n this._fullyScopeQueryParams(targetRouteName, models, _queryParams);\n this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);\n (0, _polyfills.assign)(queryParams, unchangedQPs);\n }\n /**\n Prepares the query params for a URL or Transition. Restores any undefined QP\n keys/values, serializes all values, and then prunes any default values.\n @private\n @method _prepareQueryParams\n @param {String} targetRouteName\n @param {Array} models\n @param {Object} queryParams\n @param {boolean} keepDefaultQueryParamValues\n @return {Void}\n */\n _prepareQueryParams(targetRouteName, models, queryParams, _fromRouterService) {\n let state = calculatePostTransitionState(this, targetRouteName, models);\n this._hydrateUnsuppliedQueryParams(state, queryParams, !!_fromRouterService);\n this._serializeQueryParams(state.routeInfos, queryParams);\n if (!_fromRouterService) {\n this._pruneDefaultQueryParamValues(state.routeInfos, queryParams);\n }\n }\n /**\n Returns the meta information for the query params of a given route. This\n will be overridden to allow support for lazy routes.\n @private\n @method _getQPMeta\n @param {RouteInfo} routeInfo\n @return {Object}\n */\n _getQPMeta(routeInfo) {\n let route = routeInfo.route;\n return route && (0, _metal.get)(route, '_qp');\n }\n /**\n Returns a merged query params meta object for a given set of routeInfos.\n Useful for knowing what query params are available for a given route hierarchy.\n @private\n @method _queryParamsFor\n @param {Array} routeInfos\n @return {Object}\n */\n _queryParamsFor(routeInfos) {\n let routeInfoLength = routeInfos.length;\n let leafRouteName = routeInfos[routeInfoLength - 1].name;\n let cached = this._qpCache[leafRouteName];\n if (cached !== undefined) {\n return cached;\n }\n let shouldCache = true;\n let map = {};\n let qps = [];\n let qpsByUrlKey = _env.DEBUG ? {} : null;\n let qpMeta;\n let qp;\n let urlKey;\n let qpOther;\n for (let i = 0; i < routeInfoLength; ++i) {\n qpMeta = this._getQPMeta(routeInfos[i]);\n if (!qpMeta) {\n shouldCache = false;\n continue;\n }\n // Loop over each QP to make sure we don't have any collisions by urlKey\n for (let i = 0; i < qpMeta.qps.length; i++) {\n qp = qpMeta.qps[i];\n if (_env.DEBUG) {\n urlKey = qp.urlKey;\n qpOther = qpsByUrlKey[urlKey];\n if (qpOther && qpOther.controllerName !== qp.controllerName) {\n (0, _debug.assert)(`You're not allowed to have more than one controller property map to the same query param key, but both \\`${qpOther.scopedPropertyName}\\` and \\`${qp.scopedPropertyName}\\` map to \\`${urlKey}\\`. You can fix this by mapping one of the controller properties to a different query param key via the \\`as\\` config option, e.g. \\`${qpOther.prop}: { as: \\'other-${qpOther.prop}\\' }\\``, false);\n }\n qpsByUrlKey[urlKey] = qp;\n }\n qps.push(qp);\n }\n (0, _polyfills.assign)(map, qpMeta.map);\n }\n let finalQPMeta = { qps, map };\n if (shouldCache) {\n this._qpCache[leafRouteName] = finalQPMeta;\n }\n return finalQPMeta;\n }\n /**\n Maps all query param keys to their fully scoped property name of the form\n `controllerName:propName`.\n @private\n @method _fullyScopeQueryParams\n @param {String} leafRouteName\n @param {Array} contexts\n @param {Object} queryParams\n @return {Void}\n */\n _fullyScopeQueryParams(leafRouteName, contexts, queryParams) {\n let state = calculatePostTransitionState(this, leafRouteName, contexts);\n let routeInfos = state.routeInfos;\n let qpMeta;\n for (let i = 0, len = routeInfos.length; i < len; ++i) {\n qpMeta = this._getQPMeta(routeInfos[i]);\n if (!qpMeta) {\n continue;\n }\n let qp;\n let presentProp;\n for (let j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {\n qp = qpMeta.qps[j];\n presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n if (presentProp) {\n if (presentProp !== qp.scopedPropertyName) {\n queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n delete queryParams[presentProp];\n }\n }\n }\n }\n }\n /**\n Hydrates (adds/restores) any query params that have pre-existing values into\n the given queryParams hash. This is what allows query params to be \"sticky\"\n and restore their last known values for their scope.\n @private\n @method _hydrateUnsuppliedQueryParams\n @param {TransitionState} state\n @param {Object} queryParams\n @return {Void}\n */\n _hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService) {\n let routeInfos = state.routeInfos;\n let appCache = this._bucketCache;\n let qpMeta;\n let qp;\n let presentProp;\n for (let i = 0; i < routeInfos.length; ++i) {\n qpMeta = this._getQPMeta(routeInfos[i]);\n if (!qpMeta) {\n continue;\n }\n for (let j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {\n qp = qpMeta.qps[j];\n presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n (0, _debug.assert)(`You passed the \\`${presentProp}\\` query parameter during a transition into ${qp.route.routeName}, please update to ${qp.urlKey}`, function () {\n if (qp.urlKey === presentProp) {\n return true;\n }\n if (_fromRouterService && presentProp !== false) {\n return false;\n }\n return true;\n }());\n if (presentProp) {\n if (presentProp !== qp.scopedPropertyName) {\n queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n delete queryParams[presentProp];\n }\n } else {\n let cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, state.params);\n queryParams[qp.scopedPropertyName] = appCache.lookup(cacheKey, qp.prop, qp.defaultValue);\n }\n }\n }\n }\n _scheduleLoadingEvent(transition, originRoute) {\n this._cancelSlowTransitionTimer();\n this._slowTransitionTimer = (0, _runloop.scheduleOnce)('routerTransitions', this, '_handleSlowTransition', transition, originRoute);\n }\n _handleSlowTransition(transition, originRoute) {\n if (!this._routerMicrolib.activeTransition) {\n // Don't fire an event if we've since moved on from\n // the transition that put us in a loading state.\n return;\n }\n let targetState = new _router_state.default(this, this._routerMicrolib, this._routerMicrolib.activeTransition[_router_js.STATE_SYMBOL]);\n this.set('targetState', targetState);\n transition.trigger(true, 'loading', transition, originRoute);\n }\n _cancelSlowTransitionTimer() {\n if (this._slowTransitionTimer) {\n (0, _runloop.cancel)(this._slowTransitionTimer);\n }\n this._slowTransitionTimer = null;\n }\n // These three helper functions are used to ensure errors aren't\n // re-raised if they're handled in a route's error action.\n _markErrorAsHandled(error) {\n this._handledErrors.add(error);\n }\n _isErrorHandled(error) {\n return this._handledErrors.has(error);\n }\n _clearHandledError(error) {\n this._handledErrors.delete(error);\n }\n _getEngineInstance({ name, instanceId, mountPoint }) {\n let engineInstances = this._engineInstances;\n if (!engineInstances[name]) {\n engineInstances[name] = Object.create(null);\n }\n let engineInstance = engineInstances[name][instanceId];\n if (!engineInstance) {\n let owner = (0, _owner.getOwner)(this);\n (0, _debug.assert)(`You attempted to mount the engine '${name}' in your router map, but the engine can not be found.`, owner.hasRegistration(`engine:${name}`));\n engineInstance = owner.buildChildEngineInstance(name, {\n routable: true,\n mountPoint\n });\n engineInstance.boot();\n engineInstances[name][instanceId] = engineInstance;\n }\n return engineInstance;\n }\n }\n /*\n Helper function for iterating over routes in a set of routeInfos that are\n at or above the given origin route. Example: if `originRoute` === 'foo.bar'\n and the routeInfos given were for 'foo.bar.baz', then the given callback\n will be invoked with the routes for 'foo.bar', 'foo', and 'application'\n individually.\n \n If the callback returns anything other than `true`, then iteration will stop.\n \n @private\n @param {Route} originRoute\n @param {Array} routeInfos\n @param {Function} callback\n @return {Void}\n */\n function forEachRouteAbove(routeInfos, callback) {\n for (let i = routeInfos.length - 1; i >= 0; --i) {\n let routeInfo = routeInfos[i];\n let route = routeInfo.route;\n // routeInfo.handler being `undefined` generally means either:\n //\n // 1. an error occurred during creation of the route in question\n // 2. the route is across an async boundary (e.g. within an engine)\n //\n // In both of these cases, we cannot invoke the callback on that specific\n // route, because it just doesn't exist...\n if (route === undefined) {\n continue;\n }\n if (callback(route, routeInfo) !== true) {\n return;\n }\n }\n }\n // These get invoked when an action bubbles above ApplicationRoute\n // and are not meant to be overridable.\n let defaultActionHandlers = {\n willResolveModel(_routeInfos, transition, originRoute) {\n this._scheduleLoadingEvent(transition, originRoute);\n },\n // Attempt to find an appropriate error route or substate to enter.\n error(routeInfos, error, transition) {\n let router = this;\n let routeInfoWithError = routeInfos[routeInfos.length - 1];\n forEachRouteAbove(routeInfos, (route, routeInfo) => {\n // We don't check the leaf most routeInfo since that would\n // technically be below where we're at in the route hierarchy.\n if (routeInfo !== routeInfoWithError) {\n // Check for the existence of an 'error' route.\n let errorRouteName = findRouteStateName(route, 'error');\n if (errorRouteName) {\n router._markErrorAsHandled(error);\n router.intermediateTransitionTo(errorRouteName, error);\n return false;\n }\n }\n // Check for an 'error' substate route\n let errorSubstateName = findRouteSubstateName(route, 'error');\n if (errorSubstateName) {\n router._markErrorAsHandled(error);\n router.intermediateTransitionTo(errorSubstateName, error);\n return false;\n }\n return true;\n });\n logError(error, `Error while processing route: ${transition.targetName}`);\n },\n // Attempt to find an appropriate loading route or substate to enter.\n loading(routeInfos, transition) {\n let router = this;\n let routeInfoWithSlowLoading = routeInfos[routeInfos.length - 1];\n forEachRouteAbove(routeInfos, (route, routeInfo) => {\n // We don't check the leaf most routeInfos since that would\n // technically be below where we're at in the route hierarchy.\n if (routeInfo !== routeInfoWithSlowLoading) {\n // Check for the existence of a 'loading' route.\n let loadingRouteName = findRouteStateName(route, 'loading');\n if (loadingRouteName) {\n router.intermediateTransitionTo(loadingRouteName);\n return false;\n }\n }\n // Check for loading substate\n let loadingSubstateName = findRouteSubstateName(route, 'loading');\n if (loadingSubstateName) {\n router.intermediateTransitionTo(loadingSubstateName);\n return false;\n }\n // Don't bubble above pivot route.\n return transition.pivotHandler !== route;\n });\n }\n };\n function logError(_error, initialMessage) {\n let errorArgs = [];\n let error;\n if (_error && typeof _error === 'object' && typeof _error.errorThrown === 'object') {\n error = _error.errorThrown;\n } else {\n error = _error;\n }\n if (initialMessage) {\n errorArgs.push(initialMessage);\n }\n if (error) {\n if (error.message) {\n errorArgs.push(error.message);\n }\n if (error.stack) {\n errorArgs.push(error.stack);\n }\n if (typeof error === 'string') {\n errorArgs.push(error);\n }\n }\n console.error(...errorArgs); //eslint-disable-line no-console\n }\n /**\n Finds the name of the substate route if it exists for the given route. A\n substate route is of the form `route_state`, such as `foo_loading`.\n \n @private\n @param {Route} route\n @param {String} state\n @return {String}\n */\n function findRouteSubstateName(route, state) {\n let owner = (0, _owner.getOwner)(route);\n let { routeName, fullRouteName, _router: router } = route;\n let substateName = `${routeName}_${state}`;\n let substateNameFull = `${fullRouteName}_${state}`;\n return routeHasBeenDefined(owner, router, substateName, substateNameFull) ? substateNameFull : '';\n }\n /**\n Finds the name of the state route if it exists for the given route. A state\n route is of the form `route.state`, such as `foo.loading`. Properly Handles\n `application` named routes.\n \n @private\n @param {Route} route\n @param {String} state\n @return {String}\n */\n function findRouteStateName(route, state) {\n let owner = (0, _owner.getOwner)(route);\n let { routeName, fullRouteName, _router: router } = route;\n let stateName = routeName === 'application' ? state : `${routeName}.${state}`;\n let stateNameFull = fullRouteName === 'application' ? state : `${fullRouteName}.${state}`;\n return routeHasBeenDefined(owner, router, stateName, stateNameFull) ? stateNameFull : '';\n }\n /**\n Determines whether or not a route has been defined by checking that the route\n is in the Router's map and the owner has a registration for that route.\n \n @private\n @param {Owner} owner\n @param {Router} router\n @param {String} localName\n @param {String} fullName\n @return {Boolean}\n */\n function routeHasBeenDefined(owner, router, localName, fullName) {\n let routerHasRoute = router.hasRoute(fullName);\n let ownerHasRoute = owner.hasRegistration(`template:${localName}`) || owner.hasRegistration(`route:${localName}`);\n return routerHasRoute && ownerHasRoute;\n }\n function triggerEvent(routeInfos, ignoreFailure, name, args) {\n if (!routeInfos) {\n if (ignoreFailure) {\n return;\n }\n throw new _error2.default(`Can't trigger action '${name}' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call \\`.send()\\` on the \\`Transition\\` object passed to the \\`model/beforeModel/afterModel\\` hooks.`);\n }\n let eventWasHandled = false;\n let routeInfo, handler, actionHandler;\n for (let i = routeInfos.length - 1; i >= 0; i--) {\n routeInfo = routeInfos[i];\n handler = routeInfo.route;\n actionHandler = handler && handler.actions && handler.actions[name];\n if (actionHandler) {\n if (actionHandler.apply(handler, args) === true) {\n eventWasHandled = true;\n } else {\n // Should only hit here if a non-bubbling error action is triggered on a route.\n if (name === 'error') {\n handler._router._markErrorAsHandled(args[0]);\n }\n return;\n }\n }\n }\n let defaultHandler = defaultActionHandlers[name];\n if (defaultHandler) {\n defaultHandler.apply(this, [routeInfos, ...args]);\n return;\n }\n if (!eventWasHandled && !ignoreFailure) {\n throw new _error2.default(`Nothing handled the action '${name}'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.`);\n }\n }\n function calculatePostTransitionState(emberRouter, leafRouteName, contexts) {\n let state = emberRouter._routerMicrolib.applyIntent(leafRouteName, contexts);\n let { routeInfos, params } = state;\n for (let i = 0; i < routeInfos.length; ++i) {\n let routeInfo = routeInfos[i];\n // If the routeInfo is not resolved, we serialize the context into params\n if (!routeInfo.isResolved) {\n params[routeInfo.name] = routeInfo.serialize(routeInfo.context);\n } else {\n params[routeInfo.name] = routeInfo.params;\n }\n }\n return state;\n }\n function updatePaths(router) {\n let infos = router._routerMicrolib.currentRouteInfos;\n if (infos.length === 0) {\n return;\n }\n let path = EmberRouter._routePath(infos);\n let currentRouteName = infos[infos.length - 1].name;\n let currentURL = router.get('location').getURL();\n (0, _metal.set)(router, 'currentPath', path);\n (0, _metal.set)(router, 'currentRouteName', currentRouteName);\n (0, _metal.set)(router, 'currentURL', currentURL);\n let appController = (0, _owner.getOwner)(router).lookup('controller:application');\n if (!appController) {\n // appController might not exist when top-level loading/error\n // substates have been entered since ApplicationRoute hasn't\n // actually been entered at that point.\n return;\n }\n if (!('currentPath' in appController)) {\n (0, _metal.defineProperty)(appController, 'currentPath');\n }\n (0, _metal.set)(appController, 'currentPath', path);\n if (!('currentRouteName' in appController)) {\n (0, _metal.defineProperty)(appController, 'currentRouteName');\n }\n (0, _metal.set)(appController, 'currentRouteName', currentRouteName);\n }\n EmberRouter.reopenClass({\n /**\n The `Router.map` function allows you to define mappings from URLs to routes\n in your application. These mappings are defined within the\n supplied callback function using `this.route`.\n The first parameter is the name of the route which is used by default as the\n path name as well.\n The second parameter is the optional options hash. Available options are:\n * `path`: allows you to provide your own path as well as mark dynamic\n segments.\n * `resetNamespace`: false by default; when nesting routes, ember will\n combine the route names to form the fully-qualified route name, which is\n used with `{{link-to}}` or manually transitioning to routes. Setting\n `resetNamespace: true` will cause the route not to inherit from its\n parent route's names. This is handy for preventing extremely long route names.\n Keep in mind that the actual URL path behavior is still retained.\n The third parameter is a function, which can be used to nest routes.\n Nested routes, by default, will have the parent route tree's route name and\n path prepended to it's own.\n ```app/router.js\n Router.map(function(){\n this.route('post', { path: '/post/:post_id' }, function() {\n this.route('edit');\n this.route('comments', { resetNamespace: true }, function() {\n this.route('new');\n });\n });\n });\n ```\n For more detailed documentation and examples please see\n [the guides](https://guides.emberjs.com/release/routing/defining-your-routes/).\n @method map\n @param callback\n @public\n */\n map(callback) {\n if (!this.dslCallbacks) {\n this.dslCallbacks = [];\n this.reopenClass({ dslCallbacks: this.dslCallbacks });\n }\n this.dslCallbacks.push(callback);\n return this;\n },\n _routePath(routeInfos) {\n let path = [];\n // We have to handle coalescing resource names that\n // are prefixed with their parent's names, e.g.\n // ['foo', 'foo.bar.baz'] => 'foo.bar.baz', not 'foo.foo.bar.baz'\n function intersectionMatches(a1, a2) {\n for (let i = 0; i < a1.length; ++i) {\n if (a1[i] !== a2[i]) {\n return false;\n }\n }\n return true;\n }\n let name, nameParts, oldNameParts;\n for (let i = 1; i < routeInfos.length; i++) {\n name = routeInfos[i].name;\n nameParts = name.split('.');\n oldNameParts = slice.call(path);\n while (oldNameParts.length) {\n if (intersectionMatches(oldNameParts, nameParts)) {\n break;\n }\n oldNameParts.shift();\n }\n path.push(...nameParts.slice(oldNameParts.length));\n }\n return path.join('.');\n }\n });\n function didBeginTransition(transition, router) {\n let routerState = new _router_state.default(router, router._routerMicrolib, transition[_router_js.STATE_SYMBOL]);\n if (!router.currentState) {\n router.set('currentState', routerState);\n }\n router.set('targetState', routerState);\n transition.promise = transition.catch(error => {\n if (router._isErrorHandled(error)) {\n router._clearHandledError(error);\n } else {\n throw error;\n }\n }, 'Transition Error');\n }\n function forEachQueryParam(router, routeInfos, queryParams, callback) {\n let qpCache = router._queryParamsFor(routeInfos);\n for (let key in queryParams) {\n if (!queryParams.hasOwnProperty(key)) {\n continue;\n }\n let value = queryParams[key];\n let qp = qpCache.map[key];\n callback(key, value, qp);\n }\n }\n function findLiveRoute(liveRoutes, name) {\n if (!liveRoutes) {\n return;\n }\n let stack = [liveRoutes];\n while (stack.length > 0) {\n let test = stack.shift();\n if (test.render.name === name) {\n return test;\n }\n let outlets = test.outlets;\n for (let outletName in outlets) {\n stack.push(outlets[outletName]);\n }\n }\n return;\n }\n function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) {\n let target;\n let myState = {\n render: renderOptions,\n outlets: Object.create(null),\n wasUsed: false\n };\n if (renderOptions.into) {\n target = findLiveRoute(liveRoutes, renderOptions.into);\n } else {\n target = defaultParentState;\n }\n if (target) {\n (0, _metal.set)(target.outlets, renderOptions.outlet, myState);\n } else {\n liveRoutes = myState;\n }\n return {\n liveRoutes,\n ownState: myState\n };\n }\n function representEmptyRoute(liveRoutes, defaultParentState, route) {\n // the route didn't render anything\n let alreadyAppended = findLiveRoute(liveRoutes, route.routeName);\n if (alreadyAppended) {\n // But some other route has already rendered our default\n // template, so that becomes the default target for any\n // children we may have.\n return alreadyAppended;\n } else {\n // Create an entry to represent our default template name,\n // just so other routes can target it and inherit its place\n // in the outlet hierarchy.\n defaultParentState.outlets.main = {\n render: {\n name: route.routeName,\n outlet: 'main'\n },\n outlets: {}\n };\n return defaultParentState;\n }\n }\n EmberRouter.reopen(_runtime.Evented, {\n /**\n Handles updating the paths and notifying any listeners of the URL\n change.\n Triggers the router level `didTransition` hook.\n For example, to notify google analytics when the route changes,\n you could use this hook. (Note: requires also including GA scripts, etc.)\n ```javascript\n import config from './config/environment';\n import EmberRouter from '@ember/routing/router';\n let Router = EmberRouter.extend({\n location: config.locationType,\n didTransition: function() {\n this._super(...arguments);\n return ga('send', 'pageview', {\n 'page': this.get('url'),\n 'title': this.get('url')\n });\n }\n });\n ```\n @method didTransition\n @public\n @since 1.2.0\n */\n didTransition: defaultDidTransition,\n /**\n Handles notifying any listeners of an impending URL\n change.\n Triggers the router level `willTransition` hook.\n @method willTransition\n @public\n @since 1.11.0\n */\n willTransition: defaultWillTransition,\n /**\n Represents the URL of the root of the application, often '/'. This prefix is\n assumed on all routes defined on this router.\n @property rootURL\n @default '/'\n @public\n */\n rootURL: '/',\n /**\n The `location` property determines the type of URL's that your\n application will use.\n The following location types are currently available:\n * `history` - use the browser's history API to make the URLs look just like any standard URL\n * `hash` - use `#` to separate the server part of the URL from the Ember part: `/blog/#/posts/new`\n * `none` - do not store the Ember URL in the actual browser URL (mainly used for testing)\n * `auto` - use the best option based on browser capabilities: `history` if possible, then `hash` if possible, otherwise `none`\n This value is defaulted to `auto` by the `locationType` setting of `/config/environment.js`\n @property location\n @default 'hash'\n @see {Location}\n @public\n */\n location: 'hash',\n /**\n Represents the current URL.\n @method url\n @return {String} The current URL.\n @private\n */\n url: (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'location').getURL();\n })\n });\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE && _deprecatedFeatures.ROUTER_EVENTS) {\n EmberRouter.reopen(_route.ROUTER_EVENT_DEPRECATIONS);\n }\n exports.default = EmberRouter;\n});","enifed('@ember/-internals/routing/lib/system/router_state', ['exports', '@ember/polyfills', '@ember/-internals/routing/lib/utils'], function (exports, _polyfills, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n class RouterState {\n constructor(emberRouter, router, routerJsState) {\n this.emberRouter = emberRouter;\n this.router = router;\n this.routerJsState = routerJsState;\n }\n isActiveIntent(routeName, models, queryParams, queryParamsMustMatch) {\n let state = this.routerJsState;\n if (!this.router.isActiveIntent(routeName, models, undefined, state)) {\n return false;\n }\n if (queryParamsMustMatch && Object.keys(queryParams).length > 0) {\n let visibleQueryParams = (0, _polyfills.assign)({}, queryParams);\n this.emberRouter._prepareQueryParams(routeName, models, visibleQueryParams);\n return (0, _utils.shallowEqual)(visibleQueryParams, state.queryParams);\n }\n return true;\n }\n }\n exports.default = RouterState;\n});","enifed(\"@ember/-internals/routing/lib/system/transition\", [], function () {\n \"use strict\";\n /**\n A Transition is a thennable (a promise-like object) that represents\n an attempt to transition to another route. It can be aborted, either\n explicitly via `abort` or by attempting another transition while a\n previous one is still underway. An aborted transition can also\n be `retry()`d later.\n \n @class Transition\n @public\n */\n /**\n The Transition's internal promise. Calling `.then` on this property\n is that same as calling `.then` on the Transition object itself, but\n this property is exposed for when you want to pass around a\n Transition's promise, but not the Transition object itself, since\n Transition object can be externally `abort`ed, while the promise\n cannot.\n \n @property promise\n @type {Object}\n @public\n */\n /**\n Custom state can be stored on a Transition's `data` object.\n This can be useful for decorating a Transition within an earlier\n hook and shared with a later hook. Properties set on `data` will\n be copied to new transitions generated by calling `retry` on this\n transition.\n \n @property data\n @type {Object}\n @public\n */\n /**\n A standard promise hook that resolves if the transition\n succeeds and rejects if it fails/redirects/aborts.\n \n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n \n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n /**\n \n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n /**\n \n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n /**\n Aborts the Transition. Note you can also implicitly abort a transition\n by initiating another transition while a previous one is underway.\n \n @method abort\n @return {Transition} this transition\n @public\n */\n /**\n \n Retries a previously-aborted transition (making sure to abort the\n transition if it's still active). Returns a new transition that\n represents the new attempt to transition.\n \n @method retry\n @return {Transition} new transition\n @public\n */\n /**\n \n Sets the URL-changing method to be employed at the end of a\n successful transition. By default, a new Transition will just\n use `updateURL`, but passing 'replace' to this method will\n cause the URL to update using 'replaceWith' instead. Omitting\n a parameter will disable the URL change, allowing for transitions\n that don't update the URL at completion (this is also used for\n handleURL, since the URL has already changed before the\n transition took place).\n \n @method method\n @param {String} method the type of URL-changing method to use\n at the end of a transition. Accepted values are 'replace',\n falsy values, or any other non-falsy value (which is\n interpreted as an updateURL transition).\n \n @return {Transition} this transition\n @public\n */\n /**\n \n Fires an event on the current list of resolved/resolving\n handlers within this transition. Useful for firing events\n on route hierarchies that haven't fully been entered yet.\n \n Note: This method is also aliased as `send`\n \n @method trigger\n @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error\n @param {String} name the name of the event to fire\n @public\n */\n /**\n * This property is a `RouteInfo` object that represents\n * where the router is transitioning to. It's important\n * to note that a `RouteInfo` is a linked list and this\n * property is simply represents leafmost route.\n * @property {RouteInfo|RouteInfoWithAttributes} to\n * @public\n * @category ember-routing-router-service\n */\n /**\n * This property is a `RouteInfo` object that represents\n * where transition originated from. It's important\n * to note that a `RouteInfo` is a linked list and this\n * property is simply represents head node of the list.\n * In the case of an initial render, from will be set to\n * `null`.\n * @property {RouteInfoWithAttributes} from\n * @public\n * @category ember-routing-router-service\n */\n /**\n Transitions are aborted and their promises rejected\n when redirects occur; this method returns a promise\n that will follow any redirects that occur and fulfill\n with the value fulfilled by any redirecting transitions\n that occur.\n \n @method followRedirects\n @return {Promise} a promise that fulfills with the same\n value that the final redirecting transition fulfills with\n @public\n */\n});","enifed('@ember/-internals/routing/lib/utils', ['exports', '@ember/-internals/metal', '@ember/-internals/owner', '@ember/error', '@ember/polyfills', 'router_js'], function (exports, _metal, _owner, _error, _polyfills, _router_js) {\n 'use strict';\n\n exports.__esModule = true;\n exports.extractRouteArgs = extractRouteArgs;\n exports.getActiveTargetName = getActiveTargetName;\n exports.stashParamNames = stashParamNames;\n exports.calculateCacheKey = calculateCacheKey;\n exports.normalizeControllerQueryParams = normalizeControllerQueryParams;\n exports.resemblesURL = resemblesURL;\n exports.prefixRouteNameArg = prefixRouteNameArg;\n exports.shallowEqual = shallowEqual;\n\n const ALL_PERIODS_REGEX = /\\./g;\n function extractRouteArgs(args) {\n args = args.slice();\n let possibleQueryParams = args[args.length - 1];\n let queryParams;\n if (possibleQueryParams && possibleQueryParams.hasOwnProperty('queryParams')) {\n queryParams = args.pop().queryParams;\n } else {\n queryParams = {};\n }\n let routeName = args.shift();\n return { routeName, models: args, queryParams };\n }\n function getActiveTargetName(router) {\n let routeInfos = router.activeTransition ? router.activeTransition[_router_js.STATE_SYMBOL].routeInfos : router.state.routeInfos;\n return routeInfos[routeInfos.length - 1].name;\n }\n function stashParamNames(router, routeInfos) {\n if (routeInfos['_namesStashed']) {\n return;\n }\n // This helper exists because router.js/route-recognizer.js awkwardly\n // keeps separate a routeInfo's list of parameter names depending\n // on whether a URL transition or named transition is happening.\n // Hopefully we can remove this in the future.\n let targetRouteName = routeInfos[routeInfos.length - 1].name;\n let recogHandlers = router._routerMicrolib.recognizer.handlersFor(targetRouteName);\n let dynamicParent;\n for (let i = 0; i < routeInfos.length; ++i) {\n let routeInfo = routeInfos[i];\n let names = recogHandlers[i].names;\n if (names.length) {\n dynamicParent = routeInfo;\n }\n routeInfo['_names'] = names;\n let route = routeInfo.route;\n route._stashNames(routeInfo, dynamicParent);\n }\n routeInfos['_namesStashed'] = true;\n }\n function _calculateCacheValuePrefix(prefix, part) {\n // calculates the dot separated sections from prefix that are also\n // at the start of part - which gives us the route name\n // given : prefix = site.article.comments, part = site.article.id\n // - returns: site.article (use get(values[site.article], 'id') to get the dynamic part - used below)\n // given : prefix = site.article, part = site.article.id\n // - returns: site.article. (use get(values[site.article], 'id') to get the dynamic part - used below)\n let prefixParts = prefix.split('.');\n let currPrefix = '';\n for (let i = 0; i < prefixParts.length; i++) {\n let currPart = prefixParts.slice(0, i + 1).join('.');\n if (part.indexOf(currPart) !== 0) {\n break;\n }\n currPrefix = currPart;\n }\n return currPrefix;\n }\n /*\n Stolen from Controller\n */\n function calculateCacheKey(prefix, parts = [], values) {\n let suffixes = '';\n for (let i = 0; i < parts.length; ++i) {\n let part = parts[i];\n let cacheValuePrefix = _calculateCacheValuePrefix(prefix, part);\n let value;\n if (values) {\n if (cacheValuePrefix && cacheValuePrefix in values) {\n let partRemovedPrefix = part.indexOf(cacheValuePrefix) === 0 ? part.substr(cacheValuePrefix.length + 1) : part;\n value = (0, _metal.get)(values[cacheValuePrefix], partRemovedPrefix);\n } else {\n value = (0, _metal.get)(values, part);\n }\n }\n suffixes += `::${part}:${value}`;\n }\n return prefix + suffixes.replace(ALL_PERIODS_REGEX, '-');\n }\n /*\n Controller-defined query parameters can come in three shapes:\n \n Array\n queryParams: ['foo', 'bar']\n Array of simple objects where value is an alias\n queryParams: [\n {\n 'foo': 'rename_foo_to_this'\n },\n {\n 'bar': 'call_bar_this_instead'\n }\n ]\n Array of fully defined objects\n queryParams: [\n {\n 'foo': {\n as: 'rename_foo_to_this'\n },\n }\n {\n 'bar': {\n as: 'call_bar_this_instead',\n scope: 'controller'\n }\n }\n ]\n \n This helper normalizes all three possible styles into the\n 'Array of fully defined objects' style.\n */\n function normalizeControllerQueryParams(queryParams) {\n let qpMap = {};\n for (let i = 0; i < queryParams.length; ++i) {\n accumulateQueryParamDescriptors(queryParams[i], qpMap);\n }\n return qpMap;\n }\n function accumulateQueryParamDescriptors(_desc, accum) {\n let desc = _desc;\n let tmp;\n if (typeof desc === 'string') {\n tmp = {};\n tmp[desc] = { as: null };\n desc = tmp;\n }\n for (let key in desc) {\n if (!desc.hasOwnProperty(key)) {\n return;\n }\n let singleDesc = desc[key];\n if (typeof singleDesc === 'string') {\n singleDesc = { as: singleDesc };\n }\n tmp = accum[key] || { as: null, scope: 'model' };\n (0, _polyfills.assign)(tmp, singleDesc);\n accum[key] = tmp;\n }\n }\n /*\n Check if a routeName resembles a url instead\n \n @private\n */\n function resemblesURL(str) {\n return typeof str === 'string' && (str === '' || str[0] === '/');\n }\n /*\n Returns an arguments array where the route name arg is prefixed based on the mount point\n \n @private\n */\n function prefixRouteNameArg(route, args) {\n let routeName = args[0];\n let owner = (0, _owner.getOwner)(route);\n let prefix = owner.mountPoint;\n // only alter the routeName if it's actually referencing a route.\n if (owner.routable && typeof routeName === 'string') {\n if (resemblesURL(routeName)) {\n throw new _error.default('Programmatic transitions by URL cannot be used within an Engine. Please use the route name instead.');\n } else {\n routeName = `${prefix}.${routeName}`;\n args[0] = routeName;\n }\n }\n return args;\n }\n function shallowEqual(a, b) {\n let k;\n let aCount = 0;\n let bCount = 0;\n for (k in a) {\n if (a.hasOwnProperty(k)) {\n if (a[k] !== b[k]) {\n return false;\n }\n aCount++;\n }\n }\n for (k in b) {\n if (b.hasOwnProperty(k)) {\n bCount++;\n }\n }\n return aCount === bCount;\n }\n});","enifed('@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 let router = {\n transitionTo(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let controller = _controller.default.create({ target: router });\n (0, _owner.setOwner)(controller, engineInstance);\n\n assert.strictEqual(controller.transitionToRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(controller.transitionToRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => controller.transitionToRoute('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(controller.transitionToRoute(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n [\"@test replaceRoute considers an engine's mountPoint\"](assert) {\n let router = {\n replaceWith(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let controller = _controller.default.create({ target: router });\n (0, _owner.setOwner)(controller, engineInstance);\n\n assert.strictEqual(controller.replaceRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(controller.replaceRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => controller.replaceRoute('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(controller.replaceRoute(queryParams), queryParams, 'passes query param only transitions through');\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/auto_location_test', ['@ember/-internals/owner', '@ember/polyfills', '@ember/-internals/browser-environment', '@ember/runloop', '@ember/-internals/metal', '@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 (_owner, _polyfills, _browserEnvironment, _runloop, _metal, _auto_location, _history_location, _hash_location, _none_location, _internalTestHelpers) {\n 'use strict';\n\n function mockBrowserLocation(overrides, assert) {\n return (0, _polyfills.assign)({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n }, overrides);\n }\n\n function mockBrowserHistory(overrides, assert) {\n return (0, _polyfills.assign)({\n pushState() {\n assert.ok(false, 'history.pushState should not be called during testing');\n },\n replaceState() {\n assert.ok(false, 'history.replaceState should not be called during testing');\n }\n }, overrides);\n }\n\n function createLocation(location, history) {\n owner = (0, _internalTestHelpers.buildOwner)();\n\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\n let autolocation = _auto_location.default.create({\n [_owner.OWNER]: owner,\n location: location,\n history: history,\n global: {}\n });\n\n return autolocation;\n }\n\n let location, owner;\n\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 let 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 let browserLocation = mockBrowserLocation({}, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n\n let 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 let browserLocation = mockBrowserLocation({}, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n\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 let browserLocation = mockBrowserLocation({\n hash: '#/testd'\n }, assert);\n\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\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 let browserLocation = mockBrowserLocation({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called');\n }\n }, assert);\n\n location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n };\n\n location.detect();\n\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\n let 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 replace(path) {\n assert.equal(path, 'http://test.com/#/test', 'location.replace should be called with normalized HashLocation path');\n }\n }, assert);\n\n let location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n };\n\n location.detect();\n\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 let 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\n let browserHistory = mockBrowserHistory({\n replaceState(state, title, path) {\n assert.equal(path, '/test', 'history.replaceState should be called with normalized HistoryLocation url');\n }\n }, assert);\n\n let location = createLocation(browserLocation, browserHistory);\n location.detect();\n\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 let browserLocation = mockBrowserLocation({}, assert);\n let expectedMsg = /rootURL must end with a trailing forward slash e.g. \"\\/app\\/\"/;\n\n location = createLocation(browserLocation);\n location.rootURL = 'app';\n\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n\n location.rootURL = '/app';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n\n // Note the trailing whitespace\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 let browserLocation = mockBrowserLocation({\n pathname: '/some/subdir/derp'\n }, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.rootURL = '/some/subdir/';\n\n location.detect();\n\n let 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 let 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\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\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\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 let 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\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\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\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});","enifed('@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 let location;\n\n function createLocation(options, assert) {\n let HashTestLocation = _hash_location.default.extend({\n _location: {\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n }\n });\n\n if (!options) {\n options = {};\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 let tmp = document.createElement('a');\n tmp.href = path;\n\n let protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n let pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n\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\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\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\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\n assert.equal(location.getURL(), '/');\n }\n\n ['@test HashLocation.setURL() correctly sets the url'](assert) {\n createLocation({}, assert);\n\n location.setURL('/bar');\n\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\n createLocation({\n _location: {\n replace(path) {\n assert.equal(path, '#/foo');\n }\n }\n }, assert);\n\n location.replaceURL('/foo');\n\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\n createLocation({\n _location: mockBrowserLocation('/#/foo/bar')\n }, assert);\n\n let callback = function (param) {\n assert.equal(param, '/foo/bar', 'path is passed as param');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n }\n\n [\"@test HashLocation.onUpdateURL doesn't execute callback if lastSetURL === path\"](assert) {\n assert.expect(0);\n\n createLocation({\n _location: {\n hash: '#/foo/bar'\n },\n lastSetURL: '/foo/bar'\n }, assert);\n\n let callback = function () {\n assert.ok(false, 'callback should not be called');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n }\n\n ['@test HashLocation.formatURL() prepends a # to the provided string'](assert) {\n createLocation({}, assert);\n\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\n createLocation({}, assert);\n\n let callback = function () {\n assert.ok(true, 'should invoke callback once');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n\n (0, _runloop.run)(location, 'destroy');\n location = null;\n\n triggerHashchange();\n }\n });\n});","enifed('@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 let FakeHistory, HistoryTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\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 let tmp = document.createElement('a');\n tmp.href = path;\n\n let protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n let pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n\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\n FakeHistory = {\n state: null,\n _states: [],\n replaceState(state) {\n this.state = state;\n this._states[0] = state;\n },\n pushState(state) {\n this.state = state;\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\n HistoryTestLocation.reopen({\n init() {\n assert.ok(true, 'init was called');\n this._super(...arguments);\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\n HistoryTestLocation.reopen({\n initState() {\n this._super(...arguments);\n // these two should be equal to be able\n // to successfully detect webkit initial popstate\n assert.equal(this._previousURL, this.getURL());\n }\n });\n\n createLocation();\n location.initState();\n }\n\n ['@test base URL is removed when retrieving the current pathname'](assert) {\n assert.expect(1);\n\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\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\n assert.equal(location._historyState.path, '/base/one/two');\n assert.ok(location._historyState.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\n FakeHistory.pushState(null);\n location.setURL('/three/four');\n\n assert.equal(location._historyState.path, '/three/four');\n assert.ok(location._historyState.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\n FakeHistory.pushState(null);\n location.replaceURL('/three/four');\n\n assert.equal(location._historyState.path, '/three/four');\n assert.ok(location._historyState.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\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\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 (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'rootURL', '/bar/');\n }\n });\n\n createLocation();\n\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\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 (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'baseURL', '/bar/');\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin'));\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar#pink-power-ranger'));\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin#pink-power-ranger'));\n }\n });\n\n createLocation();\n\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 let location = mockBrowserLocation('//');\n location.pathname = '//'; // mockBrowserLocation does not allow for `//`, so force it\n (0, _metal.set)(this, 'location', location);\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/');\n }\n\n ['@test Existing state is preserved on init'](assert) {\n let existingState = {\n path: '/route/path',\n uuid: 'abcd'\n };\n\n FakeHistory.state = existingState;\n\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/route/path'));\n }\n });\n\n createLocation();\n location.initState();\n assert.deepEqual(location.getState(), existingState);\n }\n });\n});","enifed('@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 let NoneTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\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 (0, _metal.set)(this, 'rootURL', '/en/');\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'rootURL', '/foo/');\n (0, _metal.set)(this, 'path', '/foo/bar');\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/foo/bar/baz');\n }\n });\n\n createLocation();\n\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 (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/bars/baz');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/bars/baz');\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/util_test', ['@ember/polyfills', '@ember/-internals/routing/lib/location/util', 'internal-test-helpers'], function (_polyfills, _util, _internalTestHelpers) {\n 'use strict';\n\n function mockBrowserLocation(overrides, assert) {\n return (0, _polyfills.assign)({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\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\n let expectedURL;\n\n let 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 let location = mockBrowserLocation({ pathname: 'test' }, assert);\n assert.equal((0, _util.getPath)(location), '/test', 'When there is no leading slash, one is added.');\n\n location = mockBrowserLocation({ pathname: '/test' }, 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 let location = mockBrowserLocation({ search: '?foo=bar' }, 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 let location = mockBrowserLocation({\n href: 'http://test.com/about?foo=bar#foo',\n pathname: '/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n\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, { onhashchange() {} }), 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, { onhashchange() {} }), false, 'When in IE7 compatibility mode, never report existence of the feature');\n assert.equal((0, _util.supportsHashChange)(8, { onhashchange() {} }), 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)('', { pushState: true }), 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\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', { pushState: true }), false, 'returns false if Android 2.x stock browser (not Chrome) claiming to support pushState');\n\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', { pushState: true }), false, 'returns false for Android 4.0.x stock browser (not Chrome) claiming to support pushState');\n\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', { pushState: true }), true, 'returns true if Android version begins with 2, but is greater than 2');\n\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', { pushState: true }), true, 'returns true for Chrome (not stock browser) on Android 4.0.x');\n\n // Windows Phone UA and History API: https://github.com/Modernizr/Modernizr/issues/1471\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', { pushState: true }), true, 'returns true for Windows Phone 8.1 with misleading user agent string');\n }\n });\n});","enifed('@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\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 let token = {};\n\n this.cache.stash('foo', 'bar', token);\n this.cache.stash('constructor', 'bar', token);\n\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 let token = {};\n let defaultValue = {};\n\n this.cache.stash('foo', 'bar', token);\n\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 let token = {};\n let defaultValue = {};\n\n this.cache.stash('foo', 'bar', token);\n\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 let defaultValue = {};\n\n assert.strictEqual(this.cache.lookup('boo', 'bar', defaultValue), defaultValue);\n assert.strictEqual(this.cache.lookup('constructor', 'bar', defaultValue), defaultValue);\n }\n });\n});","enifed('@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 const originalDebug = (0, _debug.getDebugFunction)('debug');\n const 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\n return this.visit('/').then(() => {\n let appInstance = this.applicationInstance;\n let appController = appInstance.lookup('controller:app');\n let 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 let 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 let BasicController = _controller.default.extend();\n this.add('controller:basic', BasicController);\n\n return this.visit('/').then(() => {\n let 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 let BasicController = _controller.default.extend();\n this.application.register('controller:basic', BasicController);\n\n return this.visit('/').then(() => {\n let controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n\n assert.ok(controller instanceof BasicController, 'should return base class of controller');\n });\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/dsl_test', ['@ember/-internals/owner', '@ember/-internals/routing/lib/system/router', 'internal-test-helpers'], function (_owner, _router, _internalTestHelpers) {\n 'use strict';\n\n let Router;\n\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n Router = _router.default.extend();\n }\n\n teardown() {\n Router = null;\n }\n\n ['@test should fail when using a reserved route name'](assert) {\n let reservedNames = ['basic', 'application'];\n\n assert.expect(reservedNames.length);\n\n reservedNames.forEach(reservedName => {\n expectAssertion(() => {\n Router = _router.default.extend();\n\n Router.map(function () {\n this.route(reservedName);\n });\n\n let router = Router.create();\n router._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 Router = _router.default.extend();\n\n Router.map(function () {\n this.route('resource/:id');\n });\n\n let router = Router.create();\n router._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 Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.route('blork');\n });\n });\n });\n\n let router = Router.create();\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 Router.map(function () {\n this.route('blork');\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\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 Router.map(function () {\n this.route('blork');\n });\n\n let router = Router.create();\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 Router.map(function () {\n this.route('blork', function () {\n this.route('blorp');\n this.route('bleep', { resetNamespace: true });\n });\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\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\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\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 Router.map(function () {\n assert.throws(() => {\n this.route('posts', { serialize: function () {} });\n }, /Defining a route serializer on route 'posts' outside an Engine is not allowed/);\n });\n\n Router.create()._initRouterJs();\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL with engines', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n Router = _router.default.extend();\n }\n\n teardown() {\n Router = null;\n }\n\n ['@test should allow mounting of engines'](assert) {\n assert.expect(3);\n\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat');\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\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\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', { path: 'custom-chat' });\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\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\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', { as: 'blork' });\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\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 Router.map(function () {\n this.mount('chat');\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\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 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 Router.map(function () {\n this.mount('chat', { as: 'shoutbox' });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\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 Router.map(function () {\n this.mount('chat');\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\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 Router.map(function () {\n this.route('news', function () {\n this.mount('chat');\n this.mount('blog', { resetNamespace: true });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\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\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\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});","enifed('@ember/-internals/routing/tests/system/route_test', ['@ember/-internals/owner', 'internal-test-helpers', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/routing/lib/system/route'], function (_owner, _internalTestHelpers, _service, _runtime, _route) {\n 'use strict';\n\n let route, routeOne, routeTwo, lookupHash;\n\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 let Post = _runtime.Object.extend();\n let post = {};\n\n Post.reopenClass({\n find() {\n return post;\n }\n });\n\n let ownerOptions = {\n ownerOptions: {\n hasRegistration() {\n return true;\n },\n factoryFor(fullName) {\n assert.equal(fullName, 'model:post', 'correct factory was looked up');\n\n return {\n class: Post,\n create() {\n return Post.create();\n }\n };\n }\n }\n };\n\n let owner = (0, _internalTestHelpers.buildOwner)(ownerOptions);\n (0, _owner.setOwner)(route, owner);\n\n route.set('_qp', null);\n\n assert.equal(route.model({ post_id: 1 }), post);\n assert.equal(route.findModel('post', 1), post, '#findModel returns the correct post');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test 'store' can be injected by data persistence frameworks\"](assert) {\n assert.expect(8);\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n let post = {\n id: 1\n };\n\n let Store = _runtime.Object.extend({\n find(type, value) {\n assert.ok(true, 'injected model was called');\n assert.equal(type, 'post', 'correct type was called');\n assert.equal(value, 1, 'correct value was called');\n return post;\n }\n });\n\n owner.register('route:index', _route.default);\n owner.register('store:main', Store);\n\n owner.inject('route', 'store', 'store:main');\n\n route = owner.lookup('route:index');\n\n assert.equal(route.model({ post_id: 1 }), post, '#model returns the correct post');\n assert.equal(route.findModel('post', 1), post, '#findModel returns the correct post');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test assert if 'store.find' method is not found\"]() {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n let Post = _runtime.Object.extend();\n\n owner.register('route:index', _route.default);\n owner.register('model:post', Post);\n\n route = owner.lookup('route:index');\n\n expectAssertion(function () {\n route.findModel('post', 1);\n }, 'Post has no method `find`.');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n ['@test asserts if model class is not found']() {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('route:index', _route.default);\n\n route = owner.lookup('route:index');\n\n expectAssertion(function () {\n route.model({ post_id: 1 });\n }, /You used the dynamic segment post_id in your route undefined, but .Post did not exist and you did not override your route\\'s `model` hook./);\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test 'store' does not need to be injected\"](assert) {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('route:index', _route.default);\n\n route = owner.lookup('route:index');\n\n ignoreAssertion(function () {\n route.model({ post_id: 1 });\n });\n\n assert.ok(true, 'no error was raised');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the router\"](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n\n let foo = { name: 'foo' };\n\n let FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n\n assert.strictEqual(route.modelFor('foo'), foo);\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the routerMicrolib\"](assert) {\n let route = _route.default.create({\n _router: { _routerMicrolib: null }\n });\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n\n let foo = { name: 'foo' };\n\n let FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n\n assert.strictEqual(route.modelFor('foo'), foo);\n\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 let 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 }).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\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 let 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 }).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\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\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 let model = { id: 2, firstName: 'Ned', lastName: 'Ryerson' };\n\n assert.deepEqual(route.serialize(model, ['firstName', 'lastName']), { firstName: 'Ned', lastName: 'Ryerson' }, 'serialized correctly');\n }\n\n ['@test returns model.id if params include *_id'](assert) {\n let model = { id: 2 };\n\n assert.deepEqual(route.serialize(model, ['post_id']), { post_id: 2 }, 'serialized correctly');\n }\n\n ['@test returns checks for existence of model.post_id before trying model.id'](assert) {\n let model = { post_id: 3 };\n\n assert.deepEqual(route.serialize(model, ['post_id']), { post_id: 3 }, 'serialized 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\n let owner = {\n lookup(fullName) {\n return lookupHash[fullName];\n }\n };\n\n routeOne = _route.default.create({ routeName: 'one' });\n routeTwo = _route.default.create({ routeName: 'two' });\n\n (0, _owner.setOwner)(routeOne, owner);\n (0, _owner.setOwner)(routeTwo, owner);\n\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\n routeOne.controllerName = 'test';\n let qp = routeOne.get('_qp');\n\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 let testController = {};\n lookupHash['controller:test'] = testController;\n\n routeOne.controllerName = 'test';\n\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 let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('route:application', _route.default.extend({\n authService: (0, _service.inject)('auth')\n }));\n\n owner.register('service:auth', _service.default.extend());\n\n let appRoute = owner.lookup('route:application');\n let authService = owner.lookup('service:auth');\n\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 let router = {\n _deserializeQueryParams() {},\n _routerMicrolib: {\n state: {\n routeInfos: [{ name: 'posts' }],\n params: {\n 'foo.bar': { a: 'b' },\n 'foo.bar.posts': { c: 'd' }\n }\n }\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n\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 let applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application',\n fullRouteName: 'foo.bar'\n });\n let postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts',\n fullRouteName: 'foo.bar.posts'\n });\n let route = _route.default.create({ _router: router });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.deepEqual(route.paramsFor('application'), { a: 'b' }, 'params match for root `application` route in engine');\n assert.deepEqual(route.paramsFor('posts'), { c: 'd' }, 'params match for `posts` route in engine');\n }\n\n [\"@test modelFor considers an engine's mountPoint\"](assert) {\n let applicationModel = { id: '1' };\n let postsModel = { id: '2' };\n\n let router = {\n _routerMicrolib: {\n activeTransition: {\n resolvedModels: {\n 'foo.bar': applicationModel,\n 'foo.bar.posts': postsModel\n }\n }\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n\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 let applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application'\n });\n let postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts'\n });\n let route = _route.default.create({ _router: router });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n\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 let router = {\n transitionTo(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.strictEqual(route.transitionTo('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(route.transitionTo('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => route.transitionTo('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(route.transitionTo(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n [\"@test intermediateTransitionTo considers an engine's mountPoint\"](assert) {\n let lastRoute;\n let router = {\n intermediateTransitionTo(route) {\n lastRoute = route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n route.intermediateTransitionTo('application');\n assert.strictEqual(lastRoute, 'foo.bar.application', 'properly prefixes application route');\n\n route.intermediateTransitionTo('posts');\n assert.strictEqual(lastRoute, 'foo.bar.posts', 'properly prefixes child routes');\n\n assert.throws(() => route.intermediateTransitionTo('/posts'), 'throws when trying to use a url');\n\n let 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 let router = {\n replaceWith(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.strictEqual(route.replaceWith('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(route.replaceWith('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => route.replaceWith('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(route.replaceWith(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n ['@test `router` is a deprecated one-way alias to `_router`'](assert) {\n let router = {};\n let route = _route.default.create({ _router: router });\n expectDeprecation(function () {\n return assert.equal(route.router, router);\n }, 'Route#router is an intimate API that has been renamed to Route#_router. However you might want to consider using the router service');\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/router_test', ['@ember/-internals/owner', '@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 (_owner, _hash_location, _history_location, _auto_location, _none_location, _router, _internalTestHelpers) {\n 'use strict';\n\n let owner;\n\n function createRouter(settings, options = {}) {\n let CustomRouter = _router.default.extend();\n let router = CustomRouter.create(settings);\n\n if (!options.skipOwner) {\n (0, _owner.setOwner)(router, owner);\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)();\n\n //register the HashLocation (the default)\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 can create a router without an owner'](assert) {\n createRouter(undefined, { disableSetup: true, skipOwner: true });\n\n assert.ok(true, 'no errors were thrown when creating without a container');\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 let router = createRouter(undefined, { disableSetup: true });\n\n assert.ok(!router._routerMicrolib);\n }\n\n ['@test should not reify location until setupRouter is called'](assert) {\n let router = createRouter(undefined, { disableSetup: true });\n assert.equal(typeof router.location, 'string', 'location is specified as a string');\n\n router.setupRouter();\n\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 let router = createRouter();\n let location = router.get('location');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n\n assert.ok(location.isDestroyed, 'location should be destroyed');\n }\n\n ['@test should instantiate its location with its `rootURL`'](assert) {\n let router = createRouter({\n rootURL: '/rootdir/'\n });\n let location = router.get('location');\n\n assert.equal(location.get('rootURL'), '/rootdir/');\n }\n\n ['@test replacePath should be called with the right path'](assert) {\n assert.expect(1);\n\n let location = owner.lookup('location:auto');\n\n let browserLocation = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n };\n\n location.location = browserLocation;\n location.global = { onhashchange() {} };\n location.history = null;\n\n createRouter({\n location: 'auto',\n rootURL: '/rootdir/'\n });\n }\n\n ['@test Router._routePath should consume identical prefixes'](assert) {\n createRouter();\n\n function routePath() {\n let routeInfos = Array.prototype.slice.call(arguments).map(function (s) {\n return { name: s };\n });\n routeInfos.unshift({ 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');\n\n // This makes no sense, not trying to handle it, just\n // making sure it doesn't go boom.\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\n let router;\n let FakeLocation = {\n cancelRouterSetup: true,\n create() {\n return this;\n }\n };\n\n owner.register('location:fake', FakeLocation);\n\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(1);\n\n let location = owner.lookup('location:auto');\n\n location.location = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n };\n location.history = null;\n location.global = {\n onhashchange() {}\n };\n\n createRouter({\n location: 'auto',\n rootURL: '/rootdir/'\n });\n }\n\n ['@test Router#handleURL should remove any #hashes before doing URL transition'](assert) {\n assert.expect(2);\n\n let router = createRouter({\n _doURLTransition(routerJsMethod, url) {\n assert.equal(routerJsMethod, 'handleURL');\n assert.equal(url, '/foo/bar?time=morphin');\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\n let 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 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 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\n let routeInfos = [{\n name: 'about',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about route');\n }\n }\n }\n }, {\n name: 'about.me',\n route: undefined\n }];\n\n (0, _router.triggerEvent)(routeInfos, false, ['loading']);\n }\n\n ['@test transitionTo should throw an error when called after owner is destroyed']() {\n let router = createRouter();\n\n (0, _internalTestHelpers.runDestroy)(router);\n\n router.currentRouteName = 'route-a';\n\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\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});","enifed('@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 let paramName = 'foo';\n let params = [paramName];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\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 let paramName = 'foo';\n let params = [{ foo: 'an_alias' }];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\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 let paramName = 'foo';\n let params = [{ foo: { as: 'an_alias' } }];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\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});","enifed('@ember/-internals/runtime/index', ['exports', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/registry_proxy', '@ember/-internals/runtime/lib/mixins/container_proxy', '@ember/-internals/runtime/lib/copy', '@ember/-internals/runtime/lib/compare', '@ember/-internals/runtime/lib/is-equal', '@ember/-internals/runtime/lib/mixins/array', '@ember/-internals/runtime/lib/mixins/comparable', '@ember/-internals/runtime/lib/system/namespace', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/system/object_proxy', '@ember/-internals/runtime/lib/system/core_object', '@ember/-internals/runtime/lib/mixins/action_handler', '@ember/-internals/runtime/lib/mixins/copyable', '@ember/-internals/runtime/lib/mixins/enumerable', '@ember/-internals/runtime/lib/mixins/-proxy', '@ember/-internals/runtime/lib/mixins/observable', '@ember/-internals/runtime/lib/mixins/mutable_enumerable', '@ember/-internals/runtime/lib/mixins/target_action_support', '@ember/-internals/runtime/lib/mixins/evented', '@ember/-internals/runtime/lib/mixins/promise_proxy', '@ember/-internals/runtime/lib/ext/rsvp', '@ember/-internals/runtime/lib/type-of', '@ember/-internals/runtime/lib/ext/function'], function (exports, _object, _registry_proxy, _container_proxy, _copy, _compare, _isEqual, _array, _comparable, _namespace, _array_proxy, _object_proxy, _core_object, _action_handler, _copyable, _enumerable, _proxy, _observable, _mutable_enumerable, _target_action_support, _evented, _promise_proxy, _rsvp, _typeOf) {\n 'use strict';\n\n exports.__esModule = true;\n exports.typeOf = exports.onerrorDefault = exports.RSVP = exports.PromiseProxyMixin = exports.Evented = exports.TargetActionSupport = exports.MutableEnumerable = exports.Observable = exports._contentFor = exports._ProxyMixin = exports.Enumerable = exports.Copyable = exports.ActionHandler = exports.CoreObject = exports.ObjectProxy = exports.ArrayProxy = exports.Namespace = exports.Comparable = exports.isArray = exports.uniqBy = exports.removeAt = exports.MutableArray = exports.A = exports.NativeArray = exports.isEmberArray = exports.Array = exports.isEqual = exports.compare = exports.copy = exports.ContainerProxyMixin = exports.RegistryProxyMixin = exports.FrameworkObject = exports.Object = undefined;\n Object.defineProperty(exports, 'Object', {\n enumerable: true,\n get: function () {\n return _object.default;\n }\n });\n Object.defineProperty(exports, 'FrameworkObject', {\n enumerable: true,\n get: function () {\n return _object.FrameworkObject;\n }\n });\n Object.defineProperty(exports, 'RegistryProxyMixin', {\n enumerable: true,\n get: function () {\n return _registry_proxy.default;\n }\n });\n Object.defineProperty(exports, 'ContainerProxyMixin', {\n enumerable: true,\n get: function () {\n return _container_proxy.default;\n }\n });\n Object.defineProperty(exports, 'copy', {\n enumerable: true,\n get: function () {\n return _copy.default;\n }\n });\n Object.defineProperty(exports, 'compare', {\n enumerable: true,\n get: function () {\n return _compare.default;\n }\n });\n Object.defineProperty(exports, 'isEqual', {\n enumerable: true,\n get: function () {\n return _isEqual.default;\n }\n });\n Object.defineProperty(exports, 'Array', {\n enumerable: true,\n get: function () {\n return _array.default;\n }\n });\n Object.defineProperty(exports, 'isEmberArray', {\n enumerable: true,\n get: function () {\n return _array.isEmberArray;\n }\n });\n Object.defineProperty(exports, 'NativeArray', {\n enumerable: true,\n get: function () {\n return _array.NativeArray;\n }\n });\n Object.defineProperty(exports, 'A', {\n enumerable: true,\n get: function () {\n return _array.A;\n }\n });\n Object.defineProperty(exports, 'MutableArray', {\n enumerable: true,\n get: function () {\n return _array.MutableArray;\n }\n });\n Object.defineProperty(exports, 'removeAt', {\n enumerable: true,\n get: function () {\n return _array.removeAt;\n }\n });\n Object.defineProperty(exports, 'uniqBy', {\n enumerable: true,\n get: function () {\n return _array.uniqBy;\n }\n });\n Object.defineProperty(exports, 'isArray', {\n enumerable: true,\n get: function () {\n return _array.isArray;\n }\n });\n Object.defineProperty(exports, 'Comparable', {\n enumerable: true,\n get: function () {\n return _comparable.default;\n }\n });\n Object.defineProperty(exports, 'Namespace', {\n enumerable: true,\n get: function () {\n return _namespace.default;\n }\n });\n Object.defineProperty(exports, 'ArrayProxy', {\n enumerable: true,\n get: function () {\n return _array_proxy.default;\n }\n });\n Object.defineProperty(exports, 'ObjectProxy', {\n enumerable: true,\n get: function () {\n return _object_proxy.default;\n }\n });\n Object.defineProperty(exports, 'CoreObject', {\n enumerable: true,\n get: function () {\n return _core_object.default;\n }\n });\n Object.defineProperty(exports, 'ActionHandler', {\n enumerable: true,\n get: function () {\n return _action_handler.default;\n }\n });\n Object.defineProperty(exports, 'Copyable', {\n enumerable: true,\n get: function () {\n return _copyable.default;\n }\n });\n Object.defineProperty(exports, 'Enumerable', {\n enumerable: true,\n get: function () {\n return _enumerable.default;\n }\n });\n Object.defineProperty(exports, '_ProxyMixin', {\n enumerable: true,\n get: function () {\n return _proxy.default;\n }\n });\n Object.defineProperty(exports, '_contentFor', {\n enumerable: true,\n get: function () {\n return _proxy.contentFor;\n }\n });\n Object.defineProperty(exports, 'Observable', {\n enumerable: true,\n get: function () {\n return _observable.default;\n }\n });\n Object.defineProperty(exports, 'MutableEnumerable', {\n enumerable: true,\n get: function () {\n return _mutable_enumerable.default;\n }\n });\n Object.defineProperty(exports, 'TargetActionSupport', {\n enumerable: true,\n get: function () {\n return _target_action_support.default;\n }\n });\n Object.defineProperty(exports, 'Evented', {\n enumerable: true,\n get: function () {\n return _evented.default;\n }\n });\n Object.defineProperty(exports, 'PromiseProxyMixin', {\n enumerable: true,\n get: function () {\n return _promise_proxy.default;\n }\n });\n Object.defineProperty(exports, 'RSVP', {\n enumerable: true,\n get: function () {\n return _rsvp.default;\n }\n });\n Object.defineProperty(exports, 'onerrorDefault', {\n enumerable: true,\n get: function () {\n return _rsvp.onerrorDefault;\n }\n });\n Object.defineProperty(exports, 'typeOf', {\n enumerable: true,\n get: function () {\n return _typeOf.typeOf;\n }\n });\n});","enifed('@ember/-internals/runtime/lib/compare', ['exports', '@ember/-internals/runtime/lib/type-of', '@ember/-internals/runtime/lib/mixins/comparable'], function (exports, _typeOf, _comparable) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = compare;\n\n\n const TYPE_ORDER = {\n undefined: 0,\n null: 1,\n boolean: 2,\n number: 3,\n string: 4,\n array: 5,\n object: 6,\n instance: 7,\n function: 8,\n class: 9,\n date: 10\n };\n\n //\n // the spaceship operator\n //\n // `. ___\n // __,' __`. _..----....____\n // __...--.'``;. ,. ;``--..__ .' ,-._ _.-'\n // _..-''-------' `' `' `' O ``-''._ (,;') _,'\n // ,'________________ \\`-._`-','\n // `._ ```````````------...___ '-.._'-:\n // ```--.._ ,. ````--...__\\-.\n // `.--. `-` \"INFINITY IS LESS ____ | |`\n // `. `. THAN BEYOND\" ,'`````. ; ;`\n // `._`. __________ `. \\'__/`\n // `-:._____/______/___/____`. \\ `\n // | `._ `. \\\n // `._________`-. `. `.___\n // SSt `------'`\n function spaceship(a, b) {\n let diff = a - b;\n return (diff > 0) - (diff < 0);\n }\n\n /**\n @module @ember/utils\n */\n\n /**\n Compares two javascript values and returns:\n \n - -1 if the first is smaller than the second,\n - 0 if both are equal,\n - 1 if the first is greater than the second.\n \n ```javascript\n import { compare } from '@ember/utils';\n \n compare('hello', 'hello'); // 0\n compare('abc', 'dfg'); // -1\n compare(2, 1); // 1\n ```\n \n If the types of the two objects are different precedence occurs in the\n following order, with types earlier in the list considered `<` types\n later in the list:\n \n - undefined\n - null\n - boolean\n - number\n - string\n - array\n - object\n - instance\n - function\n - class\n - date\n \n ```javascript\n import { compare } from '@ember/utils';\n \n compare('hello', 50); // 1\n compare(50, 'hello'); // -1\n ```\n \n @method compare\n @for @ember/utils\n @static\n @param {Object} v First value to compare\n @param {Object} w Second value to compare\n @return {Number} -1 if v < w, 0 if v = w and 1 if v > w.\n @public\n */\n function compare(v, w) {\n if (v === w) {\n return 0;\n }\n\n let type1 = (0, _typeOf.typeOf)(v);\n let type2 = (0, _typeOf.typeOf)(w);\n\n if (type1 === 'instance' && _comparable.default.detect(v) && v.constructor.compare) {\n return v.constructor.compare(v, w);\n }\n\n if (type2 === 'instance' && _comparable.default.detect(w) && w.constructor.compare) {\n return w.constructor.compare(w, v) * -1;\n }\n\n let res = spaceship(TYPE_ORDER[type1], TYPE_ORDER[type2]);\n\n if (res !== 0) {\n return res;\n }\n\n // types are equal - so we have to check values now\n switch (type1) {\n case 'boolean':\n case 'number':\n return spaceship(v, w);\n\n case 'string':\n return spaceship(v.localeCompare(w), 0);\n\n case 'array':\n {\n let vLen = v.length;\n let wLen = w.length;\n let len = Math.min(vLen, wLen);\n\n for (let i = 0; i < len; i++) {\n let r = compare(v[i], w[i]);\n if (r !== 0) {\n return r;\n }\n }\n\n // all elements are equal now\n // shorter array should be ordered first\n return spaceship(vLen, wLen);\n }\n case 'instance':\n if (_comparable.default.detect(v)) {\n return v.compare(v, w);\n }\n return 0;\n\n case 'date':\n return spaceship(v.getTime(), w.getTime());\n\n default:\n return 0;\n }\n }\n});","enifed('@ember/-internals/runtime/lib/copy', ['exports', '@ember/debug', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/copyable'], function (exports, _debug, _object, _copyable) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = copy;\n\n\n /**\n @module @ember/object\n */\n function _copy(obj, deep, seen, copies) {\n // primitive data types are immutable, just return them.\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n let ret, loc;\n\n // avoid cyclical loops\n if (deep && (loc = seen.indexOf(obj)) >= 0) {\n return copies[loc];\n }\n\n if (deep) {\n seen.push(obj);\n }\n\n // IMPORTANT: this specific test will detect a native array only. Any other\n // object will need to implement Copyable.\n if (Array.isArray(obj)) {\n ret = obj.slice();\n\n if (deep) {\n copies.push(ret);\n loc = ret.length;\n\n while (--loc >= 0) {\n ret[loc] = _copy(ret[loc], deep, seen, copies);\n }\n }\n } else if (_copyable.default.detect(obj)) {\n ret = obj.copy(deep, seen, copies);\n if (deep) {\n copies.push(ret);\n }\n } else if (obj instanceof Date) {\n ret = new Date(obj.getTime());\n if (deep) {\n copies.push(ret);\n }\n } else {\n (0, _debug.assert)('Cannot clone an EmberObject that does not implement Copyable', !(obj instanceof _object.default) || _copyable.default.detect(obj));\n\n ret = {};\n if (deep) {\n copies.push(ret);\n }\n\n let key;\n for (key in obj) {\n // support Null prototype\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n // Prevents browsers that don't respect non-enumerability from\n // copying internal Ember properties\n if (key.substring(0, 2) === '__') {\n continue;\n }\n\n ret[key] = deep ? _copy(obj[key], deep, seen, copies) : obj[key];\n }\n }\n\n return ret;\n }\n\n /**\n Creates a shallow copy of the passed object. A deep copy of the object is\n returned if the optional `deep` argument is `true`.\n \n If the passed object implements the `Copyable` interface, then this\n function will delegate to the object's `copy()` method and return the\n result. See `Copyable` for further details.\n \n For primitive values (which are immutable in JavaScript), the passed object\n is simply returned.\n \n @method copy\n @deprecated Use 'ember-copy' addon instead\n @static\n @for @ember/object/internals\n @param {Object} obj The object to clone\n @param {Boolean} [deep=false] If true, a deep copy of the object is made.\n @return {Object} The copied object\n @public\n */\n function copy(obj, deep) {\n (0, _debug.deprecate)('Use ember-copy addon instead of copy method and Copyable mixin.', false, {\n id: 'ember-runtime.deprecate-copy-copyable',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x/#toc_ember-runtime-deprecate-copy-copyable'\n });\n\n // fast paths\n if ('object' !== typeof obj || obj === null) {\n return obj; // can't copy primitives\n }\n\n if (!Array.isArray(obj) && _copyable.default.detect(obj)) {\n return obj.copy(deep);\n }\n\n return _copy(obj, deep, deep ? [] : null, deep ? [] : null);\n }\n});","enifed('@ember/-internals/runtime/lib/ext/function', ['@ember/-internals/environment', '@ember/-internals/metal'], function (_environment, _metal) {\n 'use strict';\n\n /**\n @module ember\n */\n\n if (_environment.ENV.EXTEND_PROTOTYPES.Function) {\n Object.defineProperties(Function.prototype, {\n /**\n The `property` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n `true`, which is the default.\n Computed properties allow you to treat a function like a property:\n ```app/utils/president.js\n import EmberObject from '@ember/object';\n export default EmberObject.extend({\n firstName: '',\n lastName: '',\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n }.property() // Call this flag to mark the function as a property\n });\n ```\n ```javascript\n let president = President.create({\n firstName: 'Barack',\n lastName: 'Obama'\n });\n president.get('fullName'); // 'Barack Obama'\n ```\n Treating a function like a property is useful because they can work with\n bindings, just like any other property.\n Many computed properties have dependencies on other properties. For\n example, in the above example, the `fullName` property depends on\n `firstName` and `lastName` to determine its value. You can tell Ember\n about these dependencies like this:\n ```app/utils/president.js\n import EmberObject from '@ember/object';\n export default EmberObject.extend({\n firstName: '',\n lastName: '',\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n // Tell Ember.js that this computed property depends on firstName\n // and lastName\n }.property('firstName', 'lastName')\n });\n ```\n Make sure you list these dependencies so Ember knows when to update\n bindings that connect to a computed property. Changing a dependency\n will not immediately trigger an update of the computed property, but\n will instead clear the cache so that it is updated when the next `get`\n is called on the property.\n See [ComputedProperty](/api/ember/release/classes/ComputedProperty), [@ember/object/computed](/api/ember/release/classes/@ember%2Fobject%2Fcomputed).\n @method property\n @for Function\n @public\n */\n property: {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return (0, _metal.computed)(...arguments, this);\n }\n },\n\n /**\n The `observes` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n true, which is the default.\n You can observe property changes simply by adding the `observes`\n call to the end of your method declarations in classes that you write.\n For example:\n ```javascript\n import EmberObject from '@ember/object';\n EmberObject.extend({\n valueObserver: function() {\n // Executes whenever the \"value\" property changes\n }.observes('value')\n });\n ```\n In the future this method may become asynchronous.\n See `observer`.\n @method observes\n @for Function\n @public\n */\n observes: {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return (0, _metal.observer)(...arguments, this);\n }\n },\n\n /**\n The `on` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n true, which is the default.\n You can listen for events simply by adding the `on` call to the end of\n your method declarations in classes or mixins that you write. For example:\n ```javascript\n import Mixin from '@ember/mixin';\n Mixin.create({\n doSomethingWithElement: function() {\n // Executes whenever the \"didInsertElement\" event fires\n }.on('didInsertElement')\n });\n ```\n See `@ember/object/evented/on`.\n @method on\n @for Function\n @public\n */\n\n on: {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return (0, _metal.on)(...arguments, this);\n }\n }\n });\n }\n});","enifed('@ember/-internals/runtime/lib/ext/rsvp', ['exports', 'rsvp', '@ember/runloop', '@ember/-internals/error-handling', '@ember/debug'], function (exports, _rsvp, _runloop, _errorHandling, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.onerrorDefault = onerrorDefault;\n\n\n _rsvp.configure('async', (callback, promise) => {\n _runloop.backburner.schedule('actions', null, callback, promise);\n });\n\n _rsvp.configure('after', cb => {\n _runloop.backburner.schedule(_runloop._rsvpErrorQueue, null, cb);\n });\n\n _rsvp.on('error', onerrorDefault);\n\n function onerrorDefault(reason) {\n let error = errorFor(reason);\n if (error) {\n let overrideDispatch = (0, _errorHandling.getDispatchOverride)();\n if (overrideDispatch) {\n overrideDispatch(error);\n } else {\n throw error;\n }\n }\n }\n\n function errorFor(reason) {\n if (!reason) return;\n\n if (reason.errorThrown) {\n return unwrapErrorThrown(reason);\n }\n\n if (reason.name === 'UnrecognizedURLError') {\n (0, _debug.assert)(`The URL '${reason.message}' did not match any routes in your application`, false);\n return;\n }\n\n if (reason.name === 'TransitionAborted') {\n return;\n }\n\n return reason;\n }\n\n function unwrapErrorThrown(reason) {\n let error = reason.errorThrown;\n if (typeof error === 'string') {\n error = new Error(error);\n }\n Object.defineProperty(error, '__reason_with_error_thrown__', {\n value: reason,\n enumerable: false\n });\n return error;\n }\n\n exports.default = _rsvp;\n});","enifed('@ember/-internals/runtime/lib/is-equal', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = isEqual;\n /**\n @module @ember/utils\n */\n /**\n Compares two objects, returning true if they are equal.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n \n isEqual('hello', 'hello'); // true\n isEqual(1, 2); // false\n ```\n \n `isEqual` is a more specific comparison than a triple equal comparison.\n It will call the `isEqual` instance method on the objects being\n compared, allowing finer control over when objects should be considered\n equal to each other.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n isEqual(other) { return this.ssn == other.ssn; }\n });\n \n let personA = Person.create({name: 'Muhammad Ali', ssn: '123-45-6789'});\n let personB = Person.create({name: 'Cassius Clay', ssn: '123-45-6789'});\n \n isEqual(personA, personB); // true\n ```\n \n Due to the expense of array comparisons, collections will never be equal to\n each other even if each of their items are equal to each other.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n \n isEqual([4, 2], [4, 2]); // false\n ```\n \n @method isEqual\n @for @ember/utils\n @static\n @param {Object} a first object to compare\n @param {Object} b second object to compare\n @return {Boolean}\n @public\n */\n function isEqual(a, b) {\n if (a && typeof a.isEqual === 'function') {\n return a.isEqual(b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n return a === b;\n }\n});","enifed('@ember/-internals/runtime/lib/mixins/-proxy', ['exports', '@glimmer/reference', '@ember/-internals/meta', '@ember/-internals/metal', '@ember/-internals/utils', '@ember/debug'], function (exports, _reference, _meta, _metal, _utils, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.contentFor = contentFor;\n\n\n function contentPropertyDidChange(content, contentKey) {\n let key = contentKey.slice(8); // remove \"content.\"\n if (key in this) {\n return;\n } // if shadowed in proxy\n (0, _metal.notifyPropertyChange)(this, key);\n } /**\n @module ember\n */\n\n function contentFor(proxy, m) {\n let content = (0, _metal.get)(proxy, 'content');\n let tag = (m === undefined ? (0, _meta.meta)(proxy) : m).readableTag();\n if (tag !== undefined) {\n tag.inner.second.inner.update((0, _metal.tagFor)(content));\n }\n return content;\n }\n\n /**\n `Ember.ProxyMixin` forwards all properties not defined by the proxy itself\n to a proxied `content` object. See ObjectProxy for more details.\n \n @class ProxyMixin\n @namespace Ember\n @private\n */\n exports.default = _metal.Mixin.create({\n /**\n The object whose properties will be forwarded.\n @property content\n @type EmberObject\n @default null\n @private\n */\n content: null,\n\n init() {\n this._super(...arguments);\n (0, _utils.setProxy)(this);\n let m = (0, _meta.meta)(this);\n m.writableTag(() => (0, _reference.combine)([_reference.DirtyableTag.create(), _reference.UpdatableTag.create(_reference.CONSTANT_TAG)]));\n },\n\n willDestroy() {\n this.set('content', null);\n this._super(...arguments);\n },\n\n isTruthy: (0, _metal.computed)('content', function () {\n return !!(0, _metal.get)(this, 'content');\n }),\n\n willWatchProperty(key) {\n let contentKey = `content.${key}`;\n (0, _metal.addObserver)(this, contentKey, null, contentPropertyDidChange);\n },\n\n didUnwatchProperty(key) {\n let contentKey = `content.${key}`;\n (0, _metal.removeObserver)(this, contentKey, null, contentPropertyDidChange);\n },\n\n unknownProperty(key) {\n let content = contentFor(this);\n if (content) {\n return (0, _metal.get)(content, key);\n }\n },\n\n setUnknownProperty(key, value) {\n let m = (0, _meta.meta)(this);\n\n if (m.isInitializing() || m.isPrototypeMeta(this)) {\n // if marked as prototype or object is initializing then just\n // defineProperty rather than delegate\n (0, _metal.defineProperty)(this, key, null, value);\n return value;\n }\n\n let content = contentFor(this, m);\n\n (0, _debug.assert)(`Cannot delegate set('${key}', ${value}) to the \\'content\\' property of object proxy ${this}: its 'content' is undefined.`, content);\n\n return (0, _metal.set)(content, key, value);\n }\n });\n});","enifed('@ember/-internals/runtime/lib/mixins/action_handler', ['exports', '@ember/-internals/metal', '@ember/debug'], function (exports, _metal, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n `Ember.ActionHandler` is available on some familiar classes including\n `Route`, `Component`, and `Controller`.\n (Internally the mixin is used by `Ember.CoreView`, `Ember.ControllerMixin`,\n and `Route` and available to the above classes through\n inheritance.)\n \n @class ActionHandler\n @namespace Ember\n @private\n */\n /**\n @module ember\n */\n\n const ActionHandler = _metal.Mixin.create({\n mergedProperties: ['actions'],\n\n /**\n The collection of functions, keyed by name, available on this\n `ActionHandler` as action targets.\n These functions will be invoked when a matching `{{action}}` is triggered\n from within a template and the application's current route is this route.\n Actions can also be invoked from other parts of your application\n via `ActionHandler#send`.\n The `actions` hash will inherit action handlers from\n the `actions` hash defined on extended parent classes\n or mixins rather than just replace the entire hash, e.g.:\n ```app/mixins/can-display-banner.js\n import Mixin from '@ember/mixin';\n export default Mixin.create({\n actions: {\n displayBanner(msg) {\n // ...\n }\n }\n });\n ```\n ```app/routes/welcome.js\n import Route from '@ember/routing/route';\n import CanDisplayBanner from '../mixins/can-display-banner';\n export default Route.extend(CanDisplayBanner, {\n actions: {\n playMusic() {\n // ...\n }\n }\n });\n // `WelcomeRoute`, when active, will be able to respond\n // to both actions, since the actions hash is merged rather\n // then replaced when extending mixins / parent classes.\n this.send('displayBanner');\n this.send('playMusic');\n ```\n Within a Controller, Route or Component's action handler,\n the value of the `this` context is the Controller, Route or\n Component object:\n ```app/routes/song.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n myAction() {\n this.controllerFor(\"song\");\n this.transitionTo(\"other.route\");\n ...\n }\n }\n });\n ```\n It is also possible to call `this._super(...arguments)` from within an\n action handler if it overrides a handler defined on a parent\n class or mixin:\n Take for example the following routes:\n ```app/mixins/debug-route.js\n import Mixin from '@ember/mixin';\n export default Mixin.create({\n actions: {\n debugRouteInformation() {\n console.debug(\"It's a-me, console.debug!\");\n }\n }\n });\n ```\n ```app/routes/annoying-debug.js\n import Route from '@ember/routing/route';\n import DebugRoute from '../mixins/debug-route';\n export default Route.extend(DebugRoute, {\n actions: {\n debugRouteInformation() {\n // also call the debugRouteInformation of mixed in DebugRoute\n this._super(...arguments);\n // show additional annoyance\n window.alert(...);\n }\n }\n });\n ```\n ## Bubbling\n By default, an action will stop bubbling once a handler defined\n on the `actions` hash handles it. To continue bubbling the action,\n you must return `true` from the handler:\n ```app/router.js\n Router.map(function() {\n this.route(\"album\", function() {\n this.route(\"song\");\n });\n });\n ```\n ```app/routes/album.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n startPlaying: function() {\n }\n }\n });\n ```\n ```app/routes/album-song.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n startPlaying() {\n // ...\n if (actionShouldAlsoBeTriggeredOnParentRoute) {\n return true;\n }\n }\n }\n });\n ```\n @property actions\n @type Object\n @default null\n @public\n */\n\n /**\n Triggers a named action on the `ActionHandler`. Any parameters\n supplied after the `actionName` string will be passed as arguments\n to the action target function.\n If the `ActionHandler` has its `target` property set, actions may\n bubble to the `target`. Bubbling happens when an `actionName` can\n not be found in the `ActionHandler`'s `actions` hash or if the\n action target function returns `true`.\n Example\n ```app/routes/welcome.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n playTheme() {\n this.send('playMusic', 'theme.mp3');\n },\n playMusic(track) {\n // ...\n }\n }\n });\n ```\n @method send\n @param {String} actionName The action to trigger\n @param {*} context a context to send with the action\n @public\n */\n send(actionName, ...args) {\n (0, _debug.assert)(`Attempted to call .send() with the action '${actionName}' on the destroyed object '${this}'.`, !this.isDestroying && !this.isDestroyed);\n if (this.actions && this.actions[actionName]) {\n let shouldBubble = this.actions[actionName].apply(this, args) === true;\n if (!shouldBubble) {\n return;\n }\n }\n\n let target = (0, _metal.get)(this, 'target');\n if (target) {\n (0, _debug.assert)(`The \\`target\\` for ${this} (${target}) does not have a \\`send\\` method`, typeof target.send === 'function');\n target.send(...arguments);\n }\n }\n });\n\n exports.default = ActionHandler;\n});","enifed('@ember/-internals/runtime/lib/mixins/array', ['exports', '@ember/deprecated-features', '@glimmer/env', '@ember/-internals/metal', '@ember/-internals/utils', '@ember/debug', '@ember/-internals/runtime/lib/mixins/enumerable', '@ember/-internals/runtime/lib/compare', '@ember/-internals/environment', '@ember/-internals/runtime/lib/mixins/observable', '@ember/-internals/runtime/lib/copy', '@ember/-internals/runtime/lib/mixins/mutable_enumerable', '@ember/-internals/runtime/lib/type-of'], function (exports, _deprecatedFeatures, _env, _metal, _utils, _debug, _enumerable, _compare, _environment, _observable, _copy, _mutable_enumerable, _typeOf) {\n 'use strict';\n\n exports.__esModule = true;\n exports.MutableArray = exports.NativeArray = exports.A = undefined;\n exports.isEmberArray = isEmberArray;\n exports.uniqBy = uniqBy;\n exports.removeAt = removeAt;\n exports.isArray = isArray;\n\n\n const EMPTY_ARRAY = Object.freeze([]); /**\n @module @ember/array\n */\n\n const EMBER_ARRAY = (0, _utils.symbol)('EMBER_ARRAY');\n\n function isEmberArray(obj) {\n return obj && obj[EMBER_ARRAY];\n }\n\n const identityFunction = item => item;\n\n function uniqBy(array, key = identityFunction) {\n (0, _debug.assert)(`first argument passed to \\`uniqBy\\` should be array`, isArray(array));\n\n let ret = A();\n let seen = new Set();\n let getter = typeof key === 'function' ? key : item => (0, _metal.get)(item, key);\n\n array.forEach(item => {\n let val = getter(item);\n if (!seen.has(val)) {\n seen.add(val);\n ret.push(item);\n }\n });\n\n return ret;\n }\n\n function iter(key, value) {\n let valueProvided = arguments.length === 2;\n return valueProvided ? item => value === (0, _metal.get)(item, key) : item => !!(0, _metal.get)(item, key);\n }\n\n function findIndex(array, predicate, startAt) {\n let len = array.length;\n for (let index = startAt; index < len; index++) {\n let item = (0, _metal.objectAt)(array, index);\n if (predicate(item, index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n function find(array, callback, target) {\n let predicate = callback.bind(target);\n let index = findIndex(array, predicate, 0);\n return index === -1 ? undefined : (0, _metal.objectAt)(array, index);\n }\n\n function any(array, callback, target) {\n let predicate = callback.bind(target);\n return findIndex(array, predicate, 0) !== -1;\n }\n\n function every(array, callback, target) {\n let cb = callback.bind(target);\n let predicate = (item, index, array) => !cb(item, index, array);\n return findIndex(array, predicate, 0) === -1;\n }\n\n function indexOf(array, val, startAt = 0, withNaNCheck) {\n let len = array.length;\n\n if (startAt < 0) {\n startAt += len;\n }\n\n // SameValueZero comparison (NaN !== NaN)\n let predicate = withNaNCheck && val !== val ? item => item !== item : item => item === val;\n return findIndex(array, predicate, startAt);\n }\n\n function removeAt(array, index, len = 1) {\n (0, _debug.assert)(`\\`removeAt\\` index provided is out of range`, index > -1 && index < array.length);\n (0, _metal.replace)(array, index, len, EMPTY_ARRAY);\n return array;\n }\n\n function insertAt(array, index, item) {\n (0, _debug.assert)(`\\`insertAt\\` index provided is out of range`, index > -1 && index <= array.length);\n (0, _metal.replace)(array, index, 0, [item]);\n return item;\n }\n\n /**\n Returns true if the passed object is an array or Array-like.\n \n Objects are considered Array-like if any of the following are true:\n \n - the object is a native Array\n - the object has an objectAt property\n - the object is an Object, and has a length property\n \n Unlike `typeOf` this method returns true even if the passed object is\n not formally an array but appears to be array-like (i.e. implements `Array`)\n \n ```javascript\n import { isArray } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n isArray(); // false\n isArray([]); // true\n isArray(ArrayProxy.create({ content: [] })); // true\n ```\n \n @method isArray\n @static\n @for @ember/array\n @param {Object} obj The object to test\n @return {Boolean} true if the passed object is an array or Array-like\n @public\n */\n function isArray(_obj) {\n let obj = _obj;\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY && typeof _obj === 'object' && _obj !== null) {\n let possibleProxyContent = _obj[_metal.PROXY_CONTENT];\n if (possibleProxyContent !== undefined) {\n obj = possibleProxyContent;\n }\n }\n\n if (!obj || obj.setInterval) {\n return false;\n }\n if (Array.isArray(obj) || ArrayMixin.detect(obj)) {\n return true;\n }\n\n let type = (0, _typeOf.typeOf)(obj);\n if ('array' === type) {\n return true;\n }\n let length = obj.length;\n if (typeof length === 'number' && length === length && 'object' === type) {\n return true;\n }\n return false;\n }\n\n // ..........................................................\n // ARRAY\n //\n /**\n This mixin implements Observer-friendly Array-like behavior. It is not a\n concrete implementation, but it can be used up by other classes that want\n to appear like arrays.\n \n For example, ArrayProxy is a concrete classes that can\n be instantiated to implement array-like behavior. Both of these classes use\n the Array Mixin by way of the MutableArray mixin, which allows observable\n changes to be made to the underlying array.\n \n This mixin defines methods specifically for collections that provide\n index-ordered access to their contents. When you are designing code that\n needs to accept any kind of Array-like object, you should use these methods\n instead of Array primitives because these will properly notify observers of\n changes to the array.\n \n Although these methods are efficient, they do add a layer of indirection to\n your application so it is a good idea to use them only when you need the\n flexibility of using both true JavaScript arrays and \"virtual\" arrays such\n as controllers and collections.\n \n You can use the methods defined in this module to access and modify array\n contents in a KVO-friendly way. You can also be notified whenever the\n membership of an array changes by using `.observes('myArray.[]')`.\n \n To support `EmberArray` in your own class, you must override two\n primitives to use it: `length()` and `objectAt()`.\n \n @class EmberArray\n @uses Enumerable\n @since Ember 0.9.0\n @public\n */\n const ArrayMixin = _metal.Mixin.create(_enumerable.default, {\n [EMBER_ARRAY]: true,\n\n /**\n __Required.__ You must implement this method to apply this mixin.\n Your array must support the `length` property. Your replace methods should\n set this property whenever it changes.\n @property {Number} length\n @public\n */\n\n /**\n Returns the object at the given `index`. If the given `index` is negative\n or is greater or equal than the array length, returns `undefined`.\n This is one of the primitives you must implement to support `EmberArray`.\n If your object supports retrieving the value of an array item using `get()`\n (i.e. `myArray.get(0)`), then you do not need to implement this method\n yourself.\n ```javascript\n let arr = ['a', 'b', 'c', 'd'];\n arr.objectAt(0); // 'a'\n arr.objectAt(3); // 'd'\n arr.objectAt(-1); // undefined\n arr.objectAt(4); // undefined\n arr.objectAt(5); // undefined\n ```\n @method objectAt\n @param {Number} idx The index of the item to return.\n @return {*} item at index or undefined\n @public\n */\n\n /**\n This returns the objects at the specified indexes, using `objectAt`.\n ```javascript\n let arr = ['a', 'b', 'c', 'd'];\n arr.objectsAt([0, 1, 2]); // ['a', 'b', 'c']\n arr.objectsAt([2, 3, 4]); // ['c', 'd', undefined]\n ```\n @method objectsAt\n @param {Array} indexes An array of indexes of items to return.\n @return {Array}\n @public\n */\n objectsAt(indexes) {\n return indexes.map(idx => (0, _metal.objectAt)(this, idx));\n },\n\n /**\n This is the handler for the special array content property. If you get\n this property, it will return this. If you set this property to a new\n array, it will replace the current content.\n @property []\n @return this\n @public\n */\n '[]': (0, _metal.computed)({\n get() {\n return this;\n },\n set(key, value) {\n this.replace(0, this.length, value);\n return this;\n }\n }),\n\n /**\n The first object in the array, or `undefined` if the array is empty.\n @property firstObject\n @return {Object | undefined} The first object in the array\n @public\n */\n firstObject: (0, _metal.computed)(function () {\n return (0, _metal.objectAt)(this, 0);\n }).readOnly(),\n\n /**\n The last object in the array, or `undefined` if the array is empty.\n @property lastObject\n @return {Object | undefined} The last object in the array\n @public\n */\n lastObject: (0, _metal.computed)(function () {\n return (0, _metal.objectAt)(this, this.length - 1);\n }).readOnly(),\n\n // Add any extra methods to EmberArray that are native to the built-in Array.\n /**\n Returns a new array that is a slice of the receiver. This implementation\n uses the observable array methods to retrieve the objects for the new\n slice.\n ```javascript\n let arr = ['red', 'green', 'blue'];\n arr.slice(0); // ['red', 'green', 'blue']\n arr.slice(0, 2); // ['red', 'green']\n arr.slice(1, 100); // ['green', 'blue']\n ```\n @method slice\n @param {Number} beginIndex (Optional) index to begin slicing from.\n @param {Number} endIndex (Optional) index to end the slice at (but not included).\n @return {Array} New array with specified slice\n @public\n */\n slice(beginIndex = 0, endIndex) {\n let ret = A();\n let length = this.length;\n\n if (beginIndex < 0) {\n beginIndex = length + beginIndex;\n }\n\n if (endIndex === undefined || endIndex > length) {\n endIndex = length;\n } else if (endIndex < 0) {\n endIndex = length + endIndex;\n }\n\n while (beginIndex < endIndex) {\n ret[ret.length] = (0, _metal.objectAt)(this, beginIndex++);\n }\n\n return ret;\n },\n\n /**\n Returns the index of the given object's first occurrence.\n If no `startAt` argument is given, the starting location to\n search is 0. If it's negative, will count backward from\n the end of the array. Returns -1 if no match is found.\n ```javascript\n let arr = ['a', 'b', 'c', 'd', 'a'];\n arr.indexOf('a'); // 0\n arr.indexOf('z'); // -1\n arr.indexOf('a', 2); // 4\n arr.indexOf('a', -1); // 4\n arr.indexOf('b', 3); // -1\n arr.indexOf('a', 100); // -1\n ```\n @method indexOf\n @param {Object} object the item to search for\n @param {Number} startAt optional starting location to search, default 0\n @return {Number} index or -1 if not found\n @public\n */\n\n indexOf(object, startAt) {\n return indexOf(this, object, startAt, false);\n },\n\n /**\n Returns the index of the given object's last occurrence.\n If no `startAt` argument is given, the search starts from\n the last position. If it's negative, will count backward\n from the end of the array. Returns -1 if no match is found.\n ```javascript\n let arr = ['a', 'b', 'c', 'd', 'a'];\n arr.lastIndexOf('a'); // 4\n arr.lastIndexOf('z'); // -1\n arr.lastIndexOf('a', 2); // 0\n arr.lastIndexOf('a', -1); // 4\n arr.lastIndexOf('b', 3); // 1\n arr.lastIndexOf('a', 100); // 4\n ```\n @method lastIndexOf\n @param {Object} object the item to search for\n @param {Number} startAt optional starting location to search, default 0\n @return {Number} index or -1 if not found\n @public\n */\n lastIndexOf(object, startAt) {\n let len = this.length;\n\n if (startAt === undefined || startAt >= len) {\n startAt = len - 1;\n }\n\n if (startAt < 0) {\n startAt += len;\n }\n\n for (let idx = startAt; idx >= 0; idx--) {\n if ((0, _metal.objectAt)(this, idx) === object) {\n return idx;\n }\n }\n\n return -1;\n },\n\n // ..........................................................\n // ARRAY OBSERVERS\n //\n\n /**\n Adds an array observer to the receiving array. The array observer object\n normally must implement two methods:\n * `willChange(observedObj, start, removeCount, addCount)` - This method will be\n called just before the array is modified.\n * `didChange(observedObj, start, removeCount, addCount)` - This method will be\n called just after the array is modified.\n Both callbacks will be passed the observed object, starting index of the\n change as well as a count of the items to be removed and added. You can use\n these callbacks to optionally inspect the array during the change, clear\n caches, or do any other bookkeeping necessary.\n In addition to passing a target, you can also include an options hash\n which you can use to override the method names that will be invoked on the\n target.\n @method addArrayObserver\n @param {Object} target The observer object.\n @param {Object} opts Optional hash of configuration options including\n `willChange` and `didChange` option.\n @return {EmberArray} receiver\n @public\n */\n\n addArrayObserver(target, opts) {\n return (0, _metal.addArrayObserver)(this, target, opts);\n },\n\n /**\n Removes an array observer from the object if the observer is current\n registered. Calling this method multiple times with the same object will\n have no effect.\n @method removeArrayObserver\n @param {Object} target The object observing the array.\n @param {Object} opts Optional hash of configuration options including\n `willChange` and `didChange` option.\n @return {EmberArray} receiver\n @public\n */\n removeArrayObserver(target, opts) {\n return (0, _metal.removeArrayObserver)(this, target, opts);\n },\n\n /**\n Becomes true whenever the array currently has observers watching changes\n on the array.\n @property {Boolean} hasArrayObservers\n @public\n */\n hasArrayObservers: (0, _metal.computed)(function () {\n return (0, _metal.hasListeners)(this, '@array:change') || (0, _metal.hasListeners)(this, '@array:before');\n }),\n\n /**\n If you are implementing an object that supports `EmberArray`, call this\n method just before the array content changes to notify any observers and\n invalidate any related properties. Pass the starting index of the change\n as well as a delta of the amounts to change.\n @method arrayContentWillChange\n @param {Number} startIdx The starting index in the array that will change.\n @param {Number} removeAmt The number of items that will be removed. If you\n pass `null` assumes 0\n @param {Number} addAmt The number of items that will be added. If you\n pass `null` assumes 0.\n @return {EmberArray} receiver\n @public\n */\n arrayContentWillChange(startIdx, removeAmt, addAmt) {\n return (0, _metal.arrayContentWillChange)(this, startIdx, removeAmt, addAmt);\n },\n\n /**\n If you are implementing an object that supports `EmberArray`, call this\n method just after the array content changes to notify any observers and\n invalidate any related properties. Pass the starting index of the change\n as well as a delta of the amounts to change.\n @method arrayContentDidChange\n @param {Number} startIdx The starting index in the array that did change.\n @param {Number} removeAmt The number of items that were removed. If you\n pass `null` assumes 0\n @param {Number} addAmt The number of items that were added. If you\n pass `null` assumes 0.\n @return {EmberArray} receiver\n @public\n */\n arrayContentDidChange(startIdx, removeAmt, addAmt) {\n return (0, _metal.arrayContentDidChange)(this, startIdx, removeAmt, addAmt);\n },\n\n /**\n Iterates through the array, calling the passed function on each\n item. This method corresponds to the `forEach()` method defined in\n JavaScript 1.6.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n @method forEach\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Object} receiver\n @public\n */\n forEach(callback, target = null) {\n (0, _debug.assert)('`forEach` expects a function as first argument.', typeof callback === 'function');\n\n let length = this.length;\n\n for (let index = 0; index < length; index++) {\n let item = this.objectAt(index);\n callback.call(target, item, index, this);\n }\n\n return this;\n },\n\n /**\n Alias for `mapBy`\n @method getEach\n @param {String} key name of the property\n @return {Array} The mapped array.\n @public\n */\n getEach: (0, _metal.aliasMethod)('mapBy'),\n\n /**\n Sets the value on the named property for each member. This is more\n ergonomic than using other methods defined on this helper. If the object\n implements Observable, the value will be changed to `set(),` otherwise\n it will be set directly. `null` objects are skipped.\n @method setEach\n @param {String} key The key to set\n @param {Object} value The object to set\n @return {Object} receiver\n @public\n */\n setEach(key, value) {\n return this.forEach(item => (0, _metal.set)(item, key, value));\n },\n\n /**\n Maps all of the items in the enumeration to another value, returning\n a new array. This method corresponds to `map()` defined in JavaScript 1.6.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n It should return the mapped value.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n @method map\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Array} The mapped array.\n @public\n */\n map(callback, target = null) {\n (0, _debug.assert)('`map` expects a function as first argument.', typeof callback === 'function');\n\n let ret = A();\n\n this.forEach((x, idx, i) => ret[idx] = callback.call(target, x, idx, i));\n\n return ret;\n },\n\n /**\n Similar to map, this specialized function returns the value of the named\n property on all items in the enumeration.\n @method mapBy\n @param {String} key name of the property\n @return {Array} The mapped array.\n @public\n */\n mapBy(key) {\n return this.map(next => (0, _metal.get)(next, key));\n },\n\n /**\n Returns an array with all of the items in the enumeration that the passed\n function returns true for. This method corresponds to `filter()` defined in\n JavaScript 1.6.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n It should return `true` to include the item in the results, `false`\n otherwise.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n @method filter\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Array} A filtered array.\n @public\n */\n filter(callback, target = null) {\n (0, _debug.assert)('`filter` expects a function as first argument.', typeof callback === 'function');\n\n let ret = A();\n\n this.forEach((x, idx, i) => {\n if (callback.call(target, x, idx, i)) {\n ret.push(x);\n }\n });\n\n return ret;\n },\n\n /**\n Returns an array with all of the items in the enumeration where the passed\n function returns false. This method is the inverse of filter().\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - *item* is the current item in the iteration.\n - *index* is the current index in the iteration\n - *array* is the array itself.\n It should return a falsey value to include the item in the results.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as \"this\" on the context. This is a good way\n to give your iterator function access to the current object.\n @method reject\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Array} A rejected array.\n @public\n */\n reject(callback, target = null) {\n (0, _debug.assert)('`reject` expects a function as first argument.', typeof callback === 'function');\n return this.filter(function () {\n return !callback.apply(target, arguments);\n });\n },\n\n /**\n Returns an array with just the items with the matched property. You\n can pass an optional second argument with the target value. Otherwise\n this will match any property that evaluates to `true`.\n @method filterBy\n @param {String} key the property to test\n @param {*} [value] optional value to test against.\n @return {Array} filtered array\n @public\n */\n filterBy() {\n return this.filter(iter(...arguments));\n },\n\n /**\n Returns an array with the items that do not have truthy values for\n key. You can pass an optional second argument with the target value. Otherwise\n this will match any property that evaluates to false.\n @method rejectBy\n @param {String} key the property to test\n @param {*} [value] optional value to test against.\n @return {Array} rejected array\n @public\n */\n rejectBy() {\n return this.reject(iter(...arguments));\n },\n\n /**\n Returns the first item in the array for which the callback returns true.\n This method is similar to the `find()` method defined in ECMAScript 2015.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n It should return the `true` to include the item in the results, `false`\n otherwise.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n @method find\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Object} Found item or `undefined`.\n @public\n */\n find(callback, target = null) {\n (0, _debug.assert)('`find` expects a function as first argument.', typeof callback === 'function');\n return find(this, callback, target);\n },\n\n /**\n Returns the first item with a property matching the passed value. You\n can pass an optional second argument with the target value. Otherwise\n this will match any property that evaluates to `true`.\n This method works much like the more generic `find()` method.\n @method findBy\n @param {String} key the property to test\n @param {String} [value] optional value to test against.\n @return {Object} found item or `undefined`\n @public\n */\n findBy() {\n return find(this, iter(...arguments));\n },\n\n /**\n Returns `true` if the passed function returns true for every item in the\n enumeration. This corresponds with the `every()` method in JavaScript 1.6.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n It should return the `true` or `false`.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n Example Usage:\n ```javascript\n if (people.every(isEngineer)) {\n Paychecks.addBigBonus();\n }\n ```\n @method every\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Boolean}\n @public\n */\n every(callback, target = null) {\n (0, _debug.assert)('`every` expects a function as first argument.', typeof callback === 'function');\n return every(this, callback, target);\n },\n\n /**\n Returns `true` if the passed property resolves to the value of the second\n argument for all items in the array. This method is often simpler/faster\n than using a callback.\n Note that like the native `Array.every`, `isEvery` will return true when called\n on any empty array.\n @method isEvery\n @param {String} key the property to test\n @param {String} [value] optional value to test against. Defaults to `true`\n @return {Boolean}\n @since 1.3.0\n @public\n */\n isEvery() {\n return every(this, iter(...arguments));\n },\n\n /**\n Returns `true` if the passed function returns true for any item in the\n enumeration.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(item, index, array);\n ```\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array object itself.\n It must return a truthy value (i.e. `true`) to include an item in the\n results. Any non-truthy return value will discard the item from the\n results.\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context. This is a good way\n to give your iterator function access to the current object.\n Usage Example:\n ```javascript\n if (people.any(isManager)) {\n Paychecks.addBiggerBonus();\n }\n ```\n @method any\n @param {Function} callback The callback to execute\n @param {Object} [target] The target object to use\n @return {Boolean} `true` if the passed function returns `true` for any item\n @public\n */\n any(callback, target = null) {\n (0, _debug.assert)('`any` expects a function as first argument.', typeof callback === 'function');\n return any(this, callback, target);\n },\n\n /**\n Returns `true` if the passed property resolves to the value of the second\n argument for any item in the array. This method is often simpler/faster\n than using a callback.\n @method isAny\n @param {String} key the property to test\n @param {String} [value] optional value to test against. Defaults to `true`\n @return {Boolean}\n @since 1.3.0\n @public\n */\n isAny() {\n return any(this, iter(...arguments));\n },\n\n /**\n This will combine the values of the enumerator into a single value. It\n is a useful way to collect a summary value from an enumeration. This\n corresponds to the `reduce()` method defined in JavaScript 1.8.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(previousValue, item, index, array);\n ```\n - `previousValue` is the value returned by the last call to the iterator.\n - `item` is the current item in the iteration.\n - `index` is the current index in the iteration.\n - `array` is the array itself.\n Return the new cumulative value.\n In addition to the callback you can also pass an `initialValue`. An error\n will be raised if you do not pass an initial value and the enumerator is\n empty.\n Note that unlike the other methods, this method does not allow you to\n pass a target object to set as this for the callback. It's part of the\n spec. Sorry.\n @method reduce\n @param {Function} callback The callback to execute\n @param {Object} initialValue Initial value for the reduce\n @return {Object} The reduced value.\n @public\n */\n reduce(callback, initialValue) {\n (0, _debug.assert)('`reduce` expects a function as first argument.', typeof callback === 'function');\n\n let ret = initialValue;\n\n this.forEach(function (item, i) {\n ret = callback(ret, item, i, this);\n }, this);\n\n return ret;\n },\n\n /**\n Invokes the named method on every object in the receiver that\n implements it. This method corresponds to the implementation in\n Prototype 1.6.\n @method invoke\n @param {String} methodName the name of the method\n @param {Object...} args optional arguments to pass as well.\n @return {Array} return values from calling invoke.\n @public\n */\n invoke(methodName, ...args) {\n let ret = A();\n\n this.forEach(item => ret.push((0, _utils.tryInvoke)(item, methodName, args)));\n\n return ret;\n },\n\n /**\n Simply converts the object into a genuine array. The order is not\n guaranteed. Corresponds to the method implemented by Prototype.\n @method toArray\n @return {Array} the object as an array.\n @public\n */\n toArray() {\n return this.map(item => item);\n },\n\n /**\n Returns a copy of the array with all `null` and `undefined` elements removed.\n ```javascript\n let arr = ['a', null, 'c', undefined];\n arr.compact(); // ['a', 'c']\n ```\n @method compact\n @return {Array} the array without null and undefined elements.\n @public\n */\n compact() {\n return this.filter(value => value != null);\n },\n\n /**\n Returns `true` if the passed object can be found in the array.\n This method is a Polyfill for ES 2016 Array.includes.\n If no `startAt` argument is given, the starting location to\n search is 0. If it's negative, searches from the index of\n `this.length + startAt` by asc.\n ```javascript\n [1, 2, 3].includes(2); // true\n [1, 2, 3].includes(4); // false\n [1, 2, 3].includes(3, 2); // true\n [1, 2, 3].includes(3, 3); // false\n [1, 2, 3].includes(3, -1); // true\n [1, 2, 3].includes(1, -1); // false\n [1, 2, 3].includes(1, -4); // true\n [1, 2, NaN].includes(NaN); // true\n ```\n @method includes\n @param {Object} object The object to search for.\n @param {Number} startAt optional starting location to search, default 0\n @return {Boolean} `true` if object is found in the array.\n @public\n */\n includes(object, startAt) {\n return indexOf(this, object, startAt, true) !== -1;\n },\n\n /**\n Sorts the array by the keys specified in the argument.\n You may provide multiple arguments to sort by multiple properties.\n ```javascript\n let colors = [{name: 'red'}, {name: 'green'}, {name: 'blue'}];\n colors.sortBy('name'); // [{name: 'blue'}, {name: 'green'}, {name: 'red'}]\n ```\n @method sortBy\n @param {String} property name(s) to sort on\n @return {Array} The sorted array.\n @since 1.2.0\n @public\n */\n sortBy() {\n let sortKeys = arguments;\n\n return this.toArray().sort((a, b) => {\n for (let i = 0; i < sortKeys.length; i++) {\n let key = sortKeys[i];\n let propA = (0, _metal.get)(a, key);\n let propB = (0, _metal.get)(b, key);\n // return 1 or -1 else continue to the next sortKey\n let compareValue = (0, _compare.default)(propA, propB);\n\n if (compareValue) {\n return compareValue;\n }\n }\n return 0;\n });\n },\n\n /**\n Returns a new array that contains only unique values. The default\n implementation returns an array regardless of the receiver type.\n ```javascript\n let arr = ['a', 'a', 'b', 'b'];\n arr.uniq(); // ['a', 'b']\n ```\n This only works on primitive data types, e.g. Strings, Numbers, etc.\n @method uniq\n @return {EmberArray}\n @public\n */\n uniq() {\n return uniqBy(this);\n },\n\n /**\n Returns a new array that contains only items containing a unique property value.\n The default implementation returns an array regardless of the receiver type.\n ```javascript\n let arr = [{ value: 'a' }, { value: 'a' }, { value: 'b' }, { value: 'b' }];\n arr.uniqBy('value'); // [{ value: 'a' }, { value: 'b' }]\n let arr = [2.2, 2.1, 3.2, 3.3];\n arr.uniqBy(Math.floor); // [2.2, 3.2];\n ```\n @method uniqBy\n @param {String,Function} key\n @return {EmberArray}\n @public\n */\n\n uniqBy(key) {\n return uniqBy(this, key);\n },\n\n /**\n Returns a new array that excludes the passed value. The default\n implementation returns an array regardless of the receiver type.\n If the receiver does not contain the value it returns the original array.\n ```javascript\n let arr = ['a', 'b', 'a', 'c'];\n arr.without('a'); // ['b', 'c']\n ```\n @method without\n @param {Object} value\n @return {EmberArray}\n @public\n */\n without(value) {\n if (!this.includes(value)) {\n return this; // nothing to do\n }\n\n // SameValueZero comparison (NaN !== NaN)\n let predicate = value === value ? item => item !== value : item => item === item;\n return this.filter(predicate);\n },\n\n /**\n Returns a special object that can be used to observe individual properties\n on the array. Just get an equivalent property on this object and it will\n return an array that maps automatically to the named key on the\n member objects.\n `@each` should only be used in a non-terminal context. Example:\n ```javascript\n myMethod: computed('posts.@each.author', function(){\n ...\n });\n ```\n If you merely want to watch for the array being changed, like an object being\n replaced, added or removed, use `[]` instead of `@each`.\n ```javascript\n myMethod: computed('posts.[]', function(){\n ...\n });\n ```\n @property @each\n @deprecated\n @public\n */\n '@each': _deprecatedFeatures.ARRAY_AT_EACH ? (0, _metal.computed)(function () {\n (0, _debug.deprecate)(`Getting the '@each' property on object ${(0, _utils.toString)(this)} is deprecated`, false, {\n id: 'ember-metal.getting-each',\n until: '3.5.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_getting-the-each-property'\n });\n\n return (0, _metal.eachProxyFor)(this);\n }).readOnly() : undefined\n });\n\n /**\n This mixin defines the API for modifying array-like objects. These methods\n can be applied only to a collection that keeps its items in an ordered set.\n It builds upon the Array mixin and adds methods to modify the array.\n One concrete implementations of this class include ArrayProxy.\n \n It is important to use the methods in this class to modify arrays so that\n changes are observable. This allows the binding system in Ember to function\n correctly.\n \n \n Note that an Array can change even if it does not implement this mixin.\n For example, one might implement a SparseArray that cannot be directly\n modified, but if its underlying enumerable changes, it will change also.\n \n @class MutableArray\n @uses EmberArray\n @uses MutableEnumerable\n @public\n */\n\n const MutableArray = _metal.Mixin.create(ArrayMixin, _mutable_enumerable.default, {\n /**\n __Required.__ You must implement this method to apply this mixin.\n This is one of the primitives you must implement to support `Array`.\n You should replace amt objects started at idx with the objects in the\n passed array. You should also call `this.arrayContentDidChange()`\n Note that this method is expected to validate the type(s) of objects that it expects.\n @method replace\n @param {Number} idx Starting index in the array to replace. If\n idx >= length, then append to the end of the array.\n @param {Number} amt Number of elements that should be removed from\n the array, starting at *idx*.\n @param {EmberArray} objects An array of zero or more objects that should be\n inserted into the array at *idx*\n @public\n */\n\n /**\n Remove all elements from the array. This is useful if you\n want to reuse an existing array without having to recreate it.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.length; // 3\n colors.clear(); // []\n colors.length; // 0\n ```\n @method clear\n @return {Array} An empty Array.\n @public\n */\n clear() {\n let len = this.length;\n if (len === 0) {\n return this;\n }\n\n this.replace(0, len, EMPTY_ARRAY);\n return this;\n },\n\n /**\n This will use the primitive `replace()` method to insert an object at the\n specified index.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.insertAt(2, 'yellow'); // ['red', 'green', 'yellow', 'blue']\n colors.insertAt(5, 'orange'); // Error: Index out of range\n ```\n @method insertAt\n @param {Number} idx index of insert the object at.\n @param {Object} object object to insert\n @return {EmberArray} receiver\n @public\n */\n insertAt(idx, object) {\n insertAt(this, idx, object);\n return this;\n },\n\n /**\n Remove an object at the specified index using the `replace()` primitive\n method. You can pass either a single index, or a start and a length.\n If you pass a start and length that is beyond the\n length this method will throw an assertion.\n ```javascript\n let colors = ['red', 'green', 'blue', 'yellow', 'orange'];\n colors.removeAt(0); // ['green', 'blue', 'yellow', 'orange']\n colors.removeAt(2, 2); // ['green', 'blue']\n colors.removeAt(4, 2); // Error: Index out of range\n ```\n @method removeAt\n @param {Number} start index, start of range\n @param {Number} len length of passing range\n @return {EmberArray} receiver\n @public\n */\n removeAt(start, len) {\n return removeAt(this, start, len);\n },\n\n /**\n Push the object onto the end of the array. Works just like `push()` but it\n is KVO-compliant.\n ```javascript\n let colors = ['red', 'green'];\n colors.pushObject('black'); // ['red', 'green', 'black']\n colors.pushObject(['yellow']); // ['red', 'green', ['yellow']]\n ```\n @method pushObject\n @param {*} obj object to push\n @return object same object passed as a param\n @public\n */\n pushObject(obj) {\n return insertAt(this, this.length, obj);\n },\n\n /**\n Add the objects in the passed array to the end of the array. Defers\n notifying observers of the change until all objects are added.\n ```javascript\n let colors = ['red'];\n colors.pushObjects(['yellow', 'orange']); // ['red', 'yellow', 'orange']\n ```\n @method pushObjects\n @param {EmberArray} objects the objects to add\n @return {EmberArray} receiver\n @public\n */\n pushObjects(objects) {\n this.replace(this.length, 0, objects);\n return this;\n },\n\n /**\n Pop object from array or nil if none are left. Works just like `pop()` but\n it is KVO-compliant.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.popObject(); // 'blue'\n console.log(colors); // ['red', 'green']\n ```\n @method popObject\n @return object\n @public\n */\n popObject() {\n let len = this.length;\n if (len === 0) {\n return null;\n }\n\n let ret = (0, _metal.objectAt)(this, len - 1);\n this.removeAt(len - 1, 1);\n return ret;\n },\n\n /**\n Shift an object from start of array or nil if none are left. Works just\n like `shift()` but it is KVO-compliant.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.shiftObject(); // 'red'\n console.log(colors); // ['green', 'blue']\n ```\n @method shiftObject\n @return object\n @public\n */\n shiftObject() {\n if (this.length === 0) {\n return null;\n }\n\n let ret = (0, _metal.objectAt)(this, 0);\n this.removeAt(0);\n return ret;\n },\n\n /**\n Unshift an object to start of array. Works just like `unshift()` but it is\n KVO-compliant.\n ```javascript\n let colors = ['red'];\n colors.unshiftObject('yellow'); // ['yellow', 'red']\n colors.unshiftObject(['black']); // [['black'], 'yellow', 'red']\n ```\n @method unshiftObject\n @param {*} obj object to unshift\n @return object same object passed as a param\n @public\n */\n unshiftObject(obj) {\n return insertAt(this, 0, obj);\n },\n\n /**\n Adds the named objects to the beginning of the array. Defers notifying\n observers until all objects have been added.\n ```javascript\n let colors = ['red'];\n colors.unshiftObjects(['black', 'white']); // ['black', 'white', 'red']\n colors.unshiftObjects('yellow'); // Type Error: 'undefined' is not a function\n ```\n @method unshiftObjects\n @param {Enumberable} objects the objects to add\n @return {EmberArray} receiver\n @public\n */\n unshiftObjects(objects) {\n this.replace(0, 0, objects);\n return this;\n },\n\n /**\n Reverse objects in the array. Works just like `reverse()` but it is\n KVO-compliant.\n @method reverseObjects\n @return {EmberArray} receiver\n @public\n */\n reverseObjects() {\n let len = this.length;\n if (len === 0) {\n return this;\n }\n\n let objects = this.toArray().reverse();\n this.replace(0, len, objects);\n return this;\n },\n\n /**\n Replace all the receiver's content with content of the argument.\n If argument is an empty array receiver will be cleared.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.setObjects(['black', 'white']); // ['black', 'white']\n colors.setObjects([]); // []\n ```\n @method setObjects\n @param {EmberArray} objects array whose content will be used for replacing\n the content of the receiver\n @return {EmberArray} receiver with the new content\n @public\n */\n setObjects(objects) {\n if (objects.length === 0) {\n return this.clear();\n }\n\n let len = this.length;\n this.replace(0, len, objects);\n return this;\n },\n\n /**\n Remove all occurrences of an object in the array.\n ```javascript\n let cities = ['Chicago', 'Berlin', 'Lima', 'Chicago'];\n cities.removeObject('Chicago'); // ['Berlin', 'Lima']\n cities.removeObject('Lima'); // ['Berlin']\n cities.removeObject('Tokyo') // ['Berlin']\n ```\n @method removeObject\n @param {*} obj object to remove\n @return {EmberArray} receiver\n @public\n */\n removeObject(obj) {\n let loc = this.length || 0;\n while (--loc >= 0) {\n let curObject = (0, _metal.objectAt)(this, loc);\n\n if (curObject === obj) {\n this.removeAt(loc);\n }\n }\n return this;\n },\n\n /**\n Removes each object in the passed array from the receiver.\n @method removeObjects\n @param {EmberArray} objects the objects to remove\n @return {EmberArray} receiver\n @public\n */\n removeObjects(objects) {\n (0, _metal.beginPropertyChanges)();\n for (let i = objects.length - 1; i >= 0; i--) {\n this.removeObject(objects[i]);\n }\n (0, _metal.endPropertyChanges)();\n return this;\n },\n\n /**\n Push the object onto the end of the array if it is not already\n present in the array.\n ```javascript\n let cities = ['Chicago', 'Berlin'];\n cities.addObject('Lima'); // ['Chicago', 'Berlin', 'Lima']\n cities.addObject('Berlin'); // ['Chicago', 'Berlin', 'Lima']\n ```\n @method addObject\n @param {*} obj object to add, if not already present\n @return {EmberArray} receiver\n @public\n */\n addObject(obj) {\n let included = this.includes(obj);\n\n if (!included) {\n this.pushObject(obj);\n }\n\n return this;\n },\n\n /**\n Adds each object in the passed array to the receiver.\n @method addObjects\n @param {EmberArray} objects the objects to add.\n @return {EmberArray} receiver\n @public\n */\n addObjects(objects) {\n (0, _metal.beginPropertyChanges)();\n objects.forEach(obj => this.addObject(obj));\n (0, _metal.endPropertyChanges)();\n return this;\n }\n });\n\n /**\n Creates an `Ember.NativeArray` from an Array-like object.\n Does not modify the original object's contents. `A()` is not needed if\n `EmberENV.EXTEND_PROTOTYPES` is `true` (the default value). However,\n it is recommended that you use `A()` when creating addons for\n ember or when you can not guarantee that `EmberENV.EXTEND_PROTOTYPES`\n will be `true`.\n \n Example\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n import { A } from '@ember/array';\n \n export default Component.extend({\n tagName: 'ul',\n classNames: ['pagination'],\n \n init() {\n this._super(...arguments);\n \n if (!this.get('content')) {\n this.set('content', A());\n this.set('otherContent', A([1,2,3]));\n }\n }\n });\n ```\n \n @method A\n @static\n @for @ember/array\n @return {Ember.NativeArray}\n @public\n */\n\n // Add Ember.Array to Array.prototype. Remove methods with native\n // implementations and supply some more optimized versions of generic methods\n // because they are so common.\n /**\n @module ember\n */\n /**\n The NativeArray mixin contains the properties needed to make the native\n Array support MutableArray and all of its dependent APIs. Unless you\n have `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Array` set to\n false, this will be applied automatically. Otherwise you can apply the mixin\n at anytime by calling `Ember.NativeArray.apply(Array.prototype)`.\n \n @class Ember.NativeArray\n @uses MutableArray\n @uses Observable\n @public\n */\n let NativeArray = _metal.Mixin.create(MutableArray, _observable.default, {\n objectAt(idx) {\n return this[idx];\n },\n\n // primitive for array support.\n replace(start, deleteCount, items = EMPTY_ARRAY) {\n (0, _debug.assert)('The third argument to replace needs to be an array.', Array.isArray(items));\n\n (0, _metal.replaceInNativeArray)(this, start, deleteCount, items);\n\n return this;\n },\n\n copy(deep) {\n (0, _debug.deprecate)(`Using \\`NativeArray#copy\\` is deprecated`, false, {\n id: 'ember-runtime.using-array-copy',\n until: '3.5.0'\n });\n\n if (deep) {\n return this.map(item => (0, _copy.default)(item, true));\n }\n\n return this.slice();\n }\n });\n\n // Remove any methods implemented natively so we don't override them\n const ignore = ['length'];\n NativeArray.keys().forEach(methodName => {\n if (Array.prototype[methodName]) {\n ignore.push(methodName);\n }\n });\n\n exports.NativeArray = NativeArray = NativeArray.without(...ignore);\n\n let A;\n\n if (_environment.ENV.EXTEND_PROTOTYPES.Array) {\n NativeArray.apply(Array.prototype);\n\n exports.A = A = function (arr) {\n (0, _debug.deprecate)('`new A()` has been deprecated, please update to calling A as a function: `A()`', !(this instanceof A), {\n id: 'array.new-array-wrapper',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_array-new-array-wrapper'\n });\n\n return arr || [];\n };\n } else {\n exports.A = A = function (arr) {\n (0, _debug.deprecate)('`new A()` has been deprecated, please update to calling A as a function: `A()`', !(this instanceof A), {\n id: 'array.new-array-wrapper',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_array-new-array-wrapper'\n });\n\n if (!arr) {\n arr = [];\n }\n\n return ArrayMixin.detect(arr) ? arr : NativeArray.apply(arr);\n };\n }\n\n exports.A = A;\n exports.NativeArray = NativeArray;\n exports.MutableArray = MutableArray;\n exports.default = ArrayMixin;\n});","enifed('@ember/-internals/runtime/lib/mixins/comparable', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n /**\n __Required.__ You must implement this method to apply this mixin.\n Override to return the result of the comparison of the two parameters. The\n compare method should return:\n - `-1` if `a < b`\n - `0` if `a == b`\n - `1` if `a > b`\n Default implementation raises an exception.\n @method compare\n @param a {Object} the first object to compare\n @param b {Object} the second object to compare\n @return {Number} the result of the comparison\n @private\n */\n compare: null\n });\n});","enifed('@ember/-internals/runtime/lib/mixins/container_proxy', ['exports', '@ember/runloop', '@ember/-internals/metal'], function (exports, _runloop, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n ContainerProxyMixin is used to provide public access to specific\n container functionality.\n \n @class ContainerProxyMixin\n @private\n */\n let containerProxyMixin = {\n /**\n The container stores state.\n @private\n @property {Ember.Container} __container__\n */\n __container__: null,\n\n /**\n Returns an object that can be used to provide an owner to a\n manually created instance.\n Example:\n ```\n import { getOwner } from '@ember/application';\n let owner = getOwner(this);\n User.create(\n owner.ownerInjection(),\n { username: 'rwjblue' }\n )\n ```\n @public\n @method ownerInjection\n @since 2.3.0\n @return {Object}\n */\n ownerInjection() {\n return this.__container__.ownerInjection();\n },\n\n /**\n Given a fullName return a corresponding instance.\n The default behavior is for lookup to return a singleton instance.\n The singleton is scoped to the container, allowing multiple containers\n to all have their own locally scoped singletons.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter');\n twitter instanceof Twitter; // => true\n // by default the container will return singletons\n let twitter2 = container.lookup('api:twitter');\n twitter2 instanceof Twitter; // => true\n twitter === twitter2; //=> true\n ```\n If singletons are not wanted an optional flag can be provided at lookup.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter', { singleton: false });\n let twitter2 = container.lookup('api:twitter', { singleton: false });\n twitter === twitter2; //=> false\n ```\n @public\n @method lookup\n @param {String} fullName\n @param {Object} options\n @return {any}\n */\n lookup(fullName, options) {\n return this.__container__.lookup(fullName, options);\n },\n\n destroy() {\n let container = this.__container__;\n\n if (container) {\n (0, _runloop.join)(() => {\n container.destroy();\n (0, _runloop.schedule)('destroy', container, 'finalizeDestroy');\n });\n }\n\n this._super();\n },\n\n /**\n Given a fullName return a factory manager.\n This method returns a manager which can be used for introspection of the\n factory's class or for the creation of factory instances with initial\n properties. The manager is an object with the following properties:\n * `class` - The registered or resolved class.\n * `create` - A function that will create an instance of the class with\n any dependencies injected.\n For example:\n ```javascript\n import { getOwner } from '@ember/application';\n let owner = getOwner(otherInstance);\n // the owner is commonly the `applicationInstance`, and can be accessed via\n // an instance initializer.\n let factory = owner.factoryFor('service:bespoke');\n factory.class;\n // The registered or resolved class. For example when used with an Ember-CLI\n // app, this would be the default export from `app/services/bespoke.js`.\n let instance = factory.create({\n someProperty: 'an initial property value'\n });\n // Create an instance with any injections and the passed options as\n // initial properties.\n ```\n @public\n @method factoryFor\n @param {String} fullName\n @param {Object} options\n @return {FactoryManager}\n */\n factoryFor(fullName, options = {}) {\n return this.__container__.factoryFor(fullName, options);\n }\n };\n /**\n @module ember\n */\n exports.default = _metal.Mixin.create(containerProxyMixin);\n});","enifed('@ember/-internals/runtime/lib/mixins/copyable', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n /**\n __Required.__ You must implement this method to apply this mixin.\n Override to return a copy of the receiver. Default implementation raises\n an exception.\n @method copy\n @param {Boolean} deep if `true`, a deep copy of the object should be made\n @return {Object} copy of receiver\n @private\n */\n copy: null\n });\n});","enifed('@ember/-internals/runtime/lib/mixins/enumerable', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create();\n});","enifed('@ember/-internals/runtime/lib/mixins/evented', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n /**\n Subscribes to a named event with given function.\n ```javascript\n person.on('didLoad', function() {\n // fired once the person has loaded\n });\n ```\n An optional target can be passed in as the 2nd argument that will\n be set as the \"this\" for the callback. This is a good way to give your\n function access to the object triggering the event. When the target\n parameter is used the callback becomes the third argument.\n @method on\n @param {String} name The name of the event\n @param {Object} [target] The \"this\" binding for the callback\n @param {Function} method The callback to execute\n @return this\n @public\n */\n on(name, target, method) {\n (0, _metal.addListener)(this, name, target, method);\n return this;\n },\n\n /**\n Subscribes a function to a named event and then cancels the subscription\n after the first time the event is triggered. It is good to use ``one`` when\n you only care about the first time an event has taken place.\n This function takes an optional 2nd argument that will become the \"this\"\n value for the callback. If this argument is passed then the 3rd argument\n becomes the function.\n @method one\n @param {String} name The name of the event\n @param {Object} [target] The \"this\" binding for the callback\n @param {Function} method The callback to execute\n @return this\n @public\n */\n one(name, target, method) {\n if (!method) {\n method = target;\n target = null;\n }\n\n (0, _metal.addListener)(this, name, target, method, true);\n return this;\n },\n\n /**\n Triggers a named event for the object. Any additional arguments\n will be passed as parameters to the functions that are subscribed to the\n event.\n ```javascript\n person.on('didEat', function(food) {\n console.log('person ate some ' + food);\n });\n person.trigger('didEat', 'broccoli');\n // outputs: person ate some broccoli\n ```\n @method trigger\n @param {String} name The name of the event\n @param {Object...} args Optional arguments to pass on\n @public\n */\n trigger(name, ...args) {\n (0, _metal.sendEvent)(this, name, args);\n },\n\n /**\n Cancels subscription for given name, target, and method.\n @method off\n @param {String} name The name of the event\n @param {Object} target The target of the subscription\n @param {Function} method The function of the subscription\n @return this\n @public\n */\n off(name, target, method) {\n (0, _metal.removeListener)(this, name, target, method);\n return this;\n },\n\n /**\n Checks to see if object has any subscriptions for named event.\n @method has\n @param {String} name The name of the event\n @return {Boolean} does the object have a subscription for event\n @public\n */\n has(name) {\n return (0, _metal.hasListeners)(this, name);\n }\n });\n});","enifed('@ember/-internals/runtime/lib/mixins/mutable_enumerable', ['exports', '@ember/-internals/runtime/lib/mixins/enumerable', '@ember/-internals/metal'], function (exports, _enumerable, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create(_enumerable.default);\n});","enifed('@ember/-internals/runtime/lib/mixins/observable', ['exports', '@ember/-internals/metal', '@ember/debug'], function (exports, _metal, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n /**\n Retrieves the value of a property from the object.\n This method is usually similar to using `object[keyName]` or `object.keyName`,\n however it supports both computed properties and the unknownProperty\n handler.\n Because `get` unifies the syntax for accessing all these kinds\n of properties, it can make many refactorings easier, such as replacing a\n simple property with a computed property, or vice versa.\n ### Computed Properties\n Computed properties are methods defined with the `property` modifier\n declared at the end, such as:\n ```javascript\n import { computed } from '@ember/object';\n fullName: computed('firstName', 'lastName', function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n })\n ```\n When you call `get` on a computed property, the function will be\n called and the return value will be returned instead of the function\n itself.\n ### Unknown Properties\n Likewise, if you try to call `get` on a property whose value is\n `undefined`, the `unknownProperty()` method will be called on the object.\n If this method returns any value other than `undefined`, it will be returned\n instead. This allows you to implement \"virtual\" properties that are\n not defined upfront.\n @method get\n @param {String} keyName The property to retrieve\n @return {Object} The property value or undefined.\n @public\n */\n get(keyName) {\n return (0, _metal.get)(this, keyName);\n },\n\n /**\n To get the values of multiple properties at once, call `getProperties`\n with a list of strings or an array:\n ```javascript\n record.getProperties('firstName', 'lastName', 'zipCode');\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n is equivalent to:\n ```javascript\n record.getProperties(['firstName', 'lastName', 'zipCode']);\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n @method getProperties\n @param {String...|Array} list of keys to get\n @return {Object}\n @public\n */\n getProperties(...args) {\n return (0, _metal.getProperties)(...[this].concat(args));\n },\n\n /**\n Sets the provided key or path to the value.\n ```javascript\n record.set(\"key\", value);\n ```\n This method is generally very similar to calling `object[\"key\"] = value` or\n `object.key = value`, except that it provides support for computed\n properties, the `setUnknownProperty()` method and property observers.\n ### Computed Properties\n If you try to set a value on a key that has a computed property handler\n defined (see the `get()` method for an example), then `set()` will call\n that method, passing both the value and key instead of simply changing\n the value itself. This is useful for those times when you need to\n implement a property that is composed of one or more member\n properties.\n ### Unknown Properties\n If you try to set a value on a key that is undefined in the target\n object, then the `setUnknownProperty()` handler will be called instead. This\n gives you an opportunity to implement complex \"virtual\" properties that\n are not predefined on the object. If `setUnknownProperty()` returns\n undefined, then `set()` will simply set the value on the object.\n ### Property Observers\n In addition to changing the property, `set()` will also register a property\n change with the object. Unless you have placed this call inside of a\n `beginPropertyChanges()` and `endPropertyChanges(),` any \"local\" observers\n (i.e. observer methods declared on the same object), will be called\n immediately. Any \"remote\" observers (i.e. observer methods declared on\n another object) will be placed in a queue and called at a later time in a\n coalesced manner.\n @method set\n @param {String} keyName The property to set\n @param {Object} value The value to set or `null`.\n @return {Object} The passed value\n @public\n */\n set(keyName, value) {\n return (0, _metal.set)(this, keyName, value);\n },\n\n /**\n Sets a list of properties at once. These properties are set inside\n a single `beginPropertyChanges` and `endPropertyChanges` batch, so\n observers will be buffered.\n ```javascript\n record.setProperties({ firstName: 'Charles', lastName: 'Jolley' });\n ```\n @method setProperties\n @param {Object} hash the hash of keys and values to set\n @return {Object} The passed in hash\n @public\n */\n setProperties(hash) {\n return (0, _metal.setProperties)(this, hash);\n },\n\n /**\n Begins a grouping of property changes.\n You can use this method to group property changes so that notifications\n will not be sent until the changes are finished. If you plan to make a\n large number of changes to an object at one time, you should call this\n method at the beginning of the changes to begin deferring change\n notifications. When you are done making changes, call\n `endPropertyChanges()` to deliver the deferred change notifications and end\n deferring.\n @method beginPropertyChanges\n @return {Observable}\n @private\n */\n beginPropertyChanges() {\n (0, _metal.beginPropertyChanges)();\n return this;\n },\n\n /**\n Ends a grouping of property changes.\n You can use this method to group property changes so that notifications\n will not be sent until the changes are finished. If you plan to make a\n large number of changes to an object at one time, you should call\n `beginPropertyChanges()` at the beginning of the changes to defer change\n notifications. When you are done making changes, call this method to\n deliver the deferred change notifications and end deferring.\n @method endPropertyChanges\n @return {Observable}\n @private\n */\n endPropertyChanges() {\n (0, _metal.endPropertyChanges)();\n return this;\n },\n\n /**\n @method propertyWillChange\n @private\n */\n propertyWillChange(keyName) {\n (0, _metal.propertyWillChange)(this, keyName);\n return this;\n },\n\n /**\n @method propertyDidChange\n @private\n */\n propertyDidChange(keyName) {\n (0, _metal.propertyDidChange)(this, keyName);\n return this;\n },\n\n /**\n Notify the observer system that a property has just changed.\n Sometimes you need to change a value directly or indirectly without\n actually calling `get()` or `set()` on it. In this case, you can use this\n method instead. Calling this method will notify all observers that the\n property has potentially changed value.\n @method notifyPropertyChange\n @param {String} keyName The property key to be notified about.\n @return {Observable}\n @public\n */\n notifyPropertyChange(keyName) {\n (0, _metal.notifyPropertyChange)(this, keyName);\n return this;\n },\n\n /**\n Adds an observer on a property.\n This is the core method used to register an observer for a property.\n Once you call this method, any time the key's value is set, your observer\n will be notified. Note that the observers are triggered any time the\n value is set, regardless of whether it has actually changed. Your\n observer should be prepared to handle that.\n ### Observer Methods\n Observer methods have the following signature:\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n init() {\n this._super(...arguments);\n this.addObserver('foo', this, 'fooDidChange');\n },\n fooDidChange(sender, key, value, rev) {\n // your code\n }\n });\n ```\n The `sender` is the object that changed. The `key` is the property that\n changes. The `value` property is currently reserved and unused. The `rev`\n is the last property revision of the object when it changed, which you can\n use to detect if the key value has really changed or not.\n Usually you will not need the value or revision parameters at\n the end. In this case, it is common to write observer methods that take\n only a sender and key value as parameters or, if you aren't interested in\n any of these values, to write an observer that has no parameters at all.\n @method addObserver\n @param {String} key The key to observe\n @param {Object} target The target object to invoke\n @param {String|Function} method The method to invoke\n @return {Observable}\n @public\n */\n addObserver(key, target, method) {\n (0, _metal.addObserver)(this, key, target, method);\n return this;\n },\n\n /**\n Remove an observer you have previously registered on this object. Pass\n the same key, target, and method you passed to `addObserver()` and your\n target will no longer receive notifications.\n @method removeObserver\n @param {String} key The key to observe\n @param {Object} target The target object to invoke\n @param {String|Function} method The method to invoke\n @return {Observable}\n @public\n */\n removeObserver(key, target, method) {\n (0, _metal.removeObserver)(this, key, target, method);\n return this;\n },\n\n /**\n Returns `true` if the object currently has observers registered for a\n particular key. You can use this method to potentially defer performing\n an expensive action until someone begins observing a particular property\n on the object.\n @method hasObserverFor\n @param {String} key Key to check\n @return {Boolean}\n @private\n */\n hasObserverFor(key) {\n return (0, _metal.hasListeners)(this, `${key}:change`);\n },\n\n /**\n Retrieves the value of a property, or a default value in the case that the\n property returns `undefined`.\n ```javascript\n person.getWithDefault('lastName', 'Doe');\n ```\n @method getWithDefault\n @param {String} keyName The name of the property to retrieve\n @param {Object} defaultValue The value to return if the property value is undefined\n @return {Object} The property value or the defaultValue.\n @public\n */\n getWithDefault(keyName, defaultValue) {\n return (0, _metal.getWithDefault)(this, keyName, defaultValue);\n },\n\n /**\n Set the value of a property to the current value plus some amount.\n ```javascript\n person.incrementProperty('age');\n team.incrementProperty('score', 2);\n ```\n @method incrementProperty\n @param {String} keyName The name of the property to increment\n @param {Number} increment The amount to increment by. Defaults to 1\n @return {Number} The new property value\n @public\n */\n incrementProperty(keyName, increment = 1) {\n (0, _debug.assert)('Must pass a numeric value to incrementProperty', !isNaN(parseFloat(increment)) && isFinite(increment));\n return (0, _metal.set)(this, keyName, (parseFloat((0, _metal.get)(this, keyName)) || 0) + increment);\n },\n\n /**\n Set the value of a property to the current value minus some amount.\n ```javascript\n player.decrementProperty('lives');\n orc.decrementProperty('health', 5);\n ```\n @method decrementProperty\n @param {String} keyName The name of the property to decrement\n @param {Number} decrement The amount to decrement by. Defaults to 1\n @return {Number} The new property value\n @public\n */\n decrementProperty(keyName, decrement = 1) {\n (0, _debug.assert)('Must pass a numeric value to decrementProperty', !isNaN(parseFloat(decrement)) && isFinite(decrement));\n return (0, _metal.set)(this, keyName, ((0, _metal.get)(this, keyName) || 0) - decrement);\n },\n\n /**\n Set the value of a boolean property to the opposite of its\n current value.\n ```javascript\n starship.toggleProperty('warpDriveEngaged');\n ```\n @method toggleProperty\n @param {String} keyName The name of the property to toggle\n @return {Boolean} The new property value\n @public\n */\n toggleProperty(keyName) {\n return (0, _metal.set)(this, keyName, !(0, _metal.get)(this, keyName));\n },\n\n /**\n Returns the cached value of a computed property, if it exists.\n This allows you to inspect the value of a computed property\n without accidentally invoking it if it is intended to be\n generated lazily.\n @method cacheFor\n @param {String} keyName\n @return {Object} The cached value of the computed property, if any\n @public\n */\n cacheFor(keyName) {\n return (0, _metal.getCachedValueFor)(this, keyName);\n }\n });\n});","enifed('@ember/-internals/runtime/lib/mixins/promise_proxy', ['exports', '@ember/-internals/metal', '@ember/error'], function (exports, _metal, _error) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n @module @ember/object\n */\n\n function tap(proxy, promise) {\n (0, _metal.setProperties)(proxy, {\n isFulfilled: false,\n isRejected: false\n });\n\n return promise.then(value => {\n if (!proxy.isDestroyed && !proxy.isDestroying) {\n (0, _metal.setProperties)(proxy, {\n content: value,\n isFulfilled: true\n });\n }\n return value;\n }, reason => {\n if (!proxy.isDestroyed && !proxy.isDestroying) {\n (0, _metal.setProperties)(proxy, {\n reason,\n isRejected: true\n });\n }\n throw reason;\n }, 'Ember: PromiseProxy');\n }\n\n /**\n A low level mixin making ObjectProxy promise-aware.\n \n ```javascript\n import { resolve } from 'rsvp';\n import $ from 'jquery';\n import ObjectProxy from '@ember/object/proxy';\n import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\n \n let ObjectPromiseProxy = ObjectProxy.extend(PromiseProxyMixin);\n \n let proxy = ObjectPromiseProxy.create({\n promise: resolve($.getJSON('/some/remote/data.json'))\n });\n \n proxy.then(function(json){\n // the json\n }, function(reason) {\n // the reason why you have no json\n });\n ```\n \n the proxy has bindable attributes which\n track the promises life cycle\n \n ```javascript\n proxy.get('isPending') //=> true\n proxy.get('isSettled') //=> false\n proxy.get('isRejected') //=> false\n proxy.get('isFulfilled') //=> false\n ```\n \n When the $.getJSON completes, and the promise is fulfilled\n with json, the life cycle attributes will update accordingly.\n Note that $.getJSON doesn't return an ECMA specified promise,\n it is useful to wrap this with an `RSVP.resolve` so that it behaves\n as a spec compliant promise.\n \n ```javascript\n proxy.get('isPending') //=> false\n proxy.get('isSettled') //=> true\n proxy.get('isRejected') //=> false\n proxy.get('isFulfilled') //=> true\n ```\n \n As the proxy is an ObjectProxy, and the json now its content,\n all the json properties will be available directly from the proxy.\n \n ```javascript\n // Assuming the following json:\n {\n firstName: 'Stefan',\n lastName: 'Penner'\n }\n \n // both properties will accessible on the proxy\n proxy.get('firstName') //=> 'Stefan'\n proxy.get('lastName') //=> 'Penner'\n ```\n \n @class PromiseProxyMixin\n @public\n */\n exports.default = _metal.Mixin.create({\n /**\n If the proxied promise is rejected this will contain the reason\n provided.\n @property reason\n @default null\n @public\n */\n reason: null,\n\n /**\n Once the proxied promise has settled this will become `false`.\n @property isPending\n @default true\n @public\n */\n isPending: (0, _metal.computed)('isSettled', function () {\n return !(0, _metal.get)(this, 'isSettled');\n }).readOnly(),\n\n /**\n Once the proxied promise has settled this will become `true`.\n @property isSettled\n @default false\n @public\n */\n isSettled: (0, _metal.computed)('isRejected', 'isFulfilled', function () {\n return (0, _metal.get)(this, 'isRejected') || (0, _metal.get)(this, 'isFulfilled');\n }).readOnly(),\n\n /**\n Will become `true` if the proxied promise is rejected.\n @property isRejected\n @default false\n @public\n */\n isRejected: false,\n\n /**\n Will become `true` if the proxied promise is fulfilled.\n @property isFulfilled\n @default false\n @public\n */\n isFulfilled: false,\n\n /**\n The promise whose fulfillment value is being proxied by this object.\n This property must be specified upon creation, and should not be\n changed once created.\n Example:\n ```javascript\n import ObjectProxy from '@ember/object/proxy';\n import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\n ObjectProxy.extend(PromiseProxyMixin).create({\n promise: \n });\n ```\n @property promise\n @public\n */\n promise: (0, _metal.computed)({\n get() {\n throw new _error.default(\"PromiseProxy's promise must be set\");\n },\n set(key, promise) {\n return tap(this, promise);\n }\n }),\n\n /**\n An alias to the proxied promise's `then`.\n See RSVP.Promise.then.\n @method then\n @param {Function} callback\n @return {RSVP.Promise}\n @public\n */\n then: promiseAlias('then'),\n\n /**\n An alias to the proxied promise's `catch`.\n See RSVP.Promise.catch.\n @method catch\n @param {Function} callback\n @return {RSVP.Promise}\n @since 1.3.0\n @public\n */\n catch: promiseAlias('catch'),\n\n /**\n An alias to the proxied promise's `finally`.\n See RSVP.Promise.finally.\n @method finally\n @param {Function} callback\n @return {RSVP.Promise}\n @since 1.3.0\n @public\n */\n finally: promiseAlias('finally')\n });\n\n\n function promiseAlias(name) {\n return function () {\n let promise = (0, _metal.get)(this, 'promise');\n return promise[name](...arguments);\n };\n }\n});","enifed('@ember/-internals/runtime/lib/mixins/registry_proxy', ['exports', '@ember/debug', '@ember/-internals/metal'], function (exports, _debug, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n __registry__: null,\n\n /**\n Given a fullName return the corresponding factory.\n @public\n @method resolveRegistration\n @param {String} fullName\n @return {Function} fullName's factory\n */\n resolveRegistration(fullName, options) {\n (0, _debug.assert)('fullName must be a proper full name', this.__registry__.isValidFullName(fullName));\n return this.__registry__.resolve(fullName, options);\n },\n\n /**\n Registers a factory that can be used for dependency injection (with\n `inject`) or for service lookup. Each factory is registered with\n a full name including two parts: `type:name`.\n A simple example:\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n App.Orange = EmberObject.extend();\n App.register('fruit:favorite', App.Orange);\n ```\n Ember will resolve factories from the `App` namespace automatically.\n For example `App.CarsController` will be discovered and returned if\n an application requests `controller:cars`.\n An example of registering a controller with a non-standard name:\n ```javascript\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n let App = Application.create();\n let Session = Controller.extend();\n App.register('controller:session', Session);\n // The Session controller can now be treated like a normal controller,\n // despite its non-standard name.\n App.ApplicationController = Controller.extend({\n needs: ['session']\n });\n ```\n Registered factories are **instantiated** by having `create`\n called on them. Additionally they are **singletons**, each time\n they are looked up they return the same instance.\n Some examples modifying that default behavior:\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n App.Person = EmberObject.extend();\n App.Orange = EmberObject.extend();\n App.Email = EmberObject.extend();\n App.session = EmberObject.create();\n App.register('model:user', App.Person, { singleton: false });\n App.register('fruit:favorite', App.Orange);\n App.register('communication:main', App.Email, { singleton: false });\n App.register('session', App.session, { instantiate: false });\n ```\n @method register\n @param fullName {String} type:name (e.g., 'model:user')\n @param factory {Function} (e.g., App.Person)\n @param options {Object} (optional) disable instantiation or singleton usage\n @public\n */\n register: registryAlias('register'),\n\n /**\n Unregister a factory.\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n let User = EmberObject.extend();\n App.register('model:user', User);\n App.resolveRegistration('model:user').create() instanceof User //=> true\n App.unregister('model:user')\n App.resolveRegistration('model:user') === undefined //=> true\n ```\n @public\n @method unregister\n @param {String} fullName\n */\n unregister: registryAlias('unregister'),\n\n /**\n Check if a factory is registered.\n @public\n @method hasRegistration\n @param {String} fullName\n @return {Boolean}\n */\n hasRegistration: registryAlias('has'),\n\n /**\n Return a specific registered option for a particular factory.\n @public\n @method registeredOption\n @param {String} fullName\n @param {String} optionName\n @return {Object} options\n */\n registeredOption: registryAlias('getOption'),\n\n /**\n Register options for a particular factory.\n @public\n @method registerOptions\n @param {String} fullName\n @param {Object} options\n */\n registerOptions: registryAlias('options'),\n\n /**\n Return registered options for a particular factory.\n @public\n @method registeredOptions\n @param {String} fullName\n @return {Object} options\n */\n registeredOptions: registryAlias('getOptions'),\n\n /**\n Allow registering options for all factories of a type.\n ```javascript\n import Application from '@ember/application';\n let App = Application.create();\n let appInstance = App.buildInstance();\n // if all of type `connection` must not be singletons\n appInstance.registerOptionsForType('connection', { singleton: false });\n appInstance.register('connection:twitter', TwitterConnection);\n appInstance.register('connection:facebook', FacebookConnection);\n let twitter = appInstance.lookup('connection:twitter');\n let twitter2 = appInstance.lookup('connection:twitter');\n twitter === twitter2; // => false\n let facebook = appInstance.lookup('connection:facebook');\n let facebook2 = appInstance.lookup('connection:facebook');\n facebook === facebook2; // => false\n ```\n @public\n @method registerOptionsForType\n @param {String} type\n @param {Object} options\n */\n registerOptionsForType: registryAlias('optionsForType'),\n\n /**\n Return the registered options for all factories of a type.\n @public\n @method registeredOptionsForType\n @param {String} type\n @return {Object} options\n */\n registeredOptionsForType: registryAlias('getOptionsForType'),\n\n /**\n Define a dependency injection onto a specific factory or all factories\n of a type.\n When Ember instantiates a controller, view, or other framework component\n it can attach a dependency to that component. This is often used to\n provide services to a set of framework components.\n An example of providing a session object to all controllers:\n ```javascript\n import { alias } from '@ember/object/computed';\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n import EmberObject from '@ember/object';\n let App = Application.create();\n let Session = EmberObject.extend({ isAuthenticated: false });\n // A factory must be registered before it can be injected\n App.register('session:main', Session);\n // Inject 'session:main' onto all factories of the type 'controller'\n // with the name 'session'\n App.inject('controller', 'session', 'session:main');\n App.IndexController = Controller.extend({\n isLoggedIn: alias('session.isAuthenticated')\n });\n ```\n Injections can also be performed on specific factories.\n ```javascript\n App.inject(, , )\n App.inject('route', 'source', 'source:main')\n App.inject('route:application', 'email', 'model:email')\n ```\n It is important to note that injections can only be performed on\n classes that are instantiated by Ember itself. Instantiating a class\n directly (via `create` or `new`) bypasses the dependency injection\n system.\n @public\n @method inject\n @param factoryNameOrType {String}\n @param property {String}\n @param injectionName {String}\n **/\n inject: registryAlias('injection')\n });\n\n\n function registryAlias(name) {\n return function () {\n return this.__registry__[name](...arguments);\n };\n }\n});","enifed('@ember/-internals/runtime/lib/mixins/target_action_support', ['exports', '@ember/-internals/environment', '@ember/-internals/metal', '@ember/debug', '@ember/deprecated-features'], function (exports, _environment, _metal, _debug, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n target: null,\n targetObject: _deprecatedFeatures.TARGET_OBJECT ? (0, _metal.descriptor)({\n configurable: true,\n enumerable: false,\n get() {\n let message = `${this} Usage of \\`targetObject\\` is deprecated. Please use \\`target\\` instead.`;\n let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };\n (0, _debug.deprecate)(message, false, options);\n return this._targetObject;\n },\n set(value) {\n let message = `${this} Usage of \\`targetObject\\` is deprecated. Please use \\`target\\` instead.`;\n let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };\n (0, _debug.deprecate)(message, false, options);\n this._targetObject = value;\n }\n }) : undefined,\n action: null,\n actionContext: null,\n\n actionContextObject: (0, _metal.computed)('actionContext', function () {\n let actionContext = (0, _metal.get)(this, 'actionContext');\n\n if (typeof actionContext === 'string') {\n let value = (0, _metal.get)(this, actionContext);\n if (value === undefined) {\n value = (0, _metal.get)(_environment.context.lookup, actionContext);\n }\n return value;\n } else {\n return actionContext;\n }\n }),\n\n /**\n Send an `action` with an `actionContext` to a `target`. The action, actionContext\n and target will be retrieved from properties of the object. For example:\n ```javascript\n import { alias } from '@ember/object/computed';\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n target: alias('controller'),\n action: 'save',\n actionContext: alias('context'),\n click() {\n this.triggerAction(); // Sends the `save` action, along with the current context\n // to the current controller\n }\n });\n ```\n The `target`, `action`, and `actionContext` can be provided as properties of\n an optional object argument to `triggerAction` as well.\n ```javascript\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n click() {\n this.triggerAction({\n action: 'save',\n target: this.get('controller'),\n actionContext: this.get('context')\n }); // Sends the `save` action, along with the current context\n // to the current controller\n }\n });\n ```\n The `actionContext` defaults to the object you are mixing `TargetActionSupport` into.\n But `target` and `action` must be specified either as properties or with the argument\n to `triggerAction`, or a combination:\n ```javascript\n import { alias } from '@ember/object/computed';\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n target: alias('controller'),\n click() {\n this.triggerAction({\n action: 'save'\n }); // Sends the `save` action, along with a reference to `this`,\n // to the current controller\n }\n });\n ```\n @method triggerAction\n @param opts {Object} (optional, with the optional keys action, target and/or actionContext)\n @return {Boolean} true if the action was sent successfully and did not return false\n @private\n */\n triggerAction(opts = {}) {\n let { action, target, actionContext } = opts;\n action = action || (0, _metal.get)(this, 'action');\n target = target || getTarget(this);\n\n if (actionContext === undefined) {\n actionContext = (0, _metal.get)(this, 'actionContextObject') || this;\n }\n\n if (target && action) {\n let ret;\n\n if (target.send) {\n ret = target.send(...[action].concat(actionContext));\n } else {\n (0, _debug.assert)(`The action '${action}' did not exist on ${target}`, typeof target[action] === 'function');\n ret = target[action](...[].concat(actionContext));\n }\n\n if (ret !== false) {\n return true;\n }\n }\n\n return false;\n }\n });\n\n\n function getTarget(instance) {\n let target = (0, _metal.get)(instance, 'target');\n if (target) {\n if (typeof target === 'string') {\n let value = (0, _metal.get)(instance, target);\n if (value === undefined) {\n value = (0, _metal.get)(_environment.context.lookup, target);\n }\n\n return value;\n } else {\n return target;\n }\n }\n\n // if a `targetObject` CP was provided, use it\n if (target) {\n return target;\n }\n\n // if _targetObject use it\n if (_deprecatedFeatures.TARGET_OBJECT && instance._targetObject) {\n return instance._targetObject;\n }\n\n return null;\n }\n});","enifed('@ember/-internals/runtime/lib/system/array_proxy', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/array', '@ember/debug'], function (exports, _metal, _object, _array, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n /**\n @module @ember/array\n */\n\n const ARRAY_OBSERVER_MAPPING = {\n willChange: '_arrangedContentArrayWillChange',\n didChange: '_arrangedContentArrayDidChange'\n };\n\n /**\n An ArrayProxy wraps any other object that implements `Array` and/or\n `MutableArray,` forwarding all requests. This makes it very useful for\n a number of binding use cases or other cases where being able to swap\n out the underlying array is useful.\n \n A simple example of usage:\n \n ```javascript\n import { A } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n let pets = ['dog', 'cat', 'fish'];\n let ap = ArrayProxy.create({ content: A(pets) });\n \n ap.get('firstObject'); // 'dog'\n ap.set('content', ['amoeba', 'paramecium']);\n ap.get('firstObject'); // 'amoeba'\n ```\n \n This class can also be useful as a layer to transform the contents of\n an array, as they are accessed. This can be done by overriding\n `objectAtContent`:\n \n ```javascript\n import { A } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n let pets = ['dog', 'cat', 'fish'];\n let ap = ArrayProxy.create({\n content: A(pets),\n objectAtContent: function(idx) {\n return this.get('content').objectAt(idx).toUpperCase();\n }\n });\n \n ap.get('firstObject'); // . 'DOG'\n ```\n \n When overriding this class, it is important to place the call to\n `_super` *after* setting `content` so the internal observers have\n a chance to fire properly:\n \n ```javascript\n import { A } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n export default ArrayProxy.extend({\n init() {\n this.set('content', A(['dog', 'cat', 'fish']));\n this._super(...arguments);\n }\n });\n ```\n \n @class ArrayProxy\n @extends EmberObject\n @uses MutableArray\n @public\n */\n class ArrayProxy extends _object.default {\n init() {\n super.init(...arguments);\n\n /*\n `this._objectsDirtyIndex` determines which indexes in the `this._objects`\n cache are dirty.\n If `this._objectsDirtyIndex === -1` then no indexes are dirty.\n Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.\n Calling `objectAt` with a dirty index will cause the `this._objects`\n cache to be recomputed.\n */\n this._objectsDirtyIndex = 0;\n this._objects = null;\n\n this._lengthDirty = true;\n this._length = 0;\n\n this._arrangedContent = null;\n this._addArrangedContentArrayObsever();\n }\n\n willDestroy() {\n this._removeArrangedContentArrayObsever();\n }\n\n /**\n The content array. Must be an object that implements `Array` and/or\n `MutableArray.`\n @property content\n @type EmberArray\n @public\n */\n\n /**\n Should actually retrieve the object at the specified index from the\n content. You can override this method in subclasses to transform the\n content item to something new.\n This method will only be called if content is non-`null`.\n @method objectAtContent\n @param {Number} idx The index to retrieve.\n @return {Object} the value or undefined if none found\n @public\n */\n objectAtContent(idx) {\n return (0, _metal.objectAt)((0, _metal.get)(this, 'arrangedContent'), idx);\n }\n\n // See additional docs for `replace` from `MutableArray`:\n // https://www.emberjs.com/api/ember/3.3/classes/MutableArray/methods/replace?anchor=replace\n replace(idx, amt, objects) {\n (0, _debug.assert)('Mutating an arranged ArrayProxy is not allowed', (0, _metal.get)(this, 'arrangedContent') === (0, _metal.get)(this, 'content'));\n this.replaceContent(idx, amt, objects);\n }\n\n /**\n Should actually replace the specified objects on the content array.\n You can override this method in subclasses to transform the content item\n into something new.\n This method will only be called if content is non-`null`.\n @method replaceContent\n @param {Number} idx The starting index\n @param {Number} amt The number of items to remove from the content.\n @param {EmberArray} objects Optional array of objects to insert or null if no\n objects.\n @return {void}\n @public\n */\n replaceContent(idx, amt, objects) {\n (0, _metal.get)(this, 'content').replace(idx, amt, objects);\n }\n\n // Overriding objectAt is not supported.\n objectAt(idx) {\n if (this._objects === null) {\n this._objects = [];\n }\n\n if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {\n let arrangedContent = (0, _metal.get)(this, 'arrangedContent');\n if (arrangedContent) {\n let length = this._objects.length = (0, _metal.get)(arrangedContent, 'length');\n\n for (let i = this._objectsDirtyIndex; i < length; i++) {\n this._objects[i] = this.objectAtContent(i);\n }\n } else {\n this._objects.length = 0;\n }\n this._objectsDirtyIndex = -1;\n }\n\n return this._objects[idx];\n }\n\n // Overriding length is not supported.\n get length() {\n if (this._lengthDirty) {\n let arrangedContent = (0, _metal.get)(this, 'arrangedContent');\n this._length = arrangedContent ? (0, _metal.get)(arrangedContent, 'length') : 0;\n this._lengthDirty = false;\n }\n\n return this._length;\n }\n\n set length(value) {\n let length = this.length;\n let removedCount = length - value;\n let added;\n\n if (removedCount === 0) {\n return;\n } else if (removedCount < 0) {\n added = new Array(-removedCount);\n removedCount = 0;\n }\n\n let content = (0, _metal.get)(this, 'content');\n if (content) {\n (0, _metal.replace)(content, value, removedCount, added);\n\n this._invalidate();\n }\n }\n\n [_metal.PROPERTY_DID_CHANGE](key) {\n if (key === 'arrangedContent') {\n let oldLength = this._objects === null ? 0 : this._objects.length;\n let arrangedContent = (0, _metal.get)(this, 'arrangedContent');\n let newLength = arrangedContent ? (0, _metal.get)(arrangedContent, 'length') : 0;\n\n this._removeArrangedContentArrayObsever();\n this.arrayContentWillChange(0, oldLength, newLength);\n\n this._invalidate();\n\n this.arrayContentDidChange(0, oldLength, newLength);\n this._addArrangedContentArrayObsever();\n } else if (key === 'content') {\n this._invalidate();\n }\n }\n\n _addArrangedContentArrayObsever() {\n let arrangedContent = (0, _metal.get)(this, 'arrangedContent');\n if (arrangedContent) {\n (0, _debug.assert)(\"Can't set ArrayProxy's content to itself\", arrangedContent !== this);\n (0, _debug.assert)(`ArrayProxy expects an Array or ArrayProxy, but you passed ${typeof arrangedContent}`, (0, _array.isArray)(arrangedContent) || arrangedContent.isDestroyed);\n\n (0, _metal.addArrayObserver)(arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n\n this._arrangedContent = arrangedContent;\n }\n }\n\n _removeArrangedContentArrayObsever() {\n if (this._arrangedContent) {\n (0, _metal.removeArrayObserver)(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n }\n }\n\n _arrangedContentArrayWillChange() {}\n\n _arrangedContentArrayDidChange(proxy, idx, removedCnt, addedCnt) {\n this.arrayContentWillChange(idx, removedCnt, addedCnt);\n\n let dirtyIndex = idx;\n if (dirtyIndex < 0) {\n let length = (0, _metal.get)(this._arrangedContent, 'length');\n dirtyIndex += length + removedCnt - addedCnt;\n }\n\n if (this._objectsDirtyIndex === -1) {\n this._objectsDirtyIndex = dirtyIndex;\n } else {\n if (this._objectsDirtyIndex > dirtyIndex) {\n this._objectsDirtyIndex = dirtyIndex;\n }\n }\n\n this._lengthDirty = true;\n\n this.arrayContentDidChange(idx, removedCnt, addedCnt);\n }\n\n _invalidate() {\n this._objectsDirtyIndex = 0;\n this._lengthDirty = true;\n }\n }\n\n exports.default = ArrayProxy;\n ArrayProxy.reopen(_array.MutableArray, {\n /**\n The array that the proxy pretends to be. In the default `ArrayProxy`\n implementation, this and `content` are the same. Subclasses of `ArrayProxy`\n can override this property to provide things like sorting and filtering.\n @property arrangedContent\n @public\n */\n arrangedContent: (0, _metal.alias)('content')\n });\n});","enifed('@ember/-internals/runtime/lib/system/core_object', ['exports', '@ember/-internals/container', '@ember/polyfills', '@ember/-internals/utils', '@ember/runloop', '@ember/-internals/meta', '@ember/-internals/metal', '@ember/-internals/runtime/lib/mixins/action_handler', '@ember/debug', '@glimmer/env'], function (exports, _container, _polyfills, _utils, _runloop, _meta, _metal, _action_handler, _debug, _env) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const reopen = _metal.Mixin.prototype.reopen; /**\n @module @ember/object\n */\n\n const wasApplied = new _polyfills._WeakSet();\n\n const factoryMap = new WeakMap();\n\n const prototypeMixinMap = new WeakMap();\n\n const DELAY_INIT = Object.freeze({});\n\n let initCalled; // only used in debug builds to enable the proxy trap\n\n // using DEBUG here to avoid the extraneous variable when not needed\n if (_env.DEBUG) {\n initCalled = new _polyfills._WeakSet();\n }\n\n function initialize(obj, properties) {\n let m = (0, _meta.meta)(obj);\n\n if (properties !== undefined) {\n (0, _debug.assert)('EmberObject.create only accepts objects.', typeof properties === 'object' && properties !== null);\n\n (0, _debug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _metal.Mixin));\n\n let concatenatedProperties = obj.concatenatedProperties;\n let mergedProperties = obj.mergedProperties;\n let hasConcatenatedProps = concatenatedProperties !== undefined && concatenatedProperties.length > 0;\n let hasMergedProps = mergedProperties !== undefined && mergedProperties.length > 0;\n\n let keyNames = Object.keys(properties);\n\n for (let i = 0; i < keyNames.length; i++) {\n let keyName = keyNames[i];\n let value = properties[keyName];\n\n (0, _debug.assert)('EmberObject.create no longer supports defining computed ' + 'properties. Define computed properties using extend() or reopen() ' + 'before calling create().', !(value instanceof _metal.ComputedProperty));\n (0, _debug.assert)('EmberObject.create no longer supports defining methods that call _super.', !(typeof value === 'function' && value.toString().indexOf('._super') !== -1));\n (0, _debug.assert)('`actions` must be provided at extend time, not at create time, ' + 'when Ember.ActionHandler is used (i.e. views, controllers & routes).', !(keyName === 'actions' && _action_handler.default.detect(obj)));\n\n let possibleDesc = (0, _meta.descriptorFor)(obj, keyName, m);\n let isDescriptor = possibleDesc !== undefined;\n\n if (!isDescriptor) {\n let baseValue = obj[keyName];\n\n if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) {\n if (baseValue) {\n value = (0, _utils.makeArray)(baseValue).concat(value);\n } else {\n value = (0, _utils.makeArray)(value);\n }\n }\n\n if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) {\n value = (0, _polyfills.assign)({}, baseValue, value);\n }\n }\n\n if (isDescriptor) {\n possibleDesc.set(obj, keyName, value);\n } else if (typeof obj.setUnknownProperty === 'function' && !(keyName in obj)) {\n obj.setUnknownProperty(keyName, value);\n } else {\n if (_env.DEBUG) {\n (0, _metal.defineProperty)(obj, keyName, null, value, m); // setup mandatory setter\n } else {\n obj[keyName] = value;\n }\n }\n }\n }\n\n // using DEBUG here to avoid the extraneous variable when not needed\n if (_env.DEBUG) {\n initCalled.add(obj);\n }\n obj.init(properties);\n\n // re-enable chains\n m.unsetInitializing();\n (0, _metal.finishChains)(m);\n (0, _metal.sendEvent)(obj, 'init', undefined, undefined, undefined, m);\n }\n\n /**\n @class CoreObject\n @public\n */\n class CoreObject {\n static _initFactory(factory) {\n factoryMap.set(this, factory);\n }\n\n constructor(properties) {\n // pluck off factory\n let initFactory = factoryMap.get(this.constructor);\n if (initFactory !== undefined) {\n factoryMap.delete(this.constructor);\n _container.FACTORY_FOR.set(this, initFactory);\n }\n\n // prepare prototype...\n this.constructor.proto();\n\n let self = this;\n\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY && typeof self.unknownProperty === 'function') {\n let messageFor = (obj, property) => {\n return `You attempted to access the \\`${String(property)}\\` property (of ${obj}).\\n` + `Since Ember 3.1, this is usually fine as you no longer need to use \\`.get()\\`\\n` + `to access computed properties. However, in this case, the object in question\\n` + `is a special kind of Ember object (a proxy). Therefore, it is still necessary\\n` + `to use \\`.get('${String(property)}')\\` in this case.\\n\\n` + `If you encountered this error because of third-party code that you don't control,\\n` + `there is more information at https://github.com/emberjs/ember.js/issues/16148, and\\n` + `you can help us improve this error message by telling us more about what happened in\\n` + `this situation.`;\n };\n\n /* globals Proxy Reflect */\n self = new Proxy(this, {\n get(target, property, receiver) {\n if (property === _metal.PROXY_CONTENT) {\n return target;\n } else if (\n // init called will be set on the proxy, not the target, so get with the receiver\n !initCalled.has(receiver) || typeof property === 'symbol' || (0, _utils.isInternalSymbol)(property) || property === 'toJSON' || property === 'toString' || property === 'toStringExtension' || property === 'didDefineProperty' || property === 'willWatchProperty' || property === 'didUnwatchProperty' || property === 'didAddListener' || property === 'didRemoveListener' || property === 'isDescriptor' || property === '_onLookup' || property in target) {\n return Reflect.get(target, property, receiver);\n }\n\n let value = target.unknownProperty.call(receiver, property);\n\n if (typeof value !== 'function') {\n (0, _debug.assert)(messageFor(receiver, property), value === undefined || value === null);\n }\n }\n });\n\n _container.FACTORY_FOR.set(self, initFactory);\n }\n\n // disable chains\n let m = (0, _meta.meta)(self);\n m.setInitializing();\n\n if (properties !== DELAY_INIT) {\n (0, _debug.deprecate)('using `new` with EmberObject has been deprecated. Please use `create` instead, or consider using native classes without extending from EmberObject.', false, {\n id: 'object.new-constructor',\n until: '3.9.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_object-new-constructor'\n });\n\n initialize(self, properties);\n }\n\n // only return when in debug builds and `self` is the proxy created above\n if (_env.DEBUG && self !== this) {\n return self;\n }\n }\n\n reopen(...args) {\n (0, _metal.applyMixin)(this, args);\n return this;\n }\n\n /**\n An overridable method called when objects are instantiated. By default,\n does nothing unless it is overridden during class definition.\n Example:\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend({\n init() {\n alert(`Name is ${this.get('name')}`);\n }\n });\n let steve = Person.create({\n name: 'Steve'\n });\n // alerts 'Name is Steve'.\n ```\n NOTE: If you do override `init` for a framework class like `Ember.View`,\n be sure to call `this._super(...arguments)` in your\n `init` declaration! If you don't, Ember may not have an opportunity to\n do important setup work, and you'll see strange behavior in your\n application.\n @method init\n @public\n */\n init() {}\n\n /**\n Defines the properties that will be concatenated from the superclass\n (instead of overridden).\n By default, when you extend an Ember class a property defined in\n the subclass overrides a property with the same name that is defined\n in the superclass. However, there are some cases where it is preferable\n to build up a property's value by combining the superclass' property\n value with the subclass' value. An example of this in use within Ember\n is the `classNames` property of `Ember.View`.\n Here is some sample code showing the difference between a concatenated\n property and a normal one:\n ```javascript\n import EmberObject from '@ember/object';\n const Bar = EmberObject.extend({\n // Configure which properties to concatenate\n concatenatedProperties: ['concatenatedProperty'],\n someNonConcatenatedProperty: ['bar'],\n concatenatedProperty: ['bar']\n });\n const FooBar = Bar.extend({\n someNonConcatenatedProperty: ['foo'],\n concatenatedProperty: ['foo']\n });\n let fooBar = FooBar.create();\n fooBar.get('someNonConcatenatedProperty'); // ['foo']\n fooBar.get('concatenatedProperty'); // ['bar', 'foo']\n ```\n This behavior extends to object creation as well. Continuing the\n above example:\n ```javascript\n let fooBar = FooBar.create({\n someNonConcatenatedProperty: ['baz'],\n concatenatedProperty: ['baz']\n })\n fooBar.get('someNonConcatenatedProperty'); // ['baz']\n fooBar.get('concatenatedProperty'); // ['bar', 'foo', 'baz']\n ```\n Adding a single property that is not an array will just add it in the array:\n ```javascript\n let fooBar = FooBar.create({\n concatenatedProperty: 'baz'\n })\n view.get('concatenatedProperty'); // ['bar', 'foo', 'baz']\n ```\n Using the `concatenatedProperties` property, we can tell Ember to mix the\n content of the properties.\n In `Component` the `classNames`, `classNameBindings` and\n `attributeBindings` properties are concatenated.\n This feature is available for you to use throughout the Ember object model,\n although typical app developers are likely to use it infrequently. Since\n it changes expectations about behavior of properties, you should properly\n document its usage in each individual concatenated property (to not\n mislead your users to think they can override the property in a subclass).\n @property concatenatedProperties\n @type Array\n @default null\n @public\n */\n\n /**\n Defines the properties that will be merged from the superclass\n (instead of overridden).\n By default, when you extend an Ember class a property defined in\n the subclass overrides a property with the same name that is defined\n in the superclass. However, there are some cases where it is preferable\n to build up a property's value by merging the superclass property value\n with the subclass property's value. An example of this in use within Ember\n is the `queryParams` property of routes.\n Here is some sample code showing the difference between a merged\n property and a normal one:\n ```javascript\n import EmberObject from '@ember/object';\n const Bar = EmberObject.extend({\n // Configure which properties are to be merged\n mergedProperties: ['mergedProperty'],\n someNonMergedProperty: {\n nonMerged: 'superclass value of nonMerged'\n },\n mergedProperty: {\n page: { replace: false },\n limit: { replace: true }\n }\n });\n const FooBar = Bar.extend({\n someNonMergedProperty: {\n completelyNonMerged: 'subclass value of nonMerged'\n },\n mergedProperty: {\n limit: { replace: false }\n }\n });\n let fooBar = FooBar.create();\n fooBar.get('someNonMergedProperty');\n // => { completelyNonMerged: 'subclass value of nonMerged' }\n //\n // Note the entire object, including the nonMerged property of\n // the superclass object, has been replaced\n fooBar.get('mergedProperty');\n // => {\n // page: {replace: false},\n // limit: {replace: false}\n // }\n //\n // Note the page remains from the superclass, and the\n // `limit` property's value of `false` has been merged from\n // the subclass.\n ```\n This behavior is not available during object `create` calls. It is only\n available at `extend` time.\n In `Route` the `queryParams` property is merged.\n This feature is available for you to use throughout the Ember object model,\n although typical app developers are likely to use it infrequently. Since\n it changes expectations about behavior of properties, you should properly\n document its usage in each individual merged property (to not\n mislead your users to think they can override the property in a subclass).\n @property mergedProperties\n @type Array\n @default null\n @public\n */\n\n /**\n Destroyed object property flag.\n if this property is `true` the observers and bindings were already\n removed by the effect of calling the `destroy()` method.\n @property isDestroyed\n @default false\n @public\n */\n get isDestroyed() {\n return (0, _meta.peekMeta)(this).isSourceDestroyed();\n }\n\n set isDestroyed(value) {\n (0, _debug.assert)(`You cannot set \\`${this}.isDestroyed\\` directly, please use \\`.destroy()\\`.`, false);\n }\n\n /**\n Destruction scheduled flag. The `destroy()` method has been called.\n The object stays intact until the end of the run loop at which point\n the `isDestroyed` flag is set.\n @property isDestroying\n @default false\n @public\n */\n get isDestroying() {\n return (0, _meta.peekMeta)(this).isSourceDestroying();\n }\n\n set isDestroying(value) {\n (0, _debug.assert)(`You cannot set \\`${this}.isDestroying\\` directly, please use \\`.destroy()\\`.`, false);\n }\n\n /**\n Destroys an object by setting the `isDestroyed` flag and removing its\n metadata, which effectively destroys observers and bindings.\n If you try to set a property on a destroyed object, an exception will be\n raised.\n Note that destruction is scheduled for the end of the run loop and does not\n happen immediately. It will set an isDestroying flag immediately.\n @method destroy\n @return {EmberObject} receiver\n @public\n */\n destroy() {\n let m = (0, _meta.peekMeta)(this);\n if (m.isSourceDestroying()) {\n return;\n }\n\n m.setSourceDestroying();\n\n (0, _runloop.schedule)('actions', this, this.willDestroy);\n (0, _runloop.schedule)('destroy', this, this._scheduledDestroy, m);\n\n return this;\n }\n\n /**\n Override to implement teardown.\n @method willDestroy\n @public\n */\n willDestroy() {}\n\n /**\n Invoked by the run loop to actually destroy the object. This is\n scheduled for execution by the `destroy` method.\n @private\n @method _scheduledDestroy\n */\n _scheduledDestroy(m) {\n if (m.isSourceDestroyed()) {\n return;\n }\n (0, _meta.deleteMeta)(this);\n m.setSourceDestroyed();\n }\n\n /**\n Returns a string representation which attempts to provide more information\n than Javascript's `toString` typically does, in a generic way for all Ember\n objects.\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend();\n person = Person.create();\n person.toString(); //=> \"\"\n ```\n If the object's class is not defined on an Ember namespace, it will\n indicate it is a subclass of the registered superclass:\n ```javascript\n const Student = Person.extend();\n let student = Student.create();\n student.toString(); //=> \"<(subclass of Person):ember1025>\"\n ```\n If the method `toStringExtension` is defined, its return value will be\n included in the output.\n ```javascript\n const Teacher = Person.extend({\n toStringExtension() {\n return this.get('fullName');\n }\n });\n teacher = Teacher.create();\n teacher.toString(); //=> \"\"\n ```\n @method toString\n @return {String} string representation\n @public\n */\n toString() {\n let hasToStringExtension = typeof this.toStringExtension === 'function';\n let extension = hasToStringExtension ? `:${this.toStringExtension()}` : '';\n\n let ret = `<${(0, _utils.getName)(this) || _container.FACTORY_FOR.get(this) || this.constructor.toString()}:${(0, _utils.guidFor)(this)}${extension}>`;\n\n return ret;\n }\n\n /**\n Creates a new subclass.\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend({\n say(thing) {\n alert(thing);\n }\n });\n ```\n This defines a new subclass of EmberObject: `Person`. It contains one method: `say()`.\n You can also create a subclass from any existing class by calling its `extend()` method.\n For example, you might want to create a subclass of Ember's built-in `Component` class:\n ```javascript\n import Component from '@ember/component';\n const PersonComponent = Component.extend({\n tagName: 'li',\n classNameBindings: ['isAdministrator']\n });\n ```\n When defining a subclass, you can override methods but still access the\n implementation of your parent class by calling the special `_super()` method:\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend({\n say(thing) {\n let name = this.get('name');\n alert(`${name} says: ${thing}`);\n }\n });\n const Soldier = Person.extend({\n say(thing) {\n this._super(`${thing}, sir!`);\n },\n march(numberOfHours) {\n alert(`${this.get('name')} marches for ${numberOfHours} hours.`);\n }\n });\n let yehuda = Soldier.create({\n name: 'Yehuda Katz'\n });\n yehuda.say('Yes'); // alerts \"Yehuda Katz says: Yes, sir!\"\n ```\n The `create()` on line #17 creates an *instance* of the `Soldier` class.\n The `extend()` on line #8 creates a *subclass* of `Person`. Any instance\n of the `Person` class will *not* have the `march()` method.\n You can also pass `Mixin` classes to add additional properties to the subclass.\n ```javascript\n import EmberObject from '@ember/object';\n import Mixin from '@ember/object/mixin';\n const Person = EmberObject.extend({\n say(thing) {\n alert(`${this.get('name')} says: ${thing}`);\n }\n });\n const SingingMixin = Mixin.create({\n sing(thing) {\n alert(`${this.get('name')} sings: la la la ${thing}`);\n }\n });\n const BroadwayStar = Person.extend(SingingMixin, {\n dance() {\n alert(`${this.get('name')} dances: tap tap tap tap `);\n }\n });\n ```\n The `BroadwayStar` class contains three methods: `say()`, `sing()`, and `dance()`.\n @method extend\n @static\n @for @ember/object\n @param {Mixin} [mixins]* One or more Mixin classes\n @param {Object} [arguments]* Object containing values to use within the new class\n @public\n */\n static extend() {\n let Class = class extends this {};\n reopen.apply(Class.PrototypeMixin, arguments);\n return Class;\n }\n\n /**\n Creates an instance of a class. Accepts either no arguments, or an object\n containing values to initialize the newly instantiated object with.\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend({\n helloWorld() {\n alert(`Hi, my name is ${this.get('name')}`);\n }\n });\n let tom = Person.create({\n name: 'Tom Dale'\n });\n tom.helloWorld(); // alerts \"Hi, my name is Tom Dale\".\n ```\n `create` will call the `init` function if defined during\n `AnyObject.extend`\n If no arguments are passed to `create`, it will not set values to the new\n instance during initialization:\n ```javascript\n let noName = Person.create();\n noName.helloWorld(); // alerts undefined\n ```\n NOTE: For performance reasons, you cannot declare methods or computed\n properties during `create`. You should instead declare methods and computed\n properties when using `extend`.\n @method create\n @for @ember/object\n @static\n @param [arguments]*\n @public\n */\n static create(props, extra) {\n let C = this;\n let instance = new C(DELAY_INIT);\n\n if (extra === undefined) {\n initialize(instance, props);\n } else {\n initialize(instance, flattenProps.apply(this, arguments));\n }\n\n return instance;\n }\n\n /**\n Augments a constructor's prototype with additional\n properties and functions:\n ```javascript\n import EmberObject from '@ember/object';\n const MyObject = EmberObject.extend({\n name: 'an object'\n });\n o = MyObject.create();\n o.get('name'); // 'an object'\n MyObject.reopen({\n say(msg) {\n console.log(msg);\n }\n });\n o2 = MyObject.create();\n o2.say('hello'); // logs \"hello\"\n o.say('goodbye'); // logs \"goodbye\"\n ```\n To add functions and properties to the constructor itself,\n see `reopenClass`\n @method reopen\n @for @ember/object\n @static\n @public\n */\n static reopen() {\n this.willReopen();\n reopen.apply(this.PrototypeMixin, arguments);\n return this;\n }\n\n static willReopen() {\n let p = this.prototype;\n if (wasApplied.has(p)) {\n wasApplied.delete(p);\n\n // If the base mixin already exists and was applied, create a new mixin to\n // make sure that it gets properly applied. Reusing the same mixin after\n // the first `proto` call will cause it to get skipped.\n if (prototypeMixinMap.has(this)) {\n prototypeMixinMap.set(this, _metal.Mixin.create(this.PrototypeMixin));\n }\n }\n }\n\n /**\n Augments a constructor's own properties and functions:\n ```javascript\n import EmberObject from '@ember/object';\n const MyObject = EmberObject.extend({\n name: 'an object'\n });\n MyObject.reopenClass({\n canBuild: false\n });\n MyObject.canBuild; // false\n o = MyObject.create();\n ```\n In other words, this creates static properties and functions for the class.\n These are only available on the class and not on any instance of that class.\n ```javascript\n import EmberObject from '@ember/object';\n const Person = EmberObject.extend({\n name: '',\n sayHello() {\n alert(`Hello. My name is ${this.get('name')}`);\n }\n });\n Person.reopenClass({\n species: 'Homo sapiens',\n createPerson(name) {\n return Person.create({ name });\n }\n });\n let tom = Person.create({\n name: 'Tom Dale'\n });\n let yehuda = Person.createPerson('Yehuda Katz');\n tom.sayHello(); // \"Hello. My name is Tom Dale\"\n yehuda.sayHello(); // \"Hello. My name is Yehuda Katz\"\n alert(Person.species); // \"Homo sapiens\"\n ```\n Note that `species` and `createPerson` are *not* valid on the `tom` and `yehuda`\n variables. They are only valid on `Person`.\n To add functions and properties to instances of\n a constructor by extending the constructor's prototype\n see `reopen`\n @method reopenClass\n @for @ember/object\n @static\n @public\n */\n static reopenClass() {\n (0, _metal.applyMixin)(this, arguments);\n return this;\n }\n\n static detect(obj) {\n if ('function' !== typeof obj) {\n return false;\n }\n while (obj) {\n if (obj === this) {\n return true;\n }\n obj = obj.superclass;\n }\n return false;\n }\n\n static detectInstance(obj) {\n return obj instanceof this;\n }\n\n /**\n In some cases, you may want to annotate computed properties with additional\n metadata about how they function or what values they operate on. For\n example, computed property functions may close over variables that are then\n no longer available for introspection.\n You can pass a hash of these values to a computed property like this:\n ```javascript\n import { computed } from '@ember/object';\n person: computed(function() {\n let personId = this.get('personId');\n return Person.create({ id: personId });\n }).meta({ type: Person })\n ```\n Once you've done this, you can retrieve the values saved to the computed\n property from your class like this:\n ```javascript\n MyClass.metaForProperty('person');\n ```\n This will return the original hash that was passed to `meta()`.\n @static\n @method metaForProperty\n @param key {String} property name\n @private\n */\n static metaForProperty(key) {\n let proto = this.proto(); // ensure prototype is initialized\n let possibleDesc = (0, _meta.descriptorFor)(proto, key);\n\n (0, _debug.assert)(`metaForProperty() could not find a computed property with key '${key}'.`, possibleDesc !== undefined);\n\n return possibleDesc._meta || {};\n }\n\n /**\n Iterate over each computed property for the class, passing its name\n and any associated metadata (see `metaForProperty`) to the callback.\n @static\n @method eachComputedProperty\n @param {Function} callback\n @param {Object} binding\n @private\n */\n static eachComputedProperty(callback, binding = this) {\n this.proto(); // ensure prototype is initialized\n let empty = {};\n\n (0, _meta.meta)(this.prototype).forEachDescriptors((name, descriptor) => {\n if (descriptor.enumerable) {\n let meta = descriptor._meta || empty;\n callback.call(binding, name, meta);\n }\n });\n }\n\n static get PrototypeMixin() {\n let prototypeMixin = prototypeMixinMap.get(this);\n if (prototypeMixin === undefined) {\n prototypeMixin = _metal.Mixin.create();\n prototypeMixin.ownerConstructor = this;\n prototypeMixinMap.set(this, prototypeMixin);\n }\n return prototypeMixin;\n }\n\n static get superclass() {\n let c = Object.getPrototypeOf(this);\n if (c !== Function.prototype) return c;\n }\n\n static proto() {\n let p = this.prototype;\n if (!wasApplied.has(p)) {\n wasApplied.add(p);\n let parent = this.superclass;\n if (parent) {\n parent.proto();\n }\n\n // If the prototype mixin exists, apply it. In the case of native classes,\n // it will not exist (unless the class has been reopened).\n if (prototypeMixinMap.has(this)) {\n this.PrototypeMixin.apply(p);\n }\n }\n return p;\n }\n }\n\n CoreObject.toString = _metal.classToString;\n (0, _utils.setName)(CoreObject, 'Ember.CoreObject');\n\n CoreObject.isClass = true;\n CoreObject.isMethod = false;\n\n function flattenProps(...props) {\n let { concatenatedProperties, mergedProperties } = this;\n let hasConcatenatedProps = concatenatedProperties !== undefined && concatenatedProperties.length > 0;\n let hasMergedProps = mergedProperties !== undefined && mergedProperties.length > 0;\n\n let initProperties = {};\n\n for (let i = 0; i < props.length; i++) {\n let properties = props[i];\n\n (0, _debug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _metal.Mixin));\n\n let keyNames = Object.keys(properties);\n\n for (let j = 0, k = keyNames.length; j < k; j++) {\n let keyName = keyNames[j];\n let value = properties[keyName];\n\n if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) {\n let baseValue = initProperties[keyName];\n\n if (baseValue) {\n value = (0, _utils.makeArray)(baseValue).concat(value);\n } else {\n value = (0, _utils.makeArray)(value);\n }\n }\n\n if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) {\n let baseValue = initProperties[keyName];\n\n value = (0, _polyfills.assign)({}, baseValue, value);\n }\n\n initProperties[keyName] = value;\n }\n }\n\n return initProperties;\n }\n\n if (_env.DEBUG) {\n /**\n Provides lookup-time type validation for injected properties.\n @private\n @method _onLookup\n */\n CoreObject._onLookup = function injectedPropertyAssertion(debugContainerKey) {\n let [type] = debugContainerKey.split(':');\n let proto = this.proto();\n\n for (let key in proto) {\n let desc = (0, _meta.descriptorFor)(proto, key);\n if (desc instanceof _metal.InjectedProperty) {\n (0, _debug.assert)(`Defining \\`${key}\\` as an injected controller property on a non-controller (\\`${debugContainerKey}\\`) is not allowed.`, type === 'controller' || desc.type !== 'controller');\n }\n }\n };\n\n /**\n Returns a hash of property names and container names that injected\n properties will lookup on the container lazily.\n @method _lazyInjections\n @return {Object} Hash of all lazy injected property keys to container names\n @private\n */\n CoreObject._lazyInjections = function () {\n let injections = {};\n let proto = this.proto();\n let key;\n let desc;\n\n for (key in proto) {\n desc = (0, _meta.descriptorFor)(proto, key);\n if (desc instanceof _metal.InjectedProperty) {\n injections[key] = {\n namespace: desc.namespace,\n source: desc.source,\n specifier: `${desc.type}:${desc.name || key}`\n };\n }\n }\n\n return injections;\n };\n }\n\n exports.default = CoreObject;\n});","enifed('@ember/-internals/runtime/lib/system/namespace', ['exports', '@ember/-internals/metal', '@ember/-internals/utils', '@ember/-internals/runtime/lib/system/object'], function (exports, _metal, _utils, _object) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n A Namespace is an object usually used to contain other objects or methods\n such as an application or framework. Create a namespace anytime you want\n to define one of these new containers.\n \n # Example Usage\n \n ```javascript\n MyFramework = Ember.Namespace.create({\n VERSION: '1.0.0'\n });\n ```\n \n @class Namespace\n @namespace Ember\n @extends EmberObject\n @public\n */\n // Preloaded into namespaces\n class Namespace extends _object.default {\n init() {\n (0, _metal.addNamespace)(this);\n }\n\n toString() {\n let name = (0, _metal.get)(this, 'name') || (0, _metal.get)(this, 'modulePrefix');\n if (name) {\n return name;\n }\n (0, _metal.findNamespaces)();\n name = (0, _utils.getName)(this);\n if (name === undefined) {\n name = (0, _utils.guidFor)(this);\n (0, _utils.setName)(this, name);\n }\n return name;\n }\n\n nameClasses() {\n (0, _metal.processNamespace)(this);\n }\n\n destroy() {\n (0, _metal.removeNamespace)(this);\n super.destroy();\n }\n }\n\n exports.default = Namespace;\n Namespace.prototype.isNamespace = true;\n Namespace.NAMESPACES = _metal.NAMESPACES;\n Namespace.NAMESPACES_BY_ID = _metal.NAMESPACES_BY_ID;\n Namespace.processAll = _metal.processAllNamespaces;\n Namespace.byName = _metal.findNamespace;\n});","enifed('@ember/-internals/runtime/lib/system/object', ['exports', '@ember/-internals/container', '@ember/-internals/owner', '@ember/-internals/utils', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/core_object', '@ember/-internals/runtime/lib/mixins/observable', '@ember/debug', '@glimmer/env'], function (exports, _container, _owner, _utils, _metal, _core_object, _observable, _debug, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.FrameworkObject = undefined;\n /**\n @module @ember/object\n */\n\n let OVERRIDE_OWNER = (0, _utils.symbol)('OVERRIDE_OWNER');\n\n /**\n `EmberObject` is the main base class for all Ember objects. It is a subclass\n of `CoreObject` with the `Observable` mixin applied. For details,\n see the documentation for each of these.\n \n @class EmberObject\n @extends CoreObject\n @uses Observable\n @public\n */\n class EmberObject extends _core_object.default {\n get _debugContainerKey() {\n let factory = _container.FACTORY_FOR.get(this);\n return factory !== undefined && factory.fullName;\n }\n\n get [_owner.OWNER]() {\n if (this[OVERRIDE_OWNER]) {\n return this[OVERRIDE_OWNER];\n }\n\n let factory = _container.FACTORY_FOR.get(this);\n return factory !== undefined && factory.owner;\n }\n\n // we need a setter here largely to support\n // folks calling `owner.ownerInjection()` API\n set [_owner.OWNER](value) {\n this[OVERRIDE_OWNER] = value;\n }\n }\n\n exports.default = EmberObject;\n (0, _utils.setName)(EmberObject, 'Ember.Object');\n\n _observable.default.apply(EmberObject.prototype);\n\n let FrameworkObject = exports.FrameworkObject = EmberObject;\n\n if (_env.DEBUG) {\n let INIT_WAS_CALLED = (0, _utils.symbol)('INIT_WAS_CALLED');\n let ASSERT_INIT_WAS_CALLED = (0, _utils.symbol)('ASSERT_INIT_WAS_CALLED');\n\n exports.FrameworkObject = FrameworkObject = class FrameworkObject extends EmberObject {\n init() {\n super.init(...arguments);\n this[INIT_WAS_CALLED] = true;\n }\n\n [ASSERT_INIT_WAS_CALLED]() {\n (0, _debug.assert)(`You must call \\`this._super(...arguments);\\` when overriding \\`init\\` on a framework object. Please update ${this} to call \\`this._super(...arguments);\\` from \\`init\\`.`, this[INIT_WAS_CALLED]);\n }\n };\n\n (0, _metal.addListener)(FrameworkObject.prototype, 'init', null, ASSERT_INIT_WAS_CALLED);\n }\n});","enifed('@ember/-internals/runtime/lib/system/object_proxy', ['exports', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/-proxy'], function (exports, _object, _proxy) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n `ObjectProxy` forwards all properties not defined by the proxy itself\n to a proxied `content` object.\n \n ```javascript\n import EmberObject from '@ember/object';\n import ObjectProxy from '@ember/object/proxy';\n \n object = EmberObject.create({\n name: 'Foo'\n });\n \n proxy = ObjectProxy.create({\n content: object\n });\n \n // Access and change existing properties\n proxy.get('name') // 'Foo'\n proxy.set('name', 'Bar');\n object.get('name') // 'Bar'\n \n // Create new 'description' property on `object`\n proxy.set('description', 'Foo is a whizboo baz');\n object.get('description') // 'Foo is a whizboo baz'\n ```\n \n While `content` is unset, setting a property to be delegated will throw an\n Error.\n \n ```javascript\n import ObjectProxy from '@ember/object/proxy';\n \n proxy = ObjectProxy.create({\n content: null,\n flag: null\n });\n proxy.set('flag', true);\n proxy.get('flag'); // true\n proxy.get('foo'); // undefined\n proxy.set('foo', 'data'); // throws Error\n ```\n \n Delegated properties can be bound to and will change when content is updated.\n \n Computed properties on the proxy itself can depend on delegated properties.\n \n ```javascript\n import { computed } from '@ember/object';\n import ObjectProxy from '@ember/object/proxy';\n \n ProxyWithComputedProperty = ObjectProxy.extend({\n fullName: computed('firstName', 'lastName', function() {\n var firstName = this.get('firstName'),\n lastName = this.get('lastName');\n if (firstName && lastName) {\n return firstName + ' ' + lastName;\n }\n return firstName || lastName;\n })\n });\n \n proxy = ProxyWithComputedProperty.create();\n \n proxy.get('fullName'); // undefined\n proxy.set('content', {\n firstName: 'Tom', lastName: 'Dale'\n }); // triggers property change for fullName on proxy\n \n proxy.get('fullName'); // 'Tom Dale'\n ```\n \n @class ObjectProxy\n @extends EmberObject\n @uses Ember.ProxyMixin\n @public\n */\n class ObjectProxy extends _object.default {}\n exports.default = ObjectProxy;\n ObjectProxy.PrototypeMixin.reopen(_proxy.default);\n});","enifed('@ember/-internals/runtime/lib/type-of', ['exports', '@ember/-internals/runtime/lib/system/object'], function (exports, _object) {\n 'use strict';\n\n exports.__esModule = true;\n exports.typeOf = typeOf;\n\n\n // ........................................\n // TYPING & ARRAY MESSAGING\n //\n const TYPE_MAP = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regexp',\n '[object Object]': 'object',\n '[object FileList]': 'filelist'\n };\n\n const { toString } = Object.prototype;\n\n /**\n @module @ember/utils\n */\n /**\n Returns a consistent type for the passed object.\n \n Use this instead of the built-in `typeof` to get the type of an item.\n It will return the same result across all browsers and includes a bit\n more detail. Here is what will be returned:\n \n | Return Value | Meaning |\n |---------------|------------------------------------------------------|\n | 'string' | String primitive or String object. |\n | 'number' | Number primitive or Number object. |\n | 'boolean' | Boolean primitive or Boolean object. |\n | 'null' | Null value |\n | 'undefined' | Undefined value |\n | 'function' | A function |\n | 'array' | An instance of Array |\n | 'regexp' | An instance of RegExp |\n | 'date' | An instance of Date |\n | 'filelist' | An instance of FileList |\n | 'class' | An Ember class (created using EmberObject.extend()) |\n | 'instance' | An Ember object instance |\n | 'error' | An instance of the Error object |\n | 'object' | A JavaScript object not inheriting from EmberObject |\n \n Examples:\n \n ```javascript\n import { A } from '@ember/array';\n import { typeOf } from '@ember/utils';\n import EmberObject from '@ember/object';\n \n typeOf(); // 'undefined'\n typeOf(null); // 'null'\n typeOf(undefined); // 'undefined'\n typeOf('michael'); // 'string'\n typeOf(new String('michael')); // 'string'\n typeOf(101); // 'number'\n typeOf(new Number(101)); // 'number'\n typeOf(true); // 'boolean'\n typeOf(new Boolean(true)); // 'boolean'\n typeOf(A); // 'function'\n typeOf([1, 2, 90]); // 'array'\n typeOf(/abc/); // 'regexp'\n typeOf(new Date()); // 'date'\n typeOf(event.target.files); // 'filelist'\n typeOf(EmberObject.extend()); // 'class'\n typeOf(EmberObject.create()); // 'instance'\n typeOf(new Error('teamocil')); // 'error'\n \n // 'normal' JavaScript object\n typeOf({ a: 'b' }); // 'object'\n ```\n \n @method typeOf\n @for @ember/utils\n @param {Object} item the item to check\n @return {String} the type\n @public\n @static\n */\n function typeOf(item) {\n if (item === null) {\n return 'null';\n }\n if (item === undefined) {\n return 'undefined';\n }\n let ret = TYPE_MAP[toString.call(item)] || 'object';\n\n if (ret === 'function') {\n if (_object.default.detect(item)) {\n ret = 'class';\n }\n } else if (ret === 'object') {\n if (item instanceof Error) {\n ret = 'error';\n } else if (item instanceof _object.default) {\n ret = 'instance';\n } else if (item instanceof Date) {\n ret = 'date';\n }\n }\n\n return ret;\n }\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\n result = obj.any(function (i) {\n found.push(i);\n return false;\n });\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\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 let obj = (0, _array.A)([0, 1, 2]);\n let result;\n\n result = obj.any(i => !!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 let obj = (0, _array.A)([undefined]);\n let result;\n\n result = obj.any(() => true);\n assert.equal(result, true, 'return value of obj.any');\n }\n }\n\n (0, _array2.runArrayTests)('any', AnyTests);\n});","enifed('@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 let obj = this.newObject([null, 1, false, '', undefined, 0, null]);\n let ary = obj.compact();\n this.assert.deepEqual(ary, [1, false, '', 0]);\n }\n }\n\n (0, _array.runArrayTests)('compact', CompactTests);\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\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 class IsEveryTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return true of every property matches'() {\n let obj = this.newObject([{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', 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 let obj = this.newObject([{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })]);\n\n // different values - all eval to true\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 let obj = this.newObject([{ foo: null, bar: 'BAZ' }, _object.default.create({ foo: null, 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 let obj = this.newObject([{ foo: undefined, bar: 'BAZ' }, _object.default.create({ 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 (0, _array.runArrayTests)('every', EveryTest);\n (0, _array.runArrayTests)('isEvery', IsEveryTest);\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let found = [];\n let result;\n\n // return true on all but the last two\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 class FilterByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should filter based on object'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', 'foo'), ary, 'filterBy(foo)');\n this.assert.deepEqual(obj.filterBy('bar', 'bar'), [ary[1]], 'filterBy(bar)');\n }\n\n '@test should include in result if property is true'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })];\n\n obj = this.newObject(ary);\n\n // different values - all eval to true\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 }), { name: 'obj3', foo: 2 }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: null }), { name: 'obj3', foo: null }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', null), [ary[1], ary[2]], \"filterBy('foo', 3)')\");\n }\n\n '@test should not return all objects on undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', undefined), [], \"filterBy('foo', 3)')\");\n }\n\n '@test should correctly filter explicit undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo'), ary.slice(0, 2), \"filterBy('foo', 3)')\");\n }\n }\n\n (0, _array.runArrayTests)('filter', FilterTest);\n (0, _array.runArrayTests)('filter', FilterByTest);\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\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 class FindByTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return first object of property matches'() {\n let ary, obj;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\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 let ary, obj;\n\n ary = [{ foo: 'foo', bar: false }, _object.default.create({ foo: 'bar', bar: true })];\n\n obj = this.newObject(ary);\n\n // different values - all eval to true\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 let ary, obj;\n\n ary = [{ foo: null, bar: 'BAZ' }, _object.default.create({ foo: null, bar: null })];\n\n obj = this.newObject(ary);\n\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 let ary, obj;\n\n ary = [{ foo: undefined, bar: 'BAZ' }, _object.default.create({})];\n\n obj = this.newObject(ary);\n\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 (0, _array.runArrayTests)('find', FindTests);\n (0, _array.runArrayTests)('findBy', FindByTests);\n});","enifed('@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 let 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 let obj = this.newObject([]);\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), undefined);\n }\n\n '@test can not be set'() {\n let obj = this.newObject([]);\n\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), this.toArray(obj)[0]);\n\n this.assert.throws(() => {\n (0, _metal.set)(obj, 'firstObject', 'foo!');\n }, /Cannot set read-only property \"firstObject\" on object/);\n }\n }\n\n (0, _array.runArrayTests)('firstObject', FirstObjectTests);\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n\n this.mutate(obj);\n ary = this.toArray(obj);\n found = [];\n\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 let obj = this.newObject();\n let target = this;\n\n obj.forEach(() => {\n // 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\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let loc = 0;\n\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 (0, _array.runArrayTests)('forEach', ForEachTests);\n});","enifed('@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 let data = (0, _array.newFixture)(3);\n let obj = this.newObject(data);\n\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 let data = (0, _array.newFixture)(3);\n let obj = this.newObject(data);\n\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 let data = (0, _array.newFixture)(1);\n let obj = this.newObject(data);\n\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 let data = (0, _array.newFixture)(1);\n let obj = this.newObject(data);\n\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 (0, _array.runArrayTests)('includes', IncludesTests);\n});","enifed('@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 let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let 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 let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.indexOf(foo), -1, 'obj.indexOf(foo) should be < 0');\n }\n }\n\n (0, _array.runArrayTests)('indexOf', IndexOfTests);\n});","enifed('@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 let cnt, ary, obj;\n\n function F(amt) {\n cnt += amt === undefined ? 1 : amt;\n }\n cnt = 0;\n ary = [{ foo: F }, _index.Object.create({ foo: F }),\n\n // NOTE: does not impl foo - invoke should just skip\n _index.Object.create({ bar: F }), { foo: F }];\n\n obj = this.newObject(ary);\n obj.invoke('foo');\n this.assert.equal(cnt, 3, 'should have invoked 3 times');\n\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 let obj = this.newObject([{\n foo() {\n return 'one';\n }\n }, {}, // intentionally not including `foo` method\n {\n foo() {\n return 'two';\n }\n }]);\n\n let 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 let obj = this.newObject([{ foo() {} }, { foo() {} }]);\n\n let result = obj.invoke('foo');\n\n assert.ok(_index.NativeArray.detect(result), 'NativeArray has been applied');\n }\n }\n\n (0, _array.runArrayTests)('invoke', InvokeTests);\n});","enifed('@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 let obj = this.newObject([{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', 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 let obj = this.newObject([{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })]);\n\n // different values - all eval to true\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 let obj = this.newObject([{ foo: null, bar: 'bar' }, _object.default.create({ foo: 'foo', 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 let obj = this.newObject([{ foo: undefined, bar: 'bar' }, _object.default.create({ 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 let obj = this.newObject([{ foo: undefined }, _object.default.create({})]);\n\n this.assert.equal(obj.isAny('foo'), false, \"isAny('foo', undefined)\");\n }\n }\n\n (0, _array.runArrayTests)('isAny', IsAnyTests);\n});","enifed('@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 let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let 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 let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let 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 let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let 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 let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\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 let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\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 let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.lastIndexOf(foo, (0, _metal.get)(obj, 'length') + 1), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n }\n\n (0, _array.runArrayTests)('lastIndexOf', LastIndexOfTests);\n});","enifed('@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 let obj = this.newObject();\n let ary = this.toArray(obj);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n }\n\n '@test returns undefined if enumerable is empty'() {\n let obj = this.newObject([]);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), undefined);\n }\n\n '@test can not be set'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n\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 (0, _array.runArrayTests)('lastObject', LastObjectTests);\n});","enifed('@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 const mapFunc = item => item ? item.toString() : null;\n\n class MapTests extends _internalTestHelpers.AbstractTestCase {\n '@test map should iterate over list'() {\n let obj = this.newObject();\n let ary = this.toArray(obj).map(mapFunc);\n let found = [];\n\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 let obj = this.newObject();\n let ary = this.toArray(obj).map(mapFunc);\n let found;\n\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n\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 let obj = this.newObject();\n let target = this;\n\n obj.map(() => {\n // 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\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 let obj = this.newObject();\n let ary = this.toArray(obj);\n let loc = 0;\n\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 (0, _array.runArrayTests)('map', MapTests);\n});","enifed('@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 let obj = this.newObject([{ a: 1 }, { a: 2 }]);\n this.assert.equal(obj.mapBy('a').join(''), '12');\n }\n\n '@test should work also through getEach alias'() {\n let obj = this.newObject([{ a: 1 }, { a: 2 }]);\n this.assert.equal(obj.getEach('a').join(''), '12');\n }\n }\n\n (0, _array.runArrayTests)('mapBy', MapByTests);\n});","enifed('@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 let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = expected.length;\n\n for (let 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 let obj;\n\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\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 (0, _array.runArrayTests)('objectAt', ObjectAtTests);\n});","enifed('@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 let obj = this.newObject([1, 2, 3]);\n let 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 let obj = this.newObject([1, 2, 3]);\n let 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 let obj = this.newObject([1, 2, 3]);\n let res = obj.reduce((previousValue, item, index, enumerable) => enumerable, 0);\n this.assert.equal(res, obj);\n }\n }\n\n (0, _array.runArrayTests)('reduce', ReduceTests);\n});","enifed('@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 let obj = this.newObject([1, 2, 3, 4]);\n let result;\n\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 let obj = this.newObject([1, 2, 3, 4]);\n let isEven = i => i % 2 === 0;\n let filtered, rejected;\n\n filtered = obj.filter(isEven);\n rejected = obj.reject(isEven);\n\n this.assert.deepEqual(filtered, [2, 4], 'filtered evens');\n this.assert.deepEqual(rejected, [1, 3], 'rejected evens');\n }\n }\n\n class RejectByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should reject based on object'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ foo: false, bar: true }, _object.default.create({ foo: false, bar: false })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 }), { name: 'obj3', foo: 2 }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: null }), { name: 'obj3', foo: null }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('bar', undefined), [], \"rejectBy('bar', undefined)')\");\n }\n\n '@test should correctly reject explicit undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\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 let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' }), { name: 'obj7', foo: null }, _object.default.create({ name: 'obj8', foo: null }), { name: 'obj9', foo: false }, _object.default.create({ name: 'obj10', foo: false })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo'), ary.slice(2), \"rejectBy('foo')')\");\n }\n }\n\n (0, _array.runArrayTests)('reject', RejectTest);\n (0, _array.runArrayTests)('rejectBy', RejectByTest);\n});","enifed('@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 let obj = this.newObject([{ a: 2 }, { a: 1 }]);\n let sorted = obj.sortBy('a');\n\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 let obj = this.newObject([{ a: 1, b: 2 }, { a: 1, b: 1 }]);\n let sorted = obj.sortBy('a', 'b');\n\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 (0, _array.runArrayTests)('sortBy', SortByTests);\n});","enifed('@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 let obj = this.newObject();\n this.assert.deepEqual(obj.toArray(), this.toArray(obj));\n }\n }\n\n (0, _array.runArrayTests)('toArray', ToArrayTests);\n});","enifed('@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 let before, after, obj, ret;\n\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 let 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 (0, _array.runArrayTests)('uniq', UniqTests);\n});","enifed('@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 let numbers = this.newObject([{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 1, value: 'one' }]);\n this.assert.deepEqual(numbers.uniqBy('id'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }]);\n }\n\n '@test supports function as key'() {\n let numbers = this.newObject([{ id: 1, value: 'boom' }, { id: 2, value: 'boom' }, { id: 1, value: 'doom' }]);\n\n let keyFunction = val => {\n this.assert.equal(arguments.length, 1);\n return val.value;\n };\n\n this.assert.deepEqual(numbers.uniqBy(keyFunction), [{ id: 1, value: 'boom' }, { id: 1, value: 'doom' }]);\n }\n }\n\n (0, _array.runArrayTests)('uniqBy', UniqByTests);\n});","enifed('@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 let before, after, obj, ret;\n\n before = (0, _array.newFixture)(3);\n after = [before[0], before[2]];\n obj = this.newObject(before);\n\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 let before, after, obj, ret;\n\n before = [...(0, _array.newFixture)(2), NaN];\n after = [before[0], before[1]];\n obj = this.newObject(before);\n\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 let item, obj, ret;\n\n item = (0, _array.newFixture)(1)[0];\n obj = this.newObject((0, _array.newFixture)(3));\n\n ret = obj.without(item);\n this.assert.equal(ret, obj, 'should be same instance');\n }\n }\n\n (0, _array.runArrayTests)('without', WithoutTests);\n});","enifed('@ember/-internals/runtime/tests/copyable-array/copy-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class CopyTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return an equivalent copy'() {\n let obj = this.newObject();\n let copy = obj.copy();\n this.assert.ok(this.isEqual(obj, copy), 'old object and new object should be equivalent');\n }\n }\n\n (0, _array.runArrayTests)('copy', CopyTest, 'CopyableNativeArray', 'CopyableArray');\n});","enifed('@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 let data = [];\n let 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] = { a: 'hash' };\n data[12] = _object.default.create();\n data[13] = function (a) {\n return a;\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 let suspect, comparable, failureMessage, suspectIndex, comparableIndex;\n\n for (suspectIndex = 0; suspectIndex < data.length; suspectIndex++) {\n suspect = data[suspectIndex];\n\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\n failureMessage = 'data[' + suspectIndex + '] (' + (0, _typeOf.typeOf)(suspect) + ') should be smaller than data[' + comparableIndex + '] (' + (0, _typeOf.typeOf)(comparable) + ')';\n\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 let negOne = Comp.create({\n val: -1\n });\n\n let zero = Comp.create({\n val: 0\n });\n\n let one = Comp.create({\n val: 1\n });\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\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});","enifed('@ember/-internals/runtime/tests/core/copy_test', ['@ember/-internals/runtime/lib/copy', 'internal-test-helpers'], function (_copy, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember Copy Method', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.copy null'](assert) {\n let obj = { field: null };\n let copied = null;\n expectDeprecation(() => {\n copied = (0, _copy.default)(obj, true);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n assert.equal(copied.field, null, 'null should still be null');\n }\n\n ['@test Ember.copy date'](assert) {\n let date = new Date(2014, 7, 22);\n let dateCopy = null;\n expectDeprecation(() => {\n dateCopy = (0, _copy.default)(date);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n assert.equal(date.getTime(), dateCopy.getTime(), 'dates should be equivalent');\n }\n\n ['@test Ember.copy null prototype object'](assert) {\n let obj = Object.create(null);\n\n obj.foo = 'bar';\n let copied = null;\n expectDeprecation(() => {\n copied = (0, _copy.default)(obj);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.equal(copied.foo, 'bar', 'bar should still be bar');\n }\n\n ['@test Ember.copy Array'](assert) {\n let array = [1, null, new Date(2015, 9, 9), 'four'];\n let arrayCopy = null;\n expectDeprecation(() => {\n arrayCopy = (0, _copy.default)(array);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.deepEqual(array, arrayCopy, 'array content cloned successfully in new array');\n }\n\n ['@test Ember.copy cycle detection'](assert) {\n let obj = {\n foo: {\n bar: 'bar'\n }\n };\n obj.foo.foo = obj.foo;\n let cycleCopy = null;\n expectDeprecation(() => {\n cycleCopy = (0, _copy.default)(obj, true);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.equal(cycleCopy.foo.bar, 'bar');\n assert.notEqual(cycleCopy.foo.foo, obj.foo.foo);\n assert.strictEqual(cycleCopy.foo.foo, cycleCopy.foo.foo);\n }\n });\n});","enifed('@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 }, null), 'should return true always');\n\n let obj = {\n isEqual() {\n return false;\n }\n };\n assert.equal((0, _isEqual.default)(obj, obj), false, 'should return false because isEqual returns false');\n }\n });\n});","enifed('@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 const global = undefined;\n\n (0, _internalTestHelpers.moduleFor)('Ember Type Checking', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.isArray'](assert) {\n let numarray = [1, 2, 3];\n let number = 23;\n let strarray = ['Hello', 'Hi'];\n let string = 'Hello';\n let object = {};\n let length = { length: 12 };\n let strangeLength = { length: 'yes' };\n let fn = function () {};\n let arrayProxy = _array_proxy.default.create({ content: (0, _array.A)() });\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)(arrayProxy), true, '[]');\n }\n\n '@test Ember.isArray does not trigger proxy assertion when probing for length GH#16495'(assert) {\n let instance = _object.default.extend({\n // intentionally returning non-null / non-undefined\n unknownProperty() {\n return false;\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 let fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n let 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});","enifed('@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 let arrayProxy = _array_proxy.default.create({ content: (0, _array.A)() });\n\n assert.equal(true, (0, _metal.isEmpty)(arrayProxy), 'for an ArrayProxy that has empty content');\n }\n });\n});","enifed('@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 let MockedDate = function () {};\n MockedDate.prototype = new Date();\n\n let mockedDate = new MockedDate();\n let date = new Date();\n let error = new Error('boum');\n let object = { a: 'b' };\n let a = null;\n let arr = [1, 2, 3];\n let obj = {};\n let instance = _object.default.create({ method() {} });\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)(_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 let fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n let 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});","enifed('@ember/-internals/runtime/tests/ext/function_test', ['@ember/-internals/environment', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/evented', 'internal-test-helpers'], function (_environment, _metal, _object, _evented, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.observes() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test global observer helper takes multiple params'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.observes, 'Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.observes('bar', 'baz')\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer after change');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.on() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sets up an event listener, and can trigger the function on multiple events'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.on, 'Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.on('bar', 'baz')\n });\n\n let obj = (0, _metal.mixin)({}, _evented.default, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke listener immediately');\n\n obj.trigger('bar');\n obj.trigger('baz');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke listeners when events trigger');\n }\n\n ['@test can be chained with observes'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n bay: 'bay',\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.observes('bay').on('bar')\n });\n\n let obj = (0, _metal.mixin)({}, _evented.default, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke listener immediately');\n\n (0, _metal.set)(obj, 'bay', 'BAY');\n obj.trigger('bar');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer and listener');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.property() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sets up a ComputedProperty'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.property, 'Function.prototype helper disabled');\n return;\n }\n\n let MyClass = _object.default.extend({\n firstName: null,\n lastName: null,\n fullName: function () {\n return (0, _metal.get)(this, 'firstName') + ' ' + (0, _metal.get)(this, 'lastName');\n }.property('firstName', 'lastName')\n });\n\n let obj = MyClass.create({ firstName: 'Fred', lastName: 'Flinstone' });\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Fred Flinstone', 'should return the computed value');\n\n (0, _metal.set)(obj, 'firstName', 'Wilma');\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Wilma Flinstone', 'should return the new computed value');\n\n (0, _metal.set)(obj, 'lastName', '');\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Wilma ', 'should return the new computed value');\n }\n });\n});","enifed('@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 const ORIGINAL_ONERROR = (0, _errorHandling.getOnerror)();\n\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 let 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 let fakeTransitionAbort = { name: 'TransitionAborted' };\n\n (0, _runloop.run)(_rsvp.default, 'reject', fakeTransitionAbort);\n\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 let 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 let 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\n let wasEmberTesting = (0, _debug.isTesting)();\n let 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\n let actualError = new Error('OMG what really happened');\n let jqXHR = {\n errorThrown: actualError\n };\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\n let wasEmberTesting = (0, _debug.isTesting)();\n let 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\n let actualError = 'OMG what really happened';\n let jqXHR = {\n errorThrown: actualError\n };\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\n let wasEmberTesting = (0, _debug.isTesting)();\n let 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\n let jqXHR = {\n errorThrown: new Error('a fail')\n };\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 const reason = 'i failed';\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 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 let rejection = _rsvp.default.Promise.reject(reason);\n _rsvp.default.Promise.resolve(1).then(() => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\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 let rejection = _rsvp.default.Promise.reject(reason);\n (0, _runloop.schedule)('afterRender', () => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\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 let done = assert.async();\n\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let 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);\n\n // 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 let store = {\n find() {\n return _rsvp.default.Promise.resolve(1);\n }\n };\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n store.find('user', 1).then(() => rejection.catch(function () {}));\n });\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 let done = assert.async();\n // an ambiguous scenario, this may or may not assert\n // it depends on the locality of `user#1`\n let store = {\n find() {\n return ajax();\n }\n };\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\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 let done = assert.async();\n\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n ajax().then(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n }\n });\n});","enifed('@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', '@ember/-internals/runtime/lib/mixins/copyable', 'internal-test-helpers'], function (exports, _array_proxy, _array, _utils, _metal, _object, _copyable, _internalTestHelpers) {\n 'use strict';\n\n exports.__esModule = true;\n exports.newFixture = newFixture;\n exports.newObjectsFixture = newObjectsFixture;\n exports.runArrayTests = runArrayTests;\n function newFixture(cnt) {\n let ret = [];\n while (--cnt >= 0) {\n ret.push((0, _utils.generateGuid)());\n }\n\n return ret;\n }\n\n function newObjectsFixture(cnt) {\n let ret = [];\n let item;\n while (--cnt >= 0) {\n item = {};\n (0, _utils.guidFor)(item);\n ret.push(item);\n }\n return ret;\n }\n\n const ArrayTestsObserverClass = _object.default.extend({\n init() {\n this._super(...arguments);\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 let loc = keys.length;\n\n while (--loc >= 0) {\n obj.addObserver(keys[loc], this, 'propertyDidChange');\n }\n } else {\n this.isEnabled = false;\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 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 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 let 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 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 class CopyableNativeArray extends AbstractArrayHelper {\n newObject() {\n return (0, _array.A)([(0, _utils.generateGuid)()]);\n }\n\n isEqual(a, b) {\n if (!(a instanceof Array)) {\n return false;\n }\n\n if (!(b instanceof Array)) {\n return false;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n return a[0] === b[0];\n }\n }\n\n class CopyableArray extends AbstractArrayHelper {\n newObject() {\n return CopyableObject.create();\n }\n\n isEqual(a, b) {\n if (!(a instanceof CopyableObject) || !(b instanceof CopyableObject)) {\n return false;\n }\n\n return (0, _metal.get)(a, 'id') === (0, _metal.get)(b, 'id');\n }\n }\n\n class ArrayProxyHelpers extends AbstractArrayHelper {\n newObject(ary) {\n return _array_proxy.default.create({ content: (0, _array.A)(super.newObject(ary)) });\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 const 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 let idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n this._content.push(obj);\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n this._content.shift();\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 /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n const 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 let args = objects ? objects.slice() : [];\n let removeAmt = amt;\n let addAmt = args.length;\n\n (0, _metal.arrayContentWillChange)(this, idx, removeAmt, addAmt);\n\n args.unshift(amt);\n args.unshift(idx);\n this._content.splice.apply(this._content, args);\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 const CopyableObject = _object.default.extend(_copyable.default, {\n id: null,\n\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'id', (0, _utils.generateGuid)());\n },\n\n copy() {\n let ret = CopyableObject.create();\n (0, _metal.set)(ret, 'id', (0, _metal.get)(this, 'id'));\n return ret;\n }\n });\n\n class MutableArrayHelpers extends NativeArrayHelpers {\n newObject(ary) {\n return TestMutableArray.create(super.newObject(ary));\n }\n\n // allows for testing of the basic enumerable after an internal mutation\n mutate(obj) {\n obj.addObject(this.getFixture(1)[0]);\n }\n }\n\n class EmberArrayHelpers extends MutableArrayHelpers {\n newObject(ary) {\n return TestArray.create(super.newObject(ary));\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 case 'EmberArray':\n (0, _internalTestHelpers.moduleFor)(`EmberArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n case 'MutableArray':\n (0, _internalTestHelpers.moduleFor)(`MutableArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n case 'CopyableArray':\n (0, _internalTestHelpers.moduleFor)(`CopyableArray: ${name}`, Tests, CopyableArray);\n break;\n case 'CopyableNativeArray':\n (0, _internalTestHelpers.moduleFor)(`CopyableNativeArray: ${name}`, Tests, CopyableNativeArray);\n break;\n case 'NativeArray':\n (0, _internalTestHelpers.moduleFor)(`NativeArray: ${name}`, Tests, EmberArrayHelpers);\n break;\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});","enifed('@ember/-internals/runtime/tests/inject_test', ['@ember/-internals/metal', '@glimmer/env', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _env, _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 let owner = (0, _internalTestHelpers.buildOwner)();\n let AnObject = _object.default.extend({\n foo: new _metal.InjectedProperty('bar', 'baz')\n });\n\n owner.register('foo:main', AnObject);\n\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 (_env.DEBUG) {\n let AnObject = _object.default.extend({\n foo: new _metal.InjectedProperty('foo', 'bar'),\n bar: new _metal.InjectedProperty('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});","enifed('@ember/-internals/runtime/tests/legacy_1x/mixins/observable/chained_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_runloop, _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\n (0, _internalTestHelpers.moduleFor)('Ember.Observable - Observing with @each', class extends _internalTestHelpers.AbstractTestCase {\n ['@test chained observers on enumerable properties are triggered when the observed property of any item changes'](assert) {\n let family = _object.default.create({ momma: null });\n let momma = _object.default.create({ children: [] });\n\n let child1 = _object.default.create({ name: 'Bartholomew' });\n let child2 = _object.default.create({ name: 'Agnes' });\n let child3 = _object.default.create({ name: 'Dan' });\n let child4 = _object.default.create({ name: 'Nancy' });\n\n (0, _metal.set)(family, 'momma', momma);\n (0, _metal.set)(momma, 'children', (0, _array.A)([child1, child2, child3]));\n\n let observerFiredCount = 0;\n (0, _metal.addObserver)(family, 'momma.children.@each.name', this, function () {\n observerFiredCount++;\n });\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.get)(momma, 'children').setEach('name', 'Juan'));\n assert.equal(observerFiredCount, 3, 'observer fired after changing child names');\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.get)(momma, 'children').pushObject(child4));\n assert.equal(observerFiredCount, 1, 'observer fired after adding a new item');\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.set)(child4, 'name', 'Herbert'));\n assert.equal(observerFiredCount, 1, 'observer fired after changing property on new object');\n\n (0, _metal.set)(momma, 'children', []);\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.set)(child1, 'name', 'Hanna'));\n assert.equal(observerFiredCount, 0, 'observer did not fire after removing changing property on a removed object');\n }\n });\n});","enifed('@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 // ========================================================================\n // Ember.Observable Tests\n // ========================================================================\n\n var object, ObjectC, ObjectD, objectA, objectB, lookup;\n\n var ObservableObject = _object.default.extend(_observable.default);\n var originalLookup = _environment.context.lookup;\n\n // ..........................................................\n // GET()\n //\n\n (0, _internalTestHelpers.moduleFor)('object.get()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend(_observable.default, {\n computed: (0, _metal.computed)(function () {\n return 'value';\n }).volatile(),\n method() {\n return 'value';\n },\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\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 (0, _internalTestHelpers.moduleFor)('Ember.get()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objectA = ObservableObject.extend({\n computed: (0, _metal.computed)(function () {\n return 'value';\n }).volatile(),\n method() {\n return 'value';\n },\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\n }\n }).create({\n normal: 'value',\n numberVal: 24,\n toggleVal: true,\n nullProperty: null\n });\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 _internalTestHelpers.AbstractTestCase {\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 }).volatile()\n }).create()\n });\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\n assert.equal((0, _metal.get)(foo, 'bar.baz'), 'blargh');\n }\n });\n\n // ..........................................................\n // SET()\n //\n\n (0, _internalTestHelpers.moduleFor)('object.set()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n return this._computed;\n },\n set(key, value) {\n this._computed = value;\n return this._computed;\n }\n }).volatile(),\n\n method(key, value) {\n if (value !== undefined) {\n this._method = value;\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\n // computed property\n _computed: 'computed',\n // method, but not a property\n _method: 'method',\n // null property\n nullProperty: null,\n\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 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 // ..........................................................\n // COMPUTED PROPERTIES\n //\n\n (0, _internalTestHelpers.moduleFor)('Computed properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n lookup = _environment.context.lookup = {};\n\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n this.computedCalls.push('getter-called');\n return 'computed';\n },\n set(key, value) {\n this.computedCalls.push(value);\n }\n }).volatile(),\n\n computedCached: (0, _metal.computed)({\n get() {\n this.computedCachedCalls.push('getter-called');\n return 'computedCached';\n },\n set: function (key, value) {\n this.computedCachedCalls.push(value);\n }\n }),\n\n dependent: (0, _metal.computed)({\n get() {\n this.dependentCalls.push('getter-called');\n return 'dependent';\n },\n set(key, value) {\n this.dependentCalls.push(value);\n }\n }).property('changer').volatile(),\n dependentFront: (0, _metal.computed)('changer', {\n get() {\n this.dependentFrontCalls.push('getter-called');\n return 'dependentFront';\n },\n set(key, value) {\n this.dependentFrontCalls.push(value);\n }\n }).volatile(),\n dependentCached: (0, _metal.computed)({\n get() {\n this.dependentCachedCalls.push('getter-called!');\n return 'dependentCached';\n },\n set(key, value) {\n this.dependentCachedCalls.push(value);\n }\n }).property('changer'),\n\n inc: (0, _metal.computed)('changer', function () {\n return this.incCallCount++;\n }),\n\n nestedInc: (0, _metal.computed)(function () {\n (0, _metal.get)(this, 'inc');\n return this.nestedIncCallCount++;\n }).property('inc'),\n\n isOn: (0, _metal.computed)({\n get() {\n return this.get('state') === 'on';\n },\n set() {\n this.set('state', 'on');\n return this.get('state') === 'on';\n }\n }).property('state').volatile(),\n\n isOff: (0, _metal.computed)({\n get() {\n return this.get('state') === 'off';\n },\n set() {\n this.set('state', 'off');\n return this.get('state') === 'off';\n }\n }).property('state').volatile()\n }).create({\n computedCalls: [],\n computedCachedCalls: [],\n changer: 'foo',\n dependentCalls: [],\n dependentFrontCalls: [],\n dependentCachedCalls: [],\n incCallCount: 0,\n nestedIncCallCount: 0,\n state: 'on'\n });\n }\n afterEach() {\n _environment.context.lookup = originalLookup;\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 computedCached dependent dependentFront dependentCached');\n\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 });\n\n // verify each call count. cached should only be called once\n (0, _string.w)('computedCalls dependentFrontCalls dependentCalls').forEach(key => {\n assert.equal(object[key].length, 2, `non-cached property ${key} should be called 2x`);\n });\n\n (0, _string.w)('computedCachedCalls dependentCachedCalls').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 dependentFront computedCached dependentCached');\n var values = (0, _string.w)('value1 value2');\n\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\n assert.equal(object.set(key, values[1]), values[1], `Try #2: object.set(${key}, ${values[1]}) should run function`);\n\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 });\n\n // verify each call count. cached should only be called once\n keys.forEach(key => {\n var calls = object[key + 'Calls'];\n var idx, expectedLength;\n\n // Cached properties first check their cached value before setting the\n // property. Other properties blindly call set.\n expectedLength = 3;\n assert.equal(calls.length, expectedLength, `set(${key}) should be called the right amount of times`);\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('computedCached'); // should run func\n object.get('computedCached'); // should not run func\n\n object.notifyPropertyChange('computedCached');\n\n object.get('computedCached'); // should run again\n assert.equal(object.computedCachedCalls.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 assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n object.set('changer', 'bar');\n\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 assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n object.notifyPropertyChange('changer');\n\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 assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n\n object.set('changer', 'bar');\n\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 assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n\n object.notifyPropertyChange('changer');\n\n assert.equal(object.get('nestedInc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n // This verifies a specific bug encountered where observers for computed\n // properties would fire before their prop caches were cleared.\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 assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n // add observer to verify change...\n object.addObserver('inc', this, function () {\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n });\n\n // now run\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);\n\n // setting isOff to true should clear the kvo cache\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)(function () {\n return this.get('menu.price');\n }).property('menu.price')\n }).create({\n menu: ObservableObject.create({\n price: 5\n })\n });\n\n assert.equal(depObj.get('menuPrice'), 5, 'precond - initial value returns 5');\n\n depObj.set('menu.price', 6);\n\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\n var DepObj;\n\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\n assert.equal(DepObj.get('price'), 5, 'precond - computed property is correct');\n\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\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\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 15\n }));\n });\n\n assert.equal(DepObj.get('price'), 15, 'cacheable computed properties are invalidated after a middle property changes');\n\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 25\n }));\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 // ..........................................................\n // OBSERVABLE OBJECTS\n //\n\n (0, _internalTestHelpers.moduleFor)('Observable objects & object properties ', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n getEach() {\n var keys = ['normal', 'abnormal'];\n var ret = [];\n for (var idx = 0; idx < keys.length; idx++) {\n ret[ret.length] = this.get(keys[idx]);\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\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\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\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 0 - void 0); // Increment by NaN\n }, /Must pass a numeric value to incrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 'Ember'); // Increment by non-numeric String\n }, /Must pass a numeric value to incrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 1 / 0); // Increment by Infinity\n }, /Must pass a numeric value to incrementProperty/i);\n\n assert.equal(25, newValue, 'Attempting to increment by non-numeric values should not increment value');\n\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\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 0 - void 0); // Decrement by NaN\n }, /Must pass a numeric value to decrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 'Ember'); // Decrement by non-numeric String\n }, /Must pass a numeric value to decrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 1 / 0); // Decrement by Infinity\n }, /Must pass a numeric value to decrementProperty/i);\n\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 ['@test should notify array observer when array changes'](assert) {\n (0, _metal.get)(object, 'normalArray').replace(0, 0, [6]);\n assert.equal(object.abnormal, 'notifiedObserver', 'observer should be notified');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('object.addObserver()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectC = ObservableObject.create({\n objectE: ObservableObject.create({\n propertyVal: 'chainedProperty'\n }),\n\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 ['@test should register an observer for a property'](assert) {\n ObjectC.addObserver('normal', ObjectC, 'action');\n ObjectC.set('normal', 'newValue');\n assert.equal(ObjectC.normal1, 'newZeroValue');\n }\n\n ['@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 assert.equal('chainedPropertyObserved', ObjectC.normal2);\n ObjectC.normal2 = 'dependentValue';\n ObjectC.set('objectE', '');\n assert.equal('chainedPropertyObserved', ObjectC.normal2);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('object.removeObserver()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectD = ObservableObject.create({\n objectF: ObservableObject.create({\n propertyVal: 'chainedProperty'\n }),\n\n normal: 'value',\n normal1: 'zeroValue',\n normal2: 'dependentValue',\n ArrayKeys: ['normal', 'normal1'],\n\n addAction() {\n this.normal1 = 'newZeroValue';\n },\n removeAction() {\n this.normal2 = 'newDependentValue';\n },\n removeChainedObserver() {\n this.normal2 = 'chainedPropertyObserved';\n },\n\n observableValue: 'hello world',\n\n observer1() {\n // Just an observer\n },\n observer2() {\n this.removeObserver('observableValue', null, 'observer1');\n this.removeObserver('observableValue', null, 'observer2');\n this.hasObserverFor('observableValue'); // Tickle 'getMembers()'\n this.removeObserver('observableValue', null, 'observer3');\n },\n observer3() {\n // Just an observer\n }\n });\n }\n\n ['@test should unregister an observer for a property'](assert) {\n ObjectD.addObserver('normal', ObjectD, 'addAction');\n ObjectD.set('normal', 'newValue');\n assert.equal(ObjectD.normal1, 'newZeroValue');\n\n ObjectD.set('normal1', 'zeroValue');\n\n ObjectD.removeObserver('normal', ObjectD, 'addAction');\n ObjectD.set('normal', 'newValue');\n assert.equal(ObjectD.normal1, 'zeroValue');\n }\n\n [\"@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 ObjectD.removeObserver('objectF.propertyVal', ObjectD, 'removeChainedObserver');\n ObjectD.normal2 = 'dependentValue';\n ObjectD.objectF.set('propertyVal', 'removedPropertyValue');\n assert.equal('dependentValue', ObjectD.normal2);\n ObjectD.set('objectF', '');\n assert.equal('dependentValue', ObjectD.normal2);\n }\n\n ['@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 try {\n ObjectD.addObserver('observableValue', null, 'observer1');\n ObjectD.addObserver('observableValue', null, 'observer2');\n ObjectD.addObserver('observableValue', null, 'observer3');\n (0, _runloop.run)(function () {\n ObjectD.set('observableValue', 'hi world');\n });\n } catch (e) {\n encounteredError = true;\n }\n assert.equal(encounteredError, false);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/mixins/observable/propertyChanges_test', ['@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/observable', '@ember/-internals/metal', 'internal-test-helpers'], function (_object, _observable, _metal, _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 * Create ObservableObject which includes Ember.Observable\n * Remove test that tests internal _kvo_changeLevel property. This is an\n implementation detail.\n * Remove test for allPropertiesDidChange\n * Removed star observer test. no longer supported\n * Removed property revision test. no longer supported\n */\n\n // ========================================================================\n // Ember.Observable Tests\n // ========================================================================\n\n const ObservableObject = _object.default.extend(_observable.default);\n\n let ObjectA;\n\n (0, _internalTestHelpers.moduleFor)('object.propertyChanges', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectA = ObservableObject.extend({\n action: (0, _metal.observer)('foo', function () {\n this.set('prop', 'changedPropValue');\n }),\n notifyAction: (0, _metal.observer)('newFoo', function () {\n this.set('newProp', 'changedNewPropValue');\n }),\n\n notifyAllAction: (0, _metal.observer)('prop', function () {\n this.set('newFoo', 'changedNewFooValue');\n }),\n\n starObserver(target, key) {\n this.starProp = key;\n }\n }).create({\n starProp: null,\n\n foo: 'fooValue',\n prop: 'propValue',\n\n newFoo: 'newFooValue',\n newProp: 'newPropValue'\n });\n }\n\n ['@test should observe the changes within the nested begin / end property changes'](assert) {\n //start the outer nest\n ObjectA.beginPropertyChanges();\n\n // Inner nest\n ObjectA.beginPropertyChanges();\n ObjectA.set('foo', 'changeFooValue');\n\n assert.equal(ObjectA.prop, 'propValue');\n ObjectA.endPropertyChanges();\n\n //end inner nest\n ObjectA.set('prop', 'changePropValue');\n assert.equal(ObjectA.newFoo, 'newFooValue');\n\n //close the outer nest\n ObjectA.endPropertyChanges();\n\n assert.equal(ObjectA.prop, 'changedPropValue');\n assert.equal(ObjectA.newFoo, 'changedNewFooValue');\n }\n\n ['@test should observe the changes within the begin and end property changes'](assert) {\n ObjectA.beginPropertyChanges();\n ObjectA.set('foo', 'changeFooValue');\n\n assert.equal(ObjectA.prop, 'propValue');\n ObjectA.endPropertyChanges();\n\n assert.equal(ObjectA.prop, 'changedPropValue');\n }\n\n ['@test should indicate that the property of an object has just changed'](assert) {\n //change the value of foo.\n ObjectA.set('foo', 'changeFooValue');\n\n // Indicate the subscribers of foo that the value has just changed\n ObjectA.notifyPropertyChange('foo', null);\n\n // Values of prop has just changed\n assert.equal(ObjectA.prop, 'changedPropValue');\n }\n\n ['@test should notify that the property of an object has changed'](assert) {\n // Notify to its subscriber that the values of 'newFoo' will be changed. In this\n // case the observer is \"newProp\". Therefore this will call the notifyAction function\n // and value of \"newProp\" will be changed.\n ObjectA.notifyPropertyChange('newFoo', 'fooValue');\n\n //value of newProp changed.\n assert.equal(ObjectA.newProp, 'changedNewPropValue');\n }\n\n ['@test should invalidate function property cache when notifyPropertyChange is called'](assert) {\n let a = ObservableObject.extend({\n b: (0, _metal.computed)({\n get() {\n return this._b;\n },\n set(key, value) {\n this._b = value;\n return this;\n }\n }).volatile()\n }).create({\n _b: null\n });\n\n a.set('b', 'foo');\n assert.equal(a.get('b'), 'foo', 'should have set the correct value for property b');\n\n a._b = 'bar';\n a.notifyPropertyChange('b');\n a.set('b', 'foo');\n assert.equal(a.get('b'), 'foo', 'should have invalidated the cache so that the newly set value is actually set');\n }\n });\n});","enifed('@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 // ========================================================================\n // EmberObject Base Tests\n // ========================================================================\n\n let 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 aMethodThatExists() {},\n aMethodThatReturnsTrue() {\n return true;\n },\n aMethodThatReturnsFoobar() {\n return 'Foobar';\n },\n aMethodThatReturnsFalse() {\n return false;\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\n (0, _metal.set)(obj, 'foo', 'Chunky Bacon');\n (0, _metal.set)(obj, 'total', 12);\n\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 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});","enifed('@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\n function K() {\n return this;\n }\n\n let klass;\n\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 let obj = klass.create({\n values: ['d', 'e', 'f']\n });\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates subclasses'](assert) {\n let subKlass = klass.extend({\n values: ['d', 'e', 'f']\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\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 let obj = klass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates mixin'](assert) {\n let mixin = {\n values: ['d', 'e']\n };\n let subKlass = klass.extend(mixin, {\n values: ['f']\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\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({ values: ['d'] });\n let subKlass = klass.extend({ values: ['e'] });\n let obj = subKlass.create({ values: ['f'] });\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\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 let subKlass = klass.extend({\n functions: K\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'functions');\n let expected = [K, K];\n\n assert.deepEqual(values, expected, `should concatenate functions property (expected: ${expected}, got: ${values})`);\n }\n });\n});","enifed('@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 const 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 let idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n this._content.push(obj);\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n this._content.shift();\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 let x = _object.default.extend(_array.default).create({\n length: 0\n });\n let 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 let testArray = TestArray.create({ _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\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\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 // ..........................................................\n // CONTENT DID CHANGE\n //\n\n const DummyArray = _object.default.extend(_array.default, {\n length: 0,\n objectAt(idx) {\n return 'ITEM-' + idx;\n }\n });\n\n let obj, observer;\n\n // ..........................................................\n // NOTIFY ARRAY OBSERVERS\n //\n\n (0, _internalTestHelpers.moduleFor)('mixins/array/arrayContent[Will|Did]Change', class extends _internalTestHelpers.AbstractTestCase {\n ['@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\n assert.equal(obj._count, 0, 'should not have invoked yet');\n\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n\n assert.equal(obj._count, 1, 'should have invoked');\n }\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\n assert.equal(obj._after, 0, 'should not have fired yet');\n }\n\n afterEach() {\n obj = null;\n }\n\n ['@test should notify observers when call with no params'](assert) {\n (0, _metal.arrayContentWillChange)(obj);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj);\n assert.equal(obj._after, 1);\n }\n\n // API variation that included items only\n ['@test should not notify when passed lengths are same'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n assert.equal(obj._after, 0);\n }\n\n ['@test should notify when passed lengths are different'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 2);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 2);\n assert.equal(obj._after, 1);\n }\n });\n\n // ..........................................................\n // NOTIFY ARRAY OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('notify array observers', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach(assert) {\n obj = DummyArray.create();\n\n observer = _object.default.extend({\n arrayWillChange() {\n assert.equal(this._before, null); // should only call once\n this._before = Array.prototype.slice.call(arguments);\n },\n\n arrayDidChange() {\n assert.equal(this._after, null); // should only call once\n this._after = Array.prototype.slice.call(arguments);\n }\n }).create({\n _before: null,\n _after: null\n });\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\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, [obj, 0, -1, -1]);\n }\n\n // API variation that included items only\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\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\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\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, null);\n }\n });\n\n // ..........................................................\n // @each\n //\n\n let ary;\n\n (0, _internalTestHelpers.moduleFor)('EmberArray.@each support', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ary = TestArray.create({\n _content: [{ isDone: true, desc: 'Todo 1' }, { isDone: false, desc: 'Todo 2' }, { isDone: true, desc: 'Todo 3' }, { isDone: false, desc: 'Todo 4' }]\n });\n }\n\n afterEach() {\n ary = null;\n }\n\n ['@test adding an object should notify (@each.isDone)'](assert) {\n let called = 0;\n\n let observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n });\n\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n\n ary.addObject(_object.default.create({\n desc: 'foo',\n isDone: false\n }));\n\n assert.equal(called, 1, 'calls observer when object is pushed');\n }\n\n ['@test getting @each is deprecated'](assert) {\n assert.expect(1);\n\n expectDeprecation(() => {\n (0, _metal.get)(ary, '@each');\n }, /Getting the '@each' property on object .* is deprecated/);\n }\n\n ['@test @each is readOnly'](assert) {\n assert.expect(1);\n\n assert.throws(function () {\n (0, _metal.set)(ary, '@each', 'foo');\n }, /Cannot set read-only property \"@each\"/);\n }\n\n ['@test using @each to observe arrays that does not return objects raise error'](assert) {\n let called = 0;\n\n let observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n });\n\n ary = TestArray.create({\n objectAt(idx) {\n return (0, _metal.get)(this._content[idx], 'desc');\n }\n });\n\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n\n expectAssertion(() => {\n ary.addObject(_object.default.create({\n desc: 'foo',\n isDone: false\n }));\n }, /When using @each to observe the array/);\n\n assert.equal(called, 0, 'not calls observer when object is pushed');\n }\n\n ['@test modifying the array should also indicate the isDone prop itself has changed'](assert) {\n // NOTE: we never actually get the '@each.isDone' property here. This is\n // important because it tests the case where we don't have an isDone\n // EachArray materialized but just want to know when the property has\n // changed.\n let each;\n expectDeprecation(() => {\n each = (0, _metal.get)(ary, '@each');\n });\n let count = 0;\n\n (0, _metal.addObserver)(each, 'isDone', () => count++);\n\n count = 0;\n let item = (0, _metal.objectAt)(ary, 2);\n (0, _metal.set)(item, 'isDone', !(0, _metal.get)(item, 'isDone'));\n assert.equal(count, 1, '@each.isDone should have notified');\n }\n\n ['@test `objectAt` returns correct object'](assert) {\n let 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 let obj = _object.default.extend({\n init() {\n this._super(...arguments);\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({ common: 'HI!' }));\n assert.equal('HI!', (0, _metal.get)(obj, 'common'));\n\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 ['@test observers that contain @each in the path should fire only once the first time they are accessed'](assert) {\n let count = 0;\n\n let obj = _object.default.extend({\n init() {\n this._super(...arguments);\n // Observer does not fire on init\n (0, _metal.set)(this, 'resources', (0, _array.A)());\n },\n\n commonDidChange: (0, _metal.observer)('resources.@each.common', () => count++)\n }).create();\n\n // Observer fires second time when new object is added\n (0, _metal.get)(obj, 'resources').pushObject(_object.default.create({ common: 'HI!' }));\n // Observer fires third time when property on an object is changed\n (0, _metal.set)((0, _metal.objectAt)((0, _metal.get)(obj, 'resources'), 0), 'common', 'BYE!');\n\n assert.equal(count, 2, 'observers should only be called once');\n }\n });\n});","enifed('@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 const 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 let r1, r2;\n\n (0, _internalTestHelpers.moduleFor)('Comparable', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n r1 = Rectangle.create({ length: 6, width: 12 });\n r2 = Rectangle.create({ length: 6, width: 13 });\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});","enifed('@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'], function (_owner, _container, _container_proxy, _object, _runloop, _internalTestHelpers) {\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\n this.registry = new _container.Registry();\n\n this.instance.__container__ = new _container.Container(this.registry, {\n owner: this.instance\n });\n }\n\n ['@test provides ownerInjection helper method'](assert) {\n let result = this.instance.ownerInjection();\n\n assert.equal(result[_owner.OWNER], this.instance, 'returns an object with the OWNER symbol');\n }\n\n ['@test actions queue completes before destruction'](assert) {\n assert.expect(1);\n\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 let service = this.instance.lookup('service:auth');\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', service, 'destroy');\n this.instance.destroy();\n });\n }\n });\n});","enifed('@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});","enifed('@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 let eventedProxyObj = _core_object.default.extend(_evented.default, {\n unknownProperty() {\n return true;\n }\n }).create();\n\n let noop = function () {};\n\n eventedProxyObj.on('foo', noop);\n eventedProxyObj.off('foo', noop);\n\n assert.ok(true, 'An assertion was triggered');\n }\n });\n});","enifed('@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});","enifed('@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 let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n let 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 let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n let 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 let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n obj.setProperties({ firstName: 'Tim', lastName: 'Cook' });\n assert.equal('Tim', obj.get('firstName'));\n assert.equal('Cook', obj.get('lastName'));\n }\n\n ['@test calling setProperties completes safely despite exceptions'](assert) {\n let exc = new Error('Something unexpected happened!');\n let obj = _object.default.extend({\n companyName: (0, _metal.computed)({\n get() {\n return 'Apple, Inc.';\n },\n set() {\n throw exc;\n }\n })\n }).create({\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n\n let firstNameChangedCount = 0;\n\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 assert.equal(firstNameChangedCount, 1, 'firstName should have fired once');\n }\n\n ['@test should be able to retrieve cached values of computed properties without invoking the computed property'](assert) {\n let 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\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\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 let obj = _object.default.create({\n age: '24'\n });\n obj.incrementProperty('age');\n assert.equal(25, obj.get('age'));\n }\n\n ['@test propertyWillChange triggers a deprecation warning']() {\n let obj = _object.default.create();\n\n expectDeprecation(() => {\n obj.propertyWillChange('foo');\n }, /'propertyWillChange' is deprecated and has no effect. It is safe to remove this call./);\n }\n\n ['@test propertyDidChange triggers a deprecation warning']() {\n let obj = _object.default.create();\n\n expectDeprecation(() => {\n obj.propertyDidChange('foo');\n }, /'propertyDidChange' is deprecated in favor of 'notifyPropertyChange'. It is safe to change this call to 'notifyPropertyChange'./);\n }\n });\n});","enifed('@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, _rsvp2, _internalTestHelpers) {\n 'use strict';\n\n let ObjectPromiseProxy;\n\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 _rsvp2.on('error', _rsvp.onerrorDefault);\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 let proxy = ObjectPromiseProxy.create();\n\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 let value = {\n firstName: 'stef',\n lastName: 'penner'\n };\n\n let deferred = _rsvp2.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\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\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'resolve', value);\n\n assert.equal(didFulfillCount, 1, 'should have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not have been rejected');\n\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\n (0, _runloop.run)(deferred, 'resolve', value);\n\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n\n (0, _runloop.run)(deferred, 'reject', value);\n\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n\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');\n\n // rest of the promise semantics are tested in directly in RSVP\n }\n\n ['@test rejection'](assert) {\n let reason = new Error('failure');\n let deferred = _rsvp2.defer();\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\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\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'reject', reason);\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n\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\n (0, _runloop.run)(deferred, 'reject', reason);\n\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n\n (0, _runloop.run)(deferred, 'resolve', 1);\n\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n\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 }\n\n // https://github.com/emberjs/ember.js/issues/15694\n ['@test rejection without specifying reason'](assert) {\n let deferred = _rsvp2.defer();\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\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\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'reject');\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n\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\n _rsvp2.on('error', onerror);\n _rsvp2.off('error', _rsvp.onerrorDefault);\n\n let expectedReason = new Error('failure');\n let deferred = _rsvp2.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.get('promise');\n\n function onerror(reason) {\n assert.equal(reason, expectedReason, 'expected reason');\n }\n\n _rsvp2.on('error', onerror);\n _rsvp2.off('error', _rsvp.onerrorDefault);\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\n _rsvp2.on('error', _rsvp.onerrorDefault);\n _rsvp2.off('error', onerror);\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\n _rsvp2.on('error', _rsvp.onerrorDefault);\n _rsvp2.off('error', onerror);\n }\n\n ['@test should work with promise inheritance'](assert) {\n class PromiseSubclass extends _rsvp2.Promise {}\n\n let proxy = ObjectPromiseProxy.create({\n promise: new PromiseSubclass(() => {})\n });\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 let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\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\n (0, _runloop.run)(deferred, 'resolve');\n\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 let anotherDeferred = _rsvp.default.defer();\n proxy.set('promise', anotherDeferred.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\n (0, _runloop.run)(anotherDeferred, 'reject');\n\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 let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.addObserver('isFulfilled', () => assert.equal((0, _metal.get)(proxy, 'content'), true));\n\n (0, _runloop.run)(deferred, 'resolve', true);\n }\n\n ['@test should have reason when isRejected is set'](assert) {\n let error = new Error('Y U REJECT?!?');\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\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 let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'resolve', true);\n\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 let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'reject', 'some reason');\n\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 let deferred = _rsvp.default.defer();\n let expectedValue = {};\n let receivedValue;\n let didResolveCount = 0;\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(value => {\n receivedValue = value;\n didResolveCount++;\n }, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'resolve', expectedValue);\n\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 let deferred = _rsvp.default.defer();\n let expectedReason = 'some reason';\n let receivedReason;\n let didRejectCount = 0;\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, reason => {\n receivedReason = reason;\n didRejectCount++;\n });\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\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});","enifed('@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 let originalLookup = _environment.context.lookup;\n let lookup;\n\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 let 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 let 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 let 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\n let Test = {};\n lookup.Test = Test;\n\n Test.targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called on global object');\n }\n });\n\n let 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 let 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 assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should raise a deprecation warning when targetObject is specified and used'](assert) {\n assert.expect(4);\n let obj;\n expectDeprecation(() => {\n obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: {},\n targetObject: _object.default.create({\n anEvent(ctx) {\n assert.ok(obj.actionContext === ctx, 'anEvent method was called with the expected context');\n }\n })\n });\n }, /Usage of `targetObject` is deprecated. Please use `target` instead./);\n assert.ok(true === obj.triggerAction(), 'a valid targetObject and action were specified');\n expectDeprecation(() => obj.get('targetObject'), /Usage of `targetObject` is deprecated. Please use `target` instead./);\n }\n\n ['@test it should find an actionContext specified as a property path'](assert) {\n assert.expect(2);\n\n let Test = {};\n lookup.Test = Test;\n Test.aContext = {};\n\n let 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 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 let targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n });\n let obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ target: targetObj }), '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 let 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 assert.ok(true === obj.triggerAction({ action: 'anEvent' }), '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 let context = {};\n let 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 action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ actionContext: context }), 'a valid target and action were specified');\n }\n\n ['@test it should allow multiple arguments from actionContext'](assert) {\n assert.expect(3);\n let param1 = 'someParam';\n let param2 = 'someOtherParam';\n let 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 action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ actionContext: [param1, param2] }), '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 let 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 action: 'anEvent'\n });\n assert.ok(true === obj.triggerAction({ actionContext: null }), 'a valid target and action were specified');\n }\n });\n});","enifed('@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 let before = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n this.assert.equal(obj.addObject(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B].addObject(C) => [A,B,C] + notify'() {\n let before = (0, _array.newFixture)(2);\n let item = (0, _array.newFixture)(1)[0];\n let after = [before[0], before[1], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.addObject(item);\n\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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n }\n\n '@test [A,B,C].addObject(A) => [A,B,C] + NO notify'() {\n let before = (0, _array.newFixture)(3);\n let after = before;\n let item = before[0];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.addObject(item); // note: item in set\n\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 }\n\n (0, _array.runArrayTests)('addObject', AddObjectTest, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [].clear() => [] + notify'() {\n let before = [];\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self');\n\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 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 }\n\n '@test [X].clear() => [] + notify'() {\n var obj, before, after, observer;\n\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'); /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self');\n\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 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 }\n }\n\n (0, _array.runArrayTests)('clear', ClearTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [].insertAt(0, X) => [X] + notify'() {\n let after = (0, _array.newFixture)(1);\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, after[0]);\n\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 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 }\n\n '@test [].insertAt(200,X) => OUT_OF_RANGE_EXCEPTION exception'() {\n let obj = this.newObject([]);\n let that = this;\n\n this.assert.throws(() => obj.insertAt(200, that.newFixture(1)[0]), Error);\n }\n\n '@test [A].insertAt(0, X) => [X,A] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(1);\n let after = [item, before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, item);\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A].insertAt(1, X) => [A,X] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(1);\n let after = [before[0], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(1, item);\n\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 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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n\n '@test [A].insertAt(200,X) => OUT_OF_RANGE exception'() {\n let obj = this.newObject((0, _array.newFixture)(1));\n let that = this;\n\n this.assert.throws(() => obj.insertAt(200, that.newFixture(1)[0]), Error);\n }\n\n '@test [A,B,C].insertAt(0,X) => [X,A,B,C] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, item);\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].insertAt(1,X) => [A,X,B,C] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [before[0], item, before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n let objectAtCalls = [];\n\n let objectAt = obj.objectAt;\n obj.objectAt = ix => {\n objectAtCalls.push(ix);\n return objectAt.call(obj, ix);\n };\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n objectAtCalls.splice(0, objectAtCalls.length);\n\n obj.insertAt(1, item);\n this.assert.deepEqual(objectAtCalls, [], 'objectAt is not called when only inserting items');\n\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 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\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 '@test [A,B,C].insertAt(3,X) => [A,B,C,X] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(3, item);\n\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 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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n }\n\n (0, _array.runArrayTests)('instertAt', InsertAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [].popObject() => [] + returns undefined + NO notify'() {\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.popObject(), undefined, 'popObject results');\n\n this.assert.deepEqual(this.toArray(obj), [], 'post item results');\n\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 }\n\n '@test [X].popObject() => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n let ret = obj.popObject();\n\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\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 }\n\n '@test [A,B,C].popObject() => [A,B] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[1]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n let ret = obj.popObject();\n\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\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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n }\n\n (0, _array.runArrayTests)('popObject', PopObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let exp = (0, _array.newFixture)(1)[0];\n let obj = this.newObject([]);\n\n this.assert.equal(obj.pushObject(exp), exp, 'should return pushed object');\n }\n\n '@test [].pushObject(X) => [X] + notify'() {\n let before = [];\n let after = (0, _array.newFixture)(1);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(after[0]);\n\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 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 }\n\n '@test [A,B,C].pushObject(X) => [A,B,C,X] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = (0, _array.newFixture)(1)[0];\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(item);\n\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 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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n\n '@test [A,B,C,C].pushObject(A) => [A,B,C,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = before[2]; // note same object as current tail. should end up twice\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(item);\n\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 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\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 }\n }\n\n (0, _array.runArrayTests)('pushObject', PushObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let obj = this.newObject([]);\n\n expectAssertion(() => obj.pushObjects('string'));\n }\n }\n\n (0, _array.runArrayTests)('pushObjects', PushObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test removeAt([X], 0) => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self');\n\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 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 }\n\n '@test removeAt([], 200) => OUT_OF_RANGE_EXCEPTION exception'() {\n let obj = this.newObject([]);\n this.assert.throws(() => (0, _array2.removeAt)(obj, 200), Error);\n }\n\n '@test removeAt([A,B], 0) => [B] + notify'() {\n let before = (0, _array.newFixture)(2);\n let after = [before[1]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self');\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test removeAt([A,B], 1) => [A] + notify'() {\n let before = (0, _array.newFixture)(2);\n let after = [before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self');\n\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 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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test removeAt([A,B,C], 1) => [A,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self');\n\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 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\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 '@test removeAt([A,B,C,D], 1,2) => [A,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[3]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1, 2), obj, 'return self');\n\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 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\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 '@test [A,B,C,D].removeAt(1,2) => [A,D] + notify'() {\n var obj, before, after, observer;\n\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'); /* Prime the cache */\n\n this.assert.equal(obj.removeAt(1, 2), obj, 'return self');\n\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 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\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\n (0, _array.runArrayTests)('removeAt', RemoveAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let before = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n\n this.assert.equal(obj.removeObject(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B,C].removeObject(B) => [A,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.removeObject(before[1]);\n\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\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\n '@test [A,B,C].removeObject(D) => [A,B,C]'() {\n let before = (0, _array.newFixture)(3);\n let after = before;\n let item = (0, _array.newFixture)(1)[0];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.removeObject(item); // note: item not in set\n\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\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 }\n\n (0, _array.runArrayTests)('removeObject', RemoveObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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'], function (_metal, _internalTestHelpers, _array, _array2) {\n 'use strict';\n\n class RemoveObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let obj = before;\n\n this.assert.equal(obj.removeObjects(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B,C].removeObjects([B]) => [A,C] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [before[0], before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]);\n\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\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\n '@test [{A},{B},{C}].removeObjects([{B}]) => [{A},{C}] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [before[0], before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]);\n\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\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\n '@test [A,B,C].removeObjects([A,B]) => [C] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]);\n\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\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\n '@test [{A},{B},{C}].removeObjects([{A},{B}]) => [{C}] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]);\n\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\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\n '@test [A,B,C].removeObjects([A,B,C]) => [] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1], before[2]]);\n\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\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\n '@test [{A},{B},{C}].removeObjects([{A},{B},{C}]) => [] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects(before);\n\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\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\n '@test [A,B,C].removeObjects([D]) => [A,B,C]'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = before;\n let item = (0, _array.newFixture)(1)[0];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([item]); // Note: item not in set\n\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\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 }\n\n (0, _array.runArrayTests)('removeObjects', RemoveObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 \"@test [].replace(0,0,'X') => ['X'] + notify\"() {\n let exp = (0, _array.newFixture)(1);\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(0, 0, exp);\n\n this.assert.deepEqual(this.toArray(obj), exp, 'post item results');\n\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 }\n\n '@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 obj.objectAt = function () {\n called++;\n };\n observer = this.newObserver(obj, 'firstObject', 'lastObject');\n\n obj.replace(0, 0, exp);\n\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 }\n\n '@test [A,B,C,D].replace(1,2,X) => [A,X,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let replace = (0, _array.newFixture)(1);\n let after = [before[0], replace[0], before[3]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 2, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\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\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 '@test [A,B,C,D].replace(1,2,[X,Y]) => [A,X,Y,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let replace = (0, _array.newFixture)(2);\n let after = [before[0], replace[0], replace[1], before[3]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 2, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\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\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 '@test [A,B].replace(1,0,[X,Y]) => [A,X,Y,B] + notify'() {\n let before = (0, _array.newFixture)(2);\n let replace = (0, _array.newFixture)(2);\n let after = [before[0], replace[0], replace[1], before[1]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 0, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\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\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 '@test [A,B,C,D].replace(2,2) => [A,B] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[1]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(2, 2);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test [A,B,C,D].replace(-1,1) => [A,B,C] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[1], before[2]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(-1, 1);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\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\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test Adding object should notify array observer'() {\n let fixtures = (0, _array.newFixture)(4);\n let obj = this.newObject(fixtures);\n let observer = this.newObserver(obj).observeArray(obj);\n let item = (0, _array.newFixture)(1)[0];\n\n obj.replace(2, 2, [item]);\n\n this.assert.deepEqual(observer._before, [obj, 2, 2, 1], 'before');\n this.assert.deepEqual(observer._after, [obj, 2, 2, 1], 'after');\n }\n }\n\n (0, _array.runArrayTests)('replace', ReplaceTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [A,B,C].reverseObjects() => [] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[2], before[1], before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.reverseObjects(), obj, 'return self');\n\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 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 }\n }\n\n (0, _array.runArrayTests)('reverseObjects', ReverseObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [A,B,C].setObjects([]) = > [] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self');\n\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 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 }\n\n '@test [A,B,C].setObjects([D, E, F, G]) = > [D, E, F, G] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = (0, _array.newFixture)(4);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self');\n\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 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 }\n }\n\n (0, _array.runArrayTests)('setObjects', SetObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 '@test [].shiftObject() => [] + returns undefined + NO notify'() {\n let before = [];\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), undefined);\n\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 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\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 '@test [X].shiftObject() => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object');\n\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 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 }\n\n '@test [A,B,C].shiftObject() => [B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object');\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('shiftObject', ShiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let obj = this.newObject([]);\n let item = (0, _array.newFixture)(1)[0];\n\n this.assert.equal(obj.unshiftObject(item), item, 'should return unshifted object');\n }\n\n '@test [].unshiftObject(X) => [X] + notify'() {\n let before = [];\n let item = (0, _array.newFixture)(1)[0];\n let after = [item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\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 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 }\n\n '@test [A,B,C].unshiftObject(X) => [X,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = (0, _array.newFixture)(1)[0];\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].unshiftObject(A) => [A,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = before[0]; // note same object as current head. should end up twice\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\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 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\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 }\n }\n\n (0, _array.runArrayTests)('unshiftObject', UnshiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let obj = this.newObject([]);\n let items = (0, _array.newFixture)(3);\n\n this.assert.equal(obj.unshiftObjects(items), obj, 'should return receiver');\n }\n\n '@test [].unshiftObjects([A,B,C]) => [A,B,C] + notify'() {\n let before = [];\n let items = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\n this.assert.deepEqual(this.toArray(obj), items, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), items.length, 'length');\n\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 }\n\n '@test [A,B,C].unshiftObjects([X,Y]) => [X,Y,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let items = (0, _array.newFixture)(2);\n let after = items.concat(before);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\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 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\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].unshiftObjects([A,B]) => [A,B,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let items = [before[0], before[1]]; // note same object as current head. should end up twice\n let after = items.concat(before);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\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 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\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 }\n }\n\n (0, _array.runArrayTests)('unshiftObjects', UnshiftObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@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 let array;\n\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 let content = this.get('content');\n return content && (0, _array.A)(content.slice().sort((a, b) => {\n if (a == null) {\n a = -1;\n }\n if (b == null) {\n b = -1;\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\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 }\n\n // Not sure if we need a specific test for it, since it's internal\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)(function () {\n let 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 if (b == null) {\n b = -1;\n }\n return b - a;\n }));\n }).property('content.[]'),\n\n objectAtContent(idx) {\n let obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\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 }\n\n // Not sure if we need a specific test for it, since it's internal\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 let obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\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 let 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 let 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});","enifed('@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 assert.expect(4);\n\n let content = (0, _array.A)(['x', 'y', 'z']);\n let proxy = _array_proxy.default.create({ content });\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 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 assert.expect(4);\n\n let content = (0, _array.A)(['x', 'y', 'z']);\n let proxy = _array_proxy.default.create({ content });\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 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});","enifed('@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 let proxy1 = _array_proxy.default.create();\n let proxy2 = _array_proxy.default.create();\n\n (0, _runloop.run)(() => proxy1.destroy());\n\n (0, _metal.set)(proxy2, 'content', proxy1);\n\n assert.ok(true, 'No exception was raised');\n }\n\n ['@test should update if content changes while change events are deferred'](assert) {\n let proxy = _array_proxy.default.create();\n\n assert.deepEqual(proxy.toArray(), []);\n\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 let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\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\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\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 let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\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\n indexes.length = 0;\n\n proxy.content.replace(-1, 0, [7]);\n proxy.content.replace(-2, 0, [6]);\n\n assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 6, 7, 5]);\n assert.deepEqual(indexes, [4, 5, 6]);\n }\n });\n});","enifed('@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'], function (_array_proxy, _object, _metal, _computed, _array, _internalTestHelpers) {\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 let 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\n proxy.set('content', null);\n\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 let 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');\n\n // Consume computed property that depends on length\n proxy.get('isEmpty');\n\n // update content\n proxy.set('content', null);\n\n assert.equal(proxy.get('length'), 0, 'length updates');\n }\n\n ['@test getting length does not recompute the object cache'](assert) {\n let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\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\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\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'content', null);\n\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 let obj = _array_proxy.default.extend({\n willDestroy() {\n this.set('content', null);\n this._super(...arguments);\n }\n }).create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n\n this.runTask(() => obj.destroy());\n\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 0);\n\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 1);\n\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 3);\n\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'content', null);\n assert.equal(obj.length, 0, 'length was updated');\n\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 let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 1);\n\n assert.equal(obj.length, 1, 'length was updated');\n assert.deepEqual(obj.content, ['foo'], 'content length was truncated');\n }\n\n ['@test array proxy + aliasedProperty complex test'](assert) {\n let aCalled, bCalled, cCalled, dCalled, eCalled;\n\n aCalled = bCalled = cCalled = dCalled = eCalled = 0;\n\n let obj = _object.default.extend({\n colors: (0, _computed.oneWay)('model'),\n length: (0, _computed.oneWay)('colors.length'),\n\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();\n\n obj.set('model', _array_proxy.default.create({\n content: (0, _array.A)(['red', 'yellow', 'blue'])\n }));\n\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\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\n obj.get('colors').pushObjects(['green', 'red']);\n\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\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 }\n });\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test', ['@ember/-internals/meta', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_meta, _metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n function sortedListenersFor(obj, eventName) {\n let listeners = (0, _meta.peekMeta)(obj).matchingListeners(eventName) || [];\n\n let keys = [];\n for (let i = 0; i < listeners.length; i += 3) {\n keys.push(listeners[i + 1]);\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 let content = (0, _array.A)();\n let proxy = _array_proxy.default.create();\n\n assert.deepEqual(sortedListenersFor(content, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content, '@array:change'), []);\n\n proxy.set('content', content);\n\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 let content1 = (0, _array.A)();\n let content2 = (0, _array.A)();\n let proxy = _array_proxy.default.create({ content: content1 });\n\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), ['_arrangedContentArrayDidChange']);\n\n proxy.set('content', content2);\n\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 [`@test regression test for https://github.com/emberjs/ember.js/issues/12475`](assert) {\n let item1a = { id: 1 };\n let item1b = { id: 2 };\n let item1c = { id: 3 };\n let content1 = (0, _array.A)([item1a, item1b, item1c]);\n\n let proxy = _array_proxy.default.create({ content: content1 });\n let obj = { proxy };\n\n (0, _metal.defineProperty)(obj, 'ids', (0, _metal.computed)('proxy.@each.id', function () {\n return (0, _metal.get)(this, 'proxy').mapBy('id');\n }));\n\n // These manually added observers are to simulate the observers added by the\n // rendering process in a template like:\n //\n // {{#each items as |item|}}\n // {{item.id}}\n // {{/each}}\n (0, _metal.addObserver)(item1a, 'id', function () {});\n (0, _metal.addObserver)(item1b, 'id', function () {});\n (0, _metal.addObserver)(item1c, 'id', function () {});\n\n // The EachProxy has not yet been consumed. Only the manually added\n // observers are watching.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 1);\n\n // Consume the each proxy. This causes the EachProxy to add two observers\n // per item: one for \"before\" events and one for \"after\" events.\n assert.deepEqual((0, _metal.get)(obj, 'ids'), [1, 2, 3]);\n\n // For each item, the two each proxy observers and one manual added observer\n // are watching.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // This should be a no-op because observers do not fire if the value\n // 1. is an object and 2. is the same as the old value.\n proxy.set('content', content1);\n\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // This is repeated to catch the regression. It should still be a no-op.\n proxy.set('content', content1);\n\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // Set the content to a new array with completely different items and\n // repeat the process.\n let item2a = { id: 4 };\n let item2b = { id: 5 };\n let item2c = { id: 6 };\n let content2 = (0, _array.A)([item2a, item2b, item2c]);\n\n (0, _metal.addObserver)(item2a, 'id', function () {});\n (0, _metal.addObserver)(item2b, 'id', function () {});\n (0, _metal.addObserver)(item2c, 'id', function () {});\n\n proxy.set('content', content2);\n\n assert.deepEqual((0, _metal.get)(obj, 'ids'), [4, 5, 6]);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n\n // Ensure that the observers added by the EachProxy on all items in the\n // first content array have been torn down.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 1);\n\n proxy.set('content', content2);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n\n proxy.set('content', content2);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/core_object_test', ['@ember/-internals/owner', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/core_object', 'internal-test-helpers'], function (_owner, _metal, _core_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.CoreObject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test throws deprecation with new (one arg)']() {\n expectDeprecation(() => {\n new _core_object.default({\n firstName: 'Stef',\n lastName: 'Penner'\n });\n }, /using `new` with EmberObject has been deprecated/);\n }\n\n ['@test throws deprecation with new (> 1 arg)']() {\n expectDeprecation(() => {\n new _core_object.default({\n firstName: 'Stef',\n lastName: 'Penner'\n }, {\n other: 'name'\n });\n }, /using `new` with EmberObject has been deprecated/);\n }\n\n ['@test toString should be not be added as a property when calling toString()'](assert) {\n let obj = _core_object.default.create({\n firstName: 'Foo',\n lastName: 'Bar'\n });\n\n obj.toString();\n\n assert.notOk(obj.hasOwnProperty('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 let someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n let obj = _core_object.default.create({\n someProxyishThing\n });\n\n let 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 let owner = (0, _internalTestHelpers.buildOwner)();\n\n let someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n // emulates ember-engines's process of registering services provided\n // by the host app down to the engine\n owner.register('thing:one', someProxyishThing, { 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 let proxy = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n assert.equal((0, _metal.get)(proxy, 'lolol'), true, 'should be able to get data from a proxy');\n\n // should not trigger an assertion\n (0, _owner.getOwner)(proxy);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n let owner = {};\n let options = {};\n (0, _owner.setOwner)(options, owner);\n\n _core_object.default.extend({\n init() {\n this._super(...arguments);\n let localOwner = (0, _owner.getOwner)(this);\n\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n unknownProperty() {\n return undefined;\n }\n }).create(options);\n }\n });\n});","enifed('@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 const originalLookup = _environment.context.lookup;\n let lookup;\n\n (0, _internalTestHelpers.moduleFor)('Namespace', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n\n lookup = _environment.context.lookup = {};\n }\n\n afterEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n\n for (let 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 let namespace = _namespace.default.create();\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 let nsA = lookup.NamespaceA = _namespace.default.create();\n assert.equal(nsA.toString(), 'NamespaceA', 'namespaces should have a name if they are on lookup');\n\n let nsB = lookup.NamespaceB = _namespace.default.create();\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 let nsA = lookup.NamespaceA = _namespace.default.create();\n nsA.Foo = _object.default.extend();\n assert.equal(nsA.Foo.toString(), 'NamespaceA.Foo', 'Classes pick up their parent namespace');\n\n nsA.Bar = _object.default.extend();\n assert.equal(nsA.Bar.toString(), 'NamespaceA.Bar', 'New Classes get the naming treatment too');\n\n let nsB = lookup.NamespaceB = _namespace.default.create();\n nsB.Foo = _object.default.extend();\n assert.equal(nsB.Foo.toString(), 'NamespaceB.Foo', 'Classes in new namespaces get the naming treatment');\n }\n\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 ['@test Lowercase namespaces are no longer supported'](assert) {\n let nsC = lookup.namespaceC = _namespace.default.create();\n assert.equal(nsC.toString(), (0, _utils.guidFor)(nsC));\n }\n\n ['@test A namespace can be assigned a custom name'](assert) {\n let nsA = _namespace.default.create({\n name: 'NamespaceA'\n });\n\n try {\n let 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 assert.equal(nsA.Foo.toString(), 'NamespaceA.Foo', \"The namespace's name is used when the namespace is not in the lookup object\");\n assert.equal(nsB.Foo.toString(), '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 let 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(namespace.ClassA.toString(), 'NS.ClassA');\n assert.equal(namespace.ClassB.toString(), 'NS.ClassB');\n }\n\n ['@test A namespace can be looked up by its name'](assert) {\n let NS = lookup.NS = _namespace.default.create();\n let UI = lookup.UI = _namespace.default.create();\n let 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 let UI = lookup.UI = _namespace.default.create();\n UI.Nav = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('UI.Nav'), UI.Nav);\n\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 let 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 let CF = lookup.CF = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('CF'), CF, 'precondition - namespace can be looked up by name');\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});","enifed('@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 expectDeprecation(() => {\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});","enifed('@ember/-internals/runtime/tests/system/native_array/copyable_suite_test', ['@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('NativeArray Copyable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test deep copy is respected'](assert) {\n let array = (0, _array.A)([{ id: 1 }, { id: 2 }, { id: 3 }]);\n let copiedArray;\n\n expectDeprecation(() => {\n copiedArray = array.copy(true);\n }, `Using \\`NativeArray#copy\\` is deprecated`);\n\n assert.deepEqual(copiedArray, array, 'copied array is equivalent');\n assert.ok(copiedArray[0] !== array[0], 'objects inside should be unique');\n }\n });\n});","enifed('@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});","enifed('@ember/-internals/runtime/tests/system/object/computed_test', ['@ember/-internals/metal', '@ember/object/computed', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _computed, _object, _internalTestHelpers) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n function testWithDefault(assert, expect, x, y, z) {\n assert.equal((0, _metal.get)(x, y), expect);\n assert.equal((0, _metal.getWithDefault)(x, y, z), expect);\n assert.equal(x.getWithDefault(y, z), expect);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberObject computed property', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property on instance'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n testWithDefault(assert, 'FOO', MyClass.create(), 'foo');\n }\n\n ['@test computed property on subclass'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let Subclass = MyClass.extend({\n foo: (0, _metal.computed)(function () {\n return 'BAR';\n })\n });\n\n testWithDefault(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test replacing computed property with regular val'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let Subclass = MyClass.extend({\n foo: 'BAR'\n });\n\n testWithDefault(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test complex depndent keys'](assert) {\n let MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar', { baz: 'BIFF' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(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 }).property('bar.baz')\n });\n\n let Subclass = MyClass.extend({\n count: 20\n });\n\n let obj1 = MyClass.create();\n let obj2 = Subclass.create();\n\n testWithDefault(assert, 'BIFF 1', obj1, 'foo');\n testWithDefault(assert, 'BIFF 21', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BLARG');\n\n testWithDefault(assert, 'BLARG 2', obj1, 'foo');\n testWithDefault(assert, 'BIFF 21', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BOOM');\n\n testWithDefault(assert, 'BLARG 2', obj1, 'foo');\n testWithDefault(assert, 'BOOM 22', obj2, 'foo');\n }\n\n ['@test complex dependent keys changing complex dependent keys'](assert) {\n let MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar', { baz: 'BIFF' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(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 }).property('bar.baz')\n });\n\n let Subclass = MyClass.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar2', { baz: 'BIFF2' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(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 }).property('bar2.baz')\n });\n\n let obj2 = Subclass.create();\n\n testWithDefault(assert, 'BIFF2 1', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BLARG');\n testWithDefault(assert, 'BIFF2 1', obj2, 'foo'); // should not invalidate property\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BLARG');\n testWithDefault(assert, 'BLARG 2', obj2, 'foo'); // should not invalidate property\n }\n\n ['@test can retrieve metadata for a computed property'](assert) {\n let MyClass = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}).meta({ key: 'keyValue' })\n });\n\n assert.equal((0, _metal.get)(MyClass.metaForProperty('computedProperty'), 'key'), 'keyValue', 'metadata saved on the computed property can be retrieved');\n\n let ClassWithNoMetadata = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}).volatile(),\n\n staticProperty: 12\n });\n\n assert.equal(typeof ClassWithNoMetadata.metaForProperty('computedProperty'), 'object', 'returns empty hash if no metadata has been saved');\n\n expectAssertion(function () {\n ClassWithNoMetadata.metaForProperty('nonexistentProperty');\n }, \"metaForProperty() could not find a computed property with key 'nonexistentProperty'.\");\n\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 let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(function () {})\n });\n\n let SubClass = MyClass.extend({\n foo: null\n });\n\n let list = [];\n\n SubClass.eachComputedProperty(name => list.push(name));\n\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 let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(function () {}),\n\n qux: (0, _metal.alias)('foo')\n });\n\n let SubClass = MyClass.extend({\n baz: (0, _metal.computed)(function () {})\n });\n\n SubClass.reopen({\n bat: (0, _metal.computed)(function () {}).meta({ iAmBat: true })\n });\n\n let list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo', 'qux'], 'watched and unwatched computed properties are iterated');\n\n list = [];\n\n SubClass.eachComputedProperty(function (name, meta) {\n list.push(name);\n\n if (name === 'bat') {\n assert.deepEqual(meta, { iAmBat: true });\n } else {\n assert.deepEqual(meta, {});\n }\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 let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(K),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(K)\n });\n\n let list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo'].sort(), 'expected two computed properties');\n\n MyClass.reopen({\n baz: (0, _metal.computed)(K)\n });\n\n MyClass.create(); // force apply mixins\n\n list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo', 'baz'].sort(), 'expected three computed properties');\n\n (0, _metal.defineProperty)(MyClass.prototype, 'qux', (0, _metal.computed)(K));\n\n list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\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 let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\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 let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\n });\n\n assert.ok((0, _metal.get)(SubClass.create(), 'foo'), 'FOO', 'super value is fetched');\n }\n\n ['@test observing computed.reads prop and overriding it in create() works'](assert) {\n let Obj = _object.default.extend({\n name: (0, _computed.oneWay)('model.name'),\n nameDidChange: (0, _metal.observer)('name', function () {})\n });\n\n let obj1 = Obj.create({ name: '1' });\n let obj2 = Obj.create({ name: '2' });\n\n assert.equal(obj1.get('name'), '1');\n assert.equal(obj2.get('name'), '2');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/create_test', ['@ember/-internals/owner', '@ember/-internals/metal', '@glimmer/env', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_owner, _metal, _env, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EmberObject.create', class extends _internalTestHelpers.AbstractTestCase {\n ['@test simple properties are set'](assert) {\n let o = _object.default.create({ ohai: 'there' });\n assert.equal(o.get('ohai'), 'there');\n }\n\n ['@test calls computed property setters'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)({\n get() {\n return \"this is not the value you're looking for\";\n },\n set(key, value) {\n return value;\n }\n })\n });\n\n let o = MyClass.create({ foo: 'bar' });\n assert.equal(o.get('foo'), 'bar');\n }\n\n ['@test sets up mandatory setters for watched simple properties'](assert) {\n if (_env.DEBUG) {\n let MyClass = _object.default.extend({\n foo: null,\n bar: null,\n fooDidChange: (0, _metal.observer)('foo', function () {})\n });\n\n let o = MyClass.create({ foo: 'bar', bar: 'baz' });\n assert.equal(o.get('foo'), 'bar');\n\n let descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(descriptor.set, 'Mandatory setter was setup');\n\n descriptor = Object.getOwnPropertyDescriptor(o, 'bar');\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test calls setUnknownProperty if defined'](assert) {\n let setUnknownPropertyCalled = false;\n\n let MyClass = _object.default.extend({\n setUnknownProperty() /* key, value */{\n setUnknownPropertyCalled = true;\n }\n });\n\n MyClass.create({ foo: 'bar' });\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 }, 'EmberObject.create no longer supports defining methods that call _super.');\n }\n\n [\"@test throws if you try to 'mixin' a definition\"]() {\n let myMixin = _metal.Mixin.create({\n adder(arg1, arg2) {\n return arg1 + arg2;\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 let baseObj = _object.default.create({ foo: 'bar' });\n let 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 let expected = 'EmberObject.create only accepts objects.';\n\n expectAssertion(() => _object.default.create('some-string'), expected);\n }\n\n ['@test EmberObject.create can take undefined as a parameter'](assert) {\n let o = _object.default.create(undefined);\n assert.deepEqual(_object.default.create(), o);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n let owner = {};\n let options = {};\n (0, _owner.setOwner)(options, owner);\n\n _object.default.extend({\n init() {\n this._super(...arguments);\n let localOwner = (0, _owner.getOwner)(this);\n\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n unknownProperty() {\n return undefined;\n }\n }).create(options);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/destroy_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/meta', '@ember/-internals/runtime/lib/system/object', '@glimmer/env', 'internal-test-helpers'], function (_runloop, _metal, _meta, _object, _env, _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 let obj = _object.default.create();\n let meta;\n\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\n meta = (0, _meta.peekMeta)(obj);\n assert.ok((0, _metal.get)(obj, 'isDestroyed'), 'object is destroyed after run loop finishes');\n }\n\n // MANDATORY_SETTER moves value to meta.values\n // a destroyed object removes meta but leaves the accessor\n // that looks it up\n ['@test should raise an exception when modifying watched properties on a destroyed object'](assert) {\n if (_env.DEBUG) {\n let 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\n assert.throws(() => (0, _metal.set)(obj, 'foo', 'baz'), Error, 'raises an exception');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observers should not fire after an object has been destroyed'](assert) {\n let count = 0;\n let obj = _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n count++;\n })\n }).create();\n\n obj.set('foo', 'bar');\n\n assert.equal(count, 1, 'observer was fired once');\n\n (0, _runloop.run)(() => {\n (0, _metal.beginPropertyChanges)();\n obj.set('foo', 'quux');\n obj.destroy();\n (0, _metal.endPropertyChanges)();\n });\n\n assert.equal(count, 1, 'observer was not called after object was destroyed');\n }\n\n ['@test destroyed objects should not see each others changes during teardown but a long lived object should'](assert) {\n let shouldChange = 0;\n let shouldNotChange = 0;\n\n let objs = {};\n\n let A = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\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 let B = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\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 let C = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\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 let 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\n objs.b = B.create();\n\n objs.c = C.create();\n\n LongLivedObject.create();\n\n (0, _runloop.run)(() => {\n let keys = Object.keys(objs);\n for (let i = 0; i < keys.length; i++) {\n objs[keys[i]].destroy();\n }\n });\n\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 }\n });\n});","enifed('@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 let A = _object.default.extend();\n let B = A.extend();\n let C = A.extend();\n\n let o = _object.default.create();\n let a = A.create();\n let b = B.create();\n let c = C.create();\n\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\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\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\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});","enifed('@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 let A = _object.default.extend();\n let B = A.extend();\n let C = A.extend();\n\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\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\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\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});","enifed('@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 let 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 let myObject = MyObject.create({ 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 let calls = [];\n\n let Foo = _object.default.extend({\n method() {\n calls.push('foo');\n }\n });\n\n let Bar = Foo.extend({\n method() {\n this._super();\n calls.push('bar');\n }\n });\n\n class Baz extends Bar {\n method() {\n super.method();\n calls.push('baz');\n }\n }\n\n let Qux = Baz.extend({\n method() {\n this._super();\n calls.push('qux');\n }\n });\n\n let Quux = Qux.extend({\n method() {\n this._super();\n calls.push('quux');\n }\n });\n\n class Corge extends Quux {\n method() {\n super.method();\n calls.push('corge');\n }\n }\n\n let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.create().method();\n\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 let calls;\n\n let Foo = _object.default.extend();\n Foo.reopenClass({\n method() {\n calls.push('foo');\n }\n });\n\n let Bar = Foo.extend();\n Bar.reopenClass({\n method() {\n this._super();\n calls.push('bar');\n }\n });\n\n class Baz extends Bar {\n static method() {\n super.method();\n calls.push('baz');\n }\n }\n\n let Qux = Baz.extend();\n Qux.reopenClass({\n method() {\n this._super();\n calls.push('qux');\n }\n });\n\n let Quux = Qux.extend();\n Quux.reopenClass({\n method() {\n this._super();\n calls.push('quux');\n }\n });\n\n class Corge extends Quux {\n static method() {\n super.method();\n calls.push('corge');\n }\n }\n\n let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.method();\n\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 let Mixin1 = _metal.Mixin.create({\n property1: 'data-1'\n });\n\n let Mixin2 = _metal.Mixin.create({\n property2: 'data-2'\n });\n\n class MyObject extends _object.default.extend(Mixin1, Mixin2) {}\n\n let 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 let myObject = MyObject.create();\n\n assert.ok(myObject instanceof MyObject);\n assert.ok(myObject instanceof _object.default);\n }\n\n ['@test using Ember.Object#detect'](assert) {\n let Parent = _object.default.extend();\n class Child extends Parent {}\n let Grandchild = Child.extend();\n\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 let 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 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 let 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 let MyObject = SubEmberObject.extend({});\n\n MyObject.create();\n assert.deepEqual(calls, ['before constructor', 'after constructor', 'init'], 'constructor then init called (create)');\n\n let obj = MyObject.create({\n foo: 456,\n bar: 789\n });\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\n // able to get meta without throwing an error\n SubEmberObject.metaForProperty('foo');\n }\n\n '@test observes / removeObserver on / removeListener interop'(assert) {\n let fooDidChangeBase = 0;\n let fooDidChangeA = 0;\n let fooDidChangeB = 0;\n let someEventBase = 0;\n let someEventA = 0;\n let someEventB = 0;\n class A extends _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n fooDidChangeBase++;\n }),\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 class B extends A {\n fooDidChange() {\n super.fooDidChange();\n fooDidChangeB++;\n }\n\n onSomeEvent() {\n super.onSomeEvent();\n someEventB++;\n }\n }\n\n (0, _metal.removeObserver)(B.prototype, 'foo', null, 'fooDidChange');\n (0, _metal.removeListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n\n assert.equal(fooDidChangeBase, 0);\n assert.equal(fooDidChangeA, 0);\n assert.equal(fooDidChangeB, 0);\n\n assert.equal(someEventBase, 0);\n assert.equal(someEventA, 0);\n assert.equal(someEventB, 0);\n\n let a = A.create();\n a.set('foo', 'something');\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n\n (0, _metal.sendEvent)(a, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n\n let b = B.create();\n b.set('foo', 'something');\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n\n (0, _metal.sendEvent)(b, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n }\n\n '@test super and _super interop between old and new methods'(assert) {\n let calls = [];\n let changes = [];\n let events = [];\n let lastProps;\n\n class A extends _object.default {\n init(props) {\n calls.push('A init');\n lastProps = props;\n }\n }\n\n let Mixin1 = _metal.Mixin.create({\n init() {\n calls.push('Mixin1 init before _super');\n this._super(...arguments);\n calls.push('Mixin1 init after _super');\n }\n });\n\n let Mixin2 = _metal.Mixin.create({\n init() {\n calls.push('Mixin2 init before _super');\n this._super(...arguments);\n calls.push('Mixin2 init after _super');\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\n // // define a CP\n (0, _metal.defineProperty)(B.prototype, 'full', (0, _metal.computed)('first', 'last', {\n get() {\n return this.first + ' ' + this.last;\n }\n }));\n\n // Only string observers are allowed for prototypes\n (0, _metal.addObserver)(B.prototype, 'full', null, 'fullNameDidChange');\n\n // Only string listeners are allowed for prototypes\n (0, _metal.addListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n\n B.reopen({\n init() {\n calls.push('reopen init before _super');\n this._super(...arguments);\n calls.push('reopen init after _super');\n }\n });\n\n let C = B.extend({\n init() {\n calls.push('C init before _super');\n this._super(...arguments);\n calls.push('C init after _super');\n },\n\n onSomeEvent(evt) {\n calls.push('C onSomeEvent before _super');\n this._super(evt);\n calls.push('C onSomeEvent after _super');\n },\n\n fullNameDidChange() {\n calls.push('C fullNameDidChange before _super');\n this._super();\n calls.push('C fullNameDidChange after _super');\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 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\n let d = D.create({ first: 'Robert', 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\n assert.deepEqual(lastProps, {\n first: 'Robert',\n last: 'Jackson'\n });\n\n assert.equal(d.full, 'Robert Jackson');\n\n d.setProperties({ first: 'Kris', last: 'Selden' });\n assert.deepEqual(changes, ['D fullNameDidChange before super.fullNameDidChange', 'B fullNameDidChange', 'D fullNameDidChange after super.fullNameDidChange']);\n\n assert.equal(d.full, 'Kris Selden');\n\n d.triggerSomeEvent('event arg');\n assert.deepEqual(events, ['D onSomeEvent before super.onSomeEvent', 'B onSomeEvent event arg', 'D onSomeEvent after super.onSomeEvent']);\n }\n });\n});","enifed('@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 let count = 0;\n let F = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', F);\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\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 let count = 0;\n let F = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', F);\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was not triggered again');\n }\n\n ['@test triggering an event can have arguments'](assert) {\n let self, args;\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', function () {\n args = [].slice.call(arguments);\n self = this;\n });\n\n obj.trigger('event!', 'foo', 'bar');\n\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 let self, args;\n let count = 0;\n\n let 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\n obj.trigger('event!', 'foo', 'bar');\n\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, obj);\n assert.equal(count, 1, 'the event is triggered once');\n\n obj.trigger('event!', 'baz', 'bat');\n\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 let self, args;\n\n let obj = _object.default.extend(_evented.default).create();\n let target = {};\n\n obj.on('event!', target, function () {\n args = [].slice.call(arguments);\n self = this;\n });\n\n obj.trigger('event!', 'foo', 'bar');\n\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 let count = 0;\n let target = {};\n target.fn = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', target, 'fn');\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\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 let obj = _object.default.extend(_evented.default, {\n F() {}\n }).create();\n let F = function () {};\n\n obj.one('event!', F);\n obj.one('event!', obj, 'F');\n\n assert.equal(obj.has('event!'), true, 'has events');\n\n obj.off('event!', F);\n obj.off('event!', obj, 'F');\n\n assert.equal(obj.has('event!'), false, 'has no more events');\n }\n\n ['@test adding and removing listeners should be chainable'](assert) {\n let obj = _object.default.extend(_evented.default).create();\n let F = function () {};\n\n let ret = obj.on('event!', F);\n assert.equal(ret, obj, '#on returns self');\n\n ret = obj.off('event!', F);\n assert.equal(ret, obj, '#off returns self');\n\n ret = obj.one('event!', F);\n assert.equal(ret, obj, '#one returns self');\n }\n });\n});","enifed('@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 let SomeClass = _object.default.extend({ foo: 'BAR' });\n assert.ok(SomeClass.isClass, 'A class has isClass of true');\n let obj = SomeClass.create();\n assert.equal(obj.foo, 'BAR');\n }\n\n ['@test Sub-subclass'](assert) {\n let SomeClass = _object.default.extend({ foo: 'BAR' });\n let AnotherClass = SomeClass.extend({ bar: 'FOO' });\n let 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 let SomeClass = _object.default.extend({\n fooCnt: 0,\n foo() {\n this.fooCnt++;\n },\n\n barCnt: 0,\n bar() {\n this.barCnt++;\n }\n });\n\n let AnotherClass = SomeClass.extend({\n barCnt: 0,\n bar() {\n this.barCnt++;\n this._super(...arguments);\n }\n });\n\n let FinalClass = AnotherClass.extend({\n fooCnt: 0,\n foo() {\n this.fooCnt++;\n this._super(...arguments);\n }\n });\n\n let 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');\n\n // Try overriding on create also\n obj = FinalClass.extend({\n foo() {\n this.fooCnt++;\n this._super(...arguments);\n }\n }).create();\n\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 let SomeClass = _object.default.extend({\n things: 'foo',\n concatenatedProperties: ['things']\n });\n let AnotherClass = SomeClass.extend({ things: 'bar' });\n let YetAnotherClass = SomeClass.extend({ things: 'baz' });\n let some = SomeClass.create();\n let another = AnotherClass.create();\n let 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 let SomeClass = _object.default.extend();\n SomeClass.reopenClass({\n concatenatedProperties: ['things'],\n things: 'foo'\n });\n let AnotherClass = SomeClass.extend();\n AnotherClass.reopenClass({ things: 'bar' });\n let YetAnotherClass = SomeClass.extend();\n YetAnotherClass.reopenClass({ things: 'baz' });\n let some = SomeClass.create();\n let another = AnotherClass.create();\n let 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 ['@test Overriding a computed property with an observer'](assert) {\n let Parent = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let seen = [];\n\n let Child = Parent.extend({\n foo: (0, _metal.observer)('bar', function () {\n seen.push(this.get('bar'));\n })\n });\n\n let child = Child.create({ bar: 0 });\n\n assert.deepEqual(seen, []);\n\n child.set('bar', 1);\n\n assert.deepEqual(seen, [1]);\n\n child.set('bar', 2);\n\n assert.deepEqual(seen, [1, 2]);\n }\n });\n});","enifed('@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 ['@test observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = MyClass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on subclass'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let 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\n let obj = Subclass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on instance'](assert) {\n let 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\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on instance overriding class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let 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\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer should not fire after being destroyed'](assert) {\n let 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\n (0, _runloop.run)(() => obj.destroy());\n\n expectAssertion(function () {\n (0, _metal.set)(obj, 'bar', 'BAZ');\n }, `calling set on destroyed object: ${obj}.bar = BAZ`);\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n }\n\n // ..........................................................\n // COMPLEX PROPERTIES\n //\n\n ['@test chain observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj1 = MyClass.create({\n bar: { baz: 'biff' }\n });\n\n let obj2 = MyClass.create({\n bar: { 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\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\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\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\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 }\n\n ['@test chain observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj1 = MyClass.extend().create({\n bar: { baz: 'biff' }\n });\n\n let 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: { baz: 'biff2' },\n bar2: { 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\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\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\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\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\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BIFF3');\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 }\n\n ['@test chain observer on class that has a reference to an uninitialized object will finish chains that reference it'](assert) {\n let changed = false;\n\n let ChildClass = _object.default.extend({\n parent: null,\n parentOneTwoDidChange: (0, _metal.observer)('parent.one.two', function () {\n changed = true;\n })\n });\n\n let ParentClass = _object.default.extend({\n one: {\n two: 'old'\n },\n init() {\n this.child = ChildClass.create({\n parent: this\n });\n }\n });\n\n let parent = ParentClass.create();\n\n assert.equal(changed, false, 'precond');\n\n (0, _metal.set)(parent, 'one.two', 'new');\n\n assert.equal(changed, true, 'child should have been notified of change to path');\n\n (0, _metal.set)(parent, 'one', { two: 'newer' });\n\n assert.equal(changed, true, 'child should have been notified of change to path');\n }\n });\n});","enifed('@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 let Subclass = _object.default.extend();\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\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 let Subclass = _object.default.extend();\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\n\n let SubSub = Subclass.extend();\n\n assert.equal(SubSub.foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(SubSub, 'bar'), 'BAR', 'Adds property');\n }\n });\n});","enifed('@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 let Subclass = _object.default.extend();\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\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 let Subclass = _object.default.extend();\n let SubSub = Subclass.extend();\n\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\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 let Subclass = _object.default.extend();\n\n Subclass.create();\n\n Subclass.reopen({\n trololol: true\n });\n\n assert.equal(Subclass.create().get('trololol'), true, 'reopen works');\n }\n });\n});","enifed('@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 let Foo = _object.default.extend({\n blah() {\n return 'foo';\n }\n });\n\n let Bar = Foo.extend({\n blah() {\n return 'bar';\n },\n\n callBlah() {\n let blah = this.blah;\n\n return blah();\n }\n });\n\n let bar = Bar.create();\n\n assert.equal(bar.callBlah(), 'bar', 'can call local function without call/apply');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/toString_test', ['@ember/runloop', '@ember/-internals/utils', '@ember/-internals/environment', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/system/namespace', 'internal-test-helpers'], function (_runloop, _utils, _environment, _object, _namespace, _internalTestHelpers) {\n 'use strict';\n\n let originalLookup = _environment.context.lookup;\n let lookup;\n\n (0, _internalTestHelpers.moduleFor)('system/object/toString', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n _environment.context.lookup = lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test toString() returns the same value if called twice'](assert) {\n let Foo = _namespace.default.create();\n Foo.toString = function () {\n return 'Foo';\n };\n\n Foo.Bar = _object.default.extend();\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n let obj = Foo.Bar.create();\n\n assert.equal(obj.toString(), '');\n assert.equal(obj.toString(), '');\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a class returns a useful value when nested in a namespace'](assert) {\n let obj;\n\n let Foo = _namespace.default.create();\n Foo.toString = function () {\n return 'Foo';\n };\n\n Foo.Bar = _object.default.extend();\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n Foo.Baz = Foo.Bar.extend();\n assert.equal(Foo.Baz.toString(), 'Foo.Baz');\n\n obj = Foo.Baz.create();\n assert.equal(obj.toString(), '');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace finds the namespace in lookup'](assert) {\n let Foo = lookup.Foo = _namespace.default.create();\n\n assert.equal(Foo.toString(), 'Foo');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace finds the namespace in lookup'](assert) {\n let Foo = lookup.Foo = _namespace.default.create();\n let obj;\n\n Foo.Bar = _object.default.extend();\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace falls back to modulePrefix, if defined'](assert) {\n let Foo = _namespace.default.create({ modulePrefix: 'foo' });\n\n assert.equal(Foo.toString(), 'foo');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString includes toStringExtension if defined'](assert) {\n let Foo = _object.default.extend({\n toStringExtension() {\n return 'fooey';\n }\n });\n let foo = Foo.create();\n let Bar = _object.default.extend({});\n let bar = Bar.create();\n\n // simulate these classes being defined on a Namespace\n (0, _utils.setName)(Foo, 'Foo');\n (0, _utils.setName)(Bar, 'Bar');\n\n assert.equal(bar.toString(), '', 'does not include toStringExtension part');\n assert.equal(foo.toString(), '', 'Includes toStringExtension result');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object_proxy_test', ['@glimmer/env', '@ember/-internals/metal', '@ember/-internals/utils', '@ember/-internals/runtime/lib/system/object_proxy', 'internal-test-helpers'], function (_env, _metal, _utils, _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 let Proxy = _object_proxy.default.extend({\n cp: (0, _metal.computed)({\n get() {\n return this._cp;\n },\n set(key, value) {\n this._cp = value;\n return this._cp;\n }\n })\n });\n let proxy = Proxy.create({\n prop: 'Foo',\n cp: 'Bar'\n });\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 let content = {\n firstName: 'Tom',\n lastName: 'Dale',\n unknownProperty(key) {\n return key + ' unknown';\n }\n };\n let 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\n (0, _metal.set)(proxy, 'content', content);\n\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\n (0, _metal.set)(proxy, 'lastName', 'Huda');\n\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\n (0, _metal.set)(proxy, 'content', { firstName: 'Yehuda', 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 let 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 let proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: { foo: 'FOO' } }));\n }\n\n ['@test calling a function on the proxy avoids the assertion'](assert) {\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY) {\n let proxy = _object_proxy.default.extend({\n init() {\n if (!this.foobar) {\n this.foobar = function () {\n let content = (0, _metal.get)(this, 'content');\n return content.foobar.apply(content, []);\n };\n }\n }\n }).create({\n content: {\n foobar() {\n return 'xoxo';\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 let proxy = _object_proxy.default.create({\n toJSON: undefined,\n content: {\n toJSON() {\n return 'hello';\n }\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));\n }\n\n [`@test setting a property on the proxy's prototype avoids the assertion`](assert) {\n let proxy = _object_proxy.default.extend({\n toJSON: null\n }).create({\n content: {\n toJSON() {\n return 'hello';\n }\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));\n }\n\n ['@test getting proxied properties with [] should be an error'](assert) {\n if (_env.DEBUG && _utils.HAS_NATIVE_PROXY) {\n let 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 ['@test should work with watched properties'](assert) {\n let content1 = { firstName: 'Tom', lastName: 'Dale' };\n let content2 = { firstName: 'Yehuda', lastName: 'Katz' };\n let count = 0;\n let last;\n\n let Proxy = _object_proxy.default.extend({\n fullName: (0, _metal.computed)(function () {\n let firstName = this.get('firstName');\n let lastName = this.get('lastName');\n\n if (firstName && lastName) {\n return firstName + ' ' + lastName;\n }\n return firstName || lastName;\n }).property('firstName', 'lastName')\n });\n\n let proxy = Proxy.create();\n\n (0, _metal.addObserver)(proxy, 'fullName', function () {\n last = (0, _metal.get)(proxy, 'fullName');\n count++;\n });\n\n // proxy without content returns undefined\n assert.equal((0, _metal.get)(proxy, 'fullName'), undefined);\n\n // setting content causes all watched properties to change\n (0, _metal.set)(proxy, 'content', content1);\n // both dependent keys changed\n assert.equal(count, 2);\n assert.equal(last, 'Tom Dale');\n\n // setting property in content causes proxy property to change\n (0, _metal.set)(content1, 'lastName', 'Huda');\n assert.equal(count, 3);\n assert.equal(last, 'Tom Huda');\n\n // replacing content causes all watched properties to change\n (0, _metal.set)(proxy, 'content', content2);\n // both dependent keys changed\n assert.equal(count, 5);\n assert.equal(last, 'Yehuda Katz');\n // content1 is no longer watched\n assert.ok(!(0, _metal.isWatching)(content1, 'firstName'), 'not watching firstName');\n assert.ok(!(0, _metal.isWatching)(content1, 'lastName'), 'not watching lastName');\n\n // setting property in new content\n (0, _metal.set)(content2, 'firstName', 'Tomhuda');\n assert.equal(last, 'Tomhuda Katz');\n assert.equal(count, 6);\n\n // setting property in proxy syncs with new content\n (0, _metal.set)(proxy, 'lastName', 'Katzdale');\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 }\n\n ['@test set and get should work with paths'](assert) {\n let content = { foo: { bar: 'baz' } };\n let proxy = _object_proxy.default.create({ content });\n let count = 0;\n\n proxy.set('foo.bar', 'hello');\n assert.equal(proxy.get('foo.bar'), 'hello');\n assert.equal(proxy.get('content.foo.bar'), 'hello');\n\n proxy.addObserver('foo.bar', function () {\n count++;\n });\n\n proxy.set('foo.bar', 'bye');\n\n assert.equal(count, 1);\n assert.equal(proxy.get('foo.bar'), 'bye');\n assert.equal(proxy.get('content.foo.bar'), 'bye');\n }\n\n ['@test should transition between watched and unwatched strategies'](assert) {\n let content = { foo: 'foo' };\n let proxy = _object_proxy.default.create({ content: content });\n let count = 0;\n\n function observer() {\n count++;\n }\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.addObserver)(proxy, 'foo', observer);\n\n assert.equal(count, 0);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.removeObserver)(proxy, 'foo', observer);\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\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 let proxyObject = _object_proxy.default.create({\n content: {\n prop: 'emberjs'\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});","enifed('@ember/-internals/utils/index', ['exports', '@ember/-internals/utils/lib/symbol', '@ember/-internals/utils/lib/dictionary', '@ember/-internals/utils/lib/guid', '@ember/-internals/utils/lib/intern', '@ember/-internals/utils/lib/super', '@ember/-internals/utils/lib/inspect', '@ember/-internals/utils/lib/lookup-descriptor', '@ember/-internals/utils/lib/invoke', '@ember/-internals/utils/lib/make-array', '@ember/-internals/utils/lib/name', '@ember/-internals/utils/lib/to-string', '@ember/-internals/utils/lib/symbol-utils', '@ember/-internals/utils/lib/proxy-utils', '@ember/-internals/utils/lib/is_proxy', '@ember/-internals/utils/lib/cache'], function (exports, _symbol, _dictionary, _guid, _intern, _super, _inspect, _lookupDescriptor, _invoke, _makeArray, _name, _toString, _symbolUtils, _proxyUtils, _is_proxy, _cache) {\n 'use strict';\n\n exports.__esModule = true;\n exports.NAME_KEY = exports.Cache = exports.setProxy = exports.isProxy = exports.HAS_NATIVE_PROXY = exports.HAS_NATIVE_SYMBOL = exports.toString = exports.setName = exports.getName = exports.makeArray = exports.tryInvoke = exports.canInvoke = exports.lookupDescriptor = exports.inspect = exports.setListeners = exports.setObservers = exports.getListeners = exports.getObservers = exports.wrap = exports.ROOT = exports.checkHasSuper = exports.intern = exports.guidFor = exports.generateGuid = exports.GUID_KEY = exports.uuid = exports.dictionary = exports.isInternalSymbol = exports.symbol = undefined;\n Object.defineProperty(exports, 'symbol', {\n enumerable: true,\n get: function () {\n return _symbol.default;\n }\n });\n Object.defineProperty(exports, 'isInternalSymbol', {\n enumerable: true,\n get: function () {\n return _symbol.isInternalSymbol;\n }\n });\n Object.defineProperty(exports, 'dictionary', {\n enumerable: true,\n get: function () {\n return _dictionary.default;\n }\n });\n Object.defineProperty(exports, 'uuid', {\n enumerable: true,\n get: function () {\n return _guid.uuid;\n }\n });\n Object.defineProperty(exports, 'GUID_KEY', {\n enumerable: true,\n get: function () {\n return _guid.GUID_KEY;\n }\n });\n Object.defineProperty(exports, 'generateGuid', {\n enumerable: true,\n get: function () {\n return _guid.generateGuid;\n }\n });\n Object.defineProperty(exports, 'guidFor', {\n enumerable: true,\n get: function () {\n return _guid.guidFor;\n }\n });\n Object.defineProperty(exports, 'intern', {\n enumerable: true,\n get: function () {\n return _intern.default;\n }\n });\n Object.defineProperty(exports, 'checkHasSuper', {\n enumerable: true,\n get: function () {\n return _super.checkHasSuper;\n }\n });\n Object.defineProperty(exports, 'ROOT', {\n enumerable: true,\n get: function () {\n return _super.ROOT;\n }\n });\n Object.defineProperty(exports, 'wrap', {\n enumerable: true,\n get: function () {\n return _super.wrap;\n }\n });\n Object.defineProperty(exports, 'getObservers', {\n enumerable: true,\n get: function () {\n return _super.getObservers;\n }\n });\n Object.defineProperty(exports, 'getListeners', {\n enumerable: true,\n get: function () {\n return _super.getListeners;\n }\n });\n Object.defineProperty(exports, 'setObservers', {\n enumerable: true,\n get: function () {\n return _super.setObservers;\n }\n });\n Object.defineProperty(exports, 'setListeners', {\n enumerable: true,\n get: function () {\n return _super.setListeners;\n }\n });\n Object.defineProperty(exports, 'inspect', {\n enumerable: true,\n get: function () {\n return _inspect.default;\n }\n });\n Object.defineProperty(exports, 'lookupDescriptor', {\n enumerable: true,\n get: function () {\n return _lookupDescriptor.default;\n }\n });\n Object.defineProperty(exports, 'canInvoke', {\n enumerable: true,\n get: function () {\n return _invoke.canInvoke;\n }\n });\n Object.defineProperty(exports, 'tryInvoke', {\n enumerable: true,\n get: function () {\n return _invoke.tryInvoke;\n }\n });\n Object.defineProperty(exports, 'makeArray', {\n enumerable: true,\n get: function () {\n return _makeArray.default;\n }\n });\n Object.defineProperty(exports, 'getName', {\n enumerable: true,\n get: function () {\n return _name.getName;\n }\n });\n Object.defineProperty(exports, 'setName', {\n enumerable: true,\n get: function () {\n return _name.setName;\n }\n });\n Object.defineProperty(exports, 'toString', {\n enumerable: true,\n get: function () {\n return _toString.default;\n }\n });\n Object.defineProperty(exports, 'HAS_NATIVE_SYMBOL', {\n enumerable: true,\n get: function () {\n return _symbolUtils.HAS_NATIVE_SYMBOL;\n }\n });\n Object.defineProperty(exports, 'HAS_NATIVE_PROXY', {\n enumerable: true,\n get: function () {\n return _proxyUtils.HAS_NATIVE_PROXY;\n }\n });\n Object.defineProperty(exports, 'isProxy', {\n enumerable: true,\n get: function () {\n return _is_proxy.isProxy;\n }\n });\n Object.defineProperty(exports, 'setProxy', {\n enumerable: true,\n get: function () {\n return _is_proxy.setProxy;\n }\n });\n Object.defineProperty(exports, 'Cache', {\n enumerable: true,\n get: function () {\n return _cache.default;\n }\n });\n const NAME_KEY = exports.NAME_KEY = (0, _symbol.default)('NAME_KEY');\n});","enifed(\"@ember/-internals/utils/lib/cache\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n class Cache {\n constructor(limit, func, store) {\n this.limit = limit;\n this.func = func;\n this.store = store;\n this.size = 0;\n this.misses = 0;\n this.hits = 0;\n this.store = store || new Map();\n }\n get(key) {\n let value = this.store.get(key);\n if (this.store.has(key)) {\n this.hits++;\n return this.store.get(key);\n } else {\n this.misses++;\n value = this.set(key, this.func(key));\n }\n return value;\n }\n set(key, value) {\n if (this.limit > this.size) {\n this.size++;\n this.store.set(key, value);\n }\n return value;\n }\n purge() {\n this.store.clear();\n this.size = 0;\n this.hits = 0;\n this.misses = 0;\n }\n }\n exports.default = Cache;\n});","enifed('@ember/-internals/utils/lib/dictionary', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = makeDictionary;\n // the delete is meant to hint at runtimes that this object should remain in\n // dictionary mode. This is clearly a runtime specific hack, but currently it\n // appears worthwhile in some usecases. Please note, these deletes do increase\n // the cost of creation dramatically over a plain Object.create. And as this\n // only makes sense for long-lived dictionaries that aren't instantiated often.\n function makeDictionary(parent) {\n let dict = Object.create(parent);\n dict['_dict'] = null;\n delete dict['_dict'];\n return dict;\n }\n});","enifed('@ember/-internals/utils/lib/guid', ['exports', '@ember/-internals/utils/lib/intern', '@ember/-internals/utils/lib/spec'], function (exports, _intern, _spec) {\n 'use strict';\n\n exports.__esModule = true;\n exports.GUID_KEY = undefined;\n exports.uuid = uuid;\n exports.generateGuid = generateGuid;\n exports.guidFor = guidFor;\n\n /**\n @module @ember/object\n */\n /**\n Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from\n jQuery master. We'll just bootstrap our own uuid now.\n \n @private\n @return {Number} the uuid\n */\n let _uuid = 0;\n /**\n Generates a universally unique identifier. This method\n is used internally by Ember for assisting with\n the generation of GUID's and other unique identifiers.\n \n @public\n @return {Number} [description]\n */\n function uuid() {\n return ++_uuid;\n }\n /**\n Prefix used for guids through out Ember.\n @private\n @property GUID_PREFIX\n @for Ember\n @type String\n @final\n */\n const GUID_PREFIX = 'ember';\n // Used for guid generation...\n const OBJECT_GUIDS = new WeakMap();\n const NON_OBJECT_GUIDS = new Map();\n /**\n A unique key used to assign guids and other private metadata to objects.\n If you inspect an object in your browser debugger you will often see these.\n They can be safely ignored.\n \n On browsers that support it, these properties are added with enumeration\n disabled so they won't show up when you iterate over your properties.\n \n @private\n @property GUID_KEY\n @for Ember\n @type String\n @final\n */\n const GUID_KEY = exports.GUID_KEY = (0, _intern.default)(`__ember${+new Date()}`);\n /**\n Generates a new guid, optionally saving the guid to the object that you\n pass in. You will rarely need to use this method. Instead you should\n call `guidFor(obj)`, which return an existing guid if available.\n \n @private\n @method generateGuid\n @static\n @for @ember/object/internals\n @param {Object} [obj] Object the guid will be used for. If passed in, the guid will\n be saved on the object and reused whenever you pass the same object\n again.\n \n If no object is passed, just generate a new guid.\n @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to\n separate the guid into separate namespaces.\n @return {String} the guid\n */\n function generateGuid(obj, prefix = GUID_PREFIX) {\n let guid = prefix + uuid();\n if ((0, _spec.isObject)(obj)) {\n OBJECT_GUIDS.set(obj, guid);\n }\n return guid;\n }\n /**\n Returns a unique id for the object. If the object does not yet have a guid,\n one will be assigned to it. You can call this on any object,\n `EmberObject`-based or not.\n \n You can also use this method on DOM Element objects.\n \n @public\n @static\n @method guidFor\n @for @ember/object/internals\n @param {Object} obj any object, string, number, Element, or primitive\n @return {String} the unique guid for this instance.\n */\n function guidFor(value) {\n let guid;\n if ((0, _spec.isObject)(value)) {\n guid = OBJECT_GUIDS.get(value);\n if (guid === undefined) {\n guid = GUID_PREFIX + uuid();\n OBJECT_GUIDS.set(value, guid);\n }\n } else {\n guid = NON_OBJECT_GUIDS.get(value);\n if (guid === undefined) {\n let type = typeof value;\n if (type === 'string') {\n guid = 'st' + uuid();\n } else if (type === 'number') {\n guid = 'nu' + uuid();\n } else if (type === 'symbol') {\n guid = 'sy' + uuid();\n } else {\n guid = '(' + value + ')';\n }\n NON_OBJECT_GUIDS.set(value, guid);\n }\n }\n return guid;\n }\n});","enifed('@ember/-internals/utils/lib/inspect', ['exports', '@ember/polyfills'], function (exports, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = inspect;\n\n const { toString: objectToString } = Object.prototype;\n const { toString: functionToString } = Function.prototype;\n const { isArray } = Array;\n const { keys: objectKeys } = Object;\n const { stringify } = JSON;\n const LIST_LIMIT = 100;\n const DEPTH_LIMIT = 4;\n const SAFE_KEY = /^[\\w$]+$/;\n /**\n @module @ember/debug\n */\n /**\n Convenience method to inspect an object. This method will attempt to\n convert the object into a useful string description.\n \n It is a pretty simple implementation. If you want something more robust,\n use something like JSDump: https://github.com/NV/jsDump\n \n @method inspect\n @static\n @param {Object} obj The object you want to inspect.\n @return {String} A description of the object\n @since 1.4.0\n @private\n */\n function inspect(obj) {\n // detect Node util.inspect call inspect(depth: number, opts: object)\n if (typeof obj === 'number' && arguments.length === 2) {\n return this;\n }\n return inspectValue(obj, 0);\n }\n function inspectValue(value, depth, seen) {\n let valueIsArray = false;\n switch (typeof value) {\n case 'undefined':\n return 'undefined';\n case 'object':\n if (value === null) return 'null';\n if (isArray(value)) {\n valueIsArray = true;\n break;\n }\n // is toString Object.prototype.toString or undefined then traverse\n if (value.toString === objectToString || value.toString === undefined) {\n break;\n }\n // custom toString\n return value.toString();\n case 'function':\n return value.toString === functionToString ? value.name ? `[Function:${value.name}]` : `[Function]` : value.toString();\n case 'string':\n return stringify(value);\n case 'symbol':\n case 'boolean':\n case 'number':\n default:\n return value.toString();\n }\n if (seen === undefined) {\n seen = new _polyfills._WeakSet();\n } else {\n if (seen.has(value)) return `[Circular]`;\n }\n seen.add(value);\n return valueIsArray ? inspectArray(value, depth + 1, seen) : inspectObject(value, depth + 1, seen);\n }\n function inspectKey(key) {\n return SAFE_KEY.test(key) ? key : stringify(key);\n }\n function inspectObject(obj, depth, seen) {\n if (depth > DEPTH_LIMIT) {\n return '[Object]';\n }\n let s = '{';\n let keys = objectKeys(obj);\n for (let i = 0; i < keys.length; i++) {\n s += i === 0 ? ' ' : ', ';\n if (i >= LIST_LIMIT) {\n s += `... ${keys.length - LIST_LIMIT} more keys`;\n break;\n }\n let key = keys[i];\n s += inspectKey(key) + ': ' + inspectValue(obj[key], depth, seen);\n }\n s += ' }';\n return s;\n }\n function inspectArray(arr, depth, seen) {\n if (depth > DEPTH_LIMIT) {\n return '[Array]';\n }\n let s = '[';\n for (let i = 0; i < arr.length; i++) {\n s += i === 0 ? ' ' : ', ';\n if (i >= LIST_LIMIT) {\n s += `... ${arr.length - LIST_LIMIT} more items`;\n break;\n }\n s += inspectValue(arr[i], depth, seen);\n }\n s += ' ]';\n return s;\n }\n});","enifed(\"@ember/-internals/utils/lib/intern\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = intern;\n /**\n Strongly hint runtimes to intern the provided string.\n \n When do I need to use this function?\n \n For the most part, never. Pre-mature optimization is bad, and often the\n runtime does exactly what you need it to, and more often the trade-off isn't\n worth it.\n \n Why?\n \n Runtimes store strings in at least 2 different representations:\n Ropes and Symbols (interned strings). The Rope provides a memory efficient\n data-structure for strings created from concatenation or some other string\n manipulation like splitting.\n \n Unfortunately checking equality of different ropes can be quite costly as\n runtimes must resort to clever string comparison algorithms. These\n algorithms typically cost in proportion to the length of the string.\n Luckily, this is where the Symbols (interned strings) shine. As Symbols are\n unique by their string content, equality checks can be done by pointer\n comparison.\n \n How do I know if my string is a rope or symbol?\n \n Typically (warning general sweeping statement, but truthy in runtimes at\n present) static strings created as part of the JS source are interned.\n Strings often used for comparisons can be interned at runtime if some\n criteria are met. One of these criteria can be the size of the entire rope.\n For example, in chrome 38 a rope longer then 12 characters will not\n intern, nor will segments of that rope.\n \n Some numbers: http://jsperf.com/eval-vs-keys/8\n \n Known Trick™\n \n @private\n @return {String} interned version of the provided string\n */\n function intern(str) {\n let obj = {};\n obj[str] = 1;\n for (let key in obj) {\n if (key === str) {\n return key;\n }\n }\n return str;\n }\n});","enifed('@ember/-internals/utils/lib/invoke', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.canInvoke = canInvoke;\n exports.tryInvoke = tryInvoke;\n /**\n Checks to see if the `methodName` exists on the `obj`.\n \n ```javascript\n let foo = { bar: function() { return 'bar'; }, baz: null };\n \n Ember.canInvoke(foo, 'bar'); // true\n Ember.canInvoke(foo, 'baz'); // false\n Ember.canInvoke(foo, 'bat'); // false\n ```\n \n @method canInvoke\n @for Ember\n @param {Object} obj The object to check for the method\n @param {String} methodName The method name to check for\n @return {Boolean}\n @private\n */\n function canInvoke(obj, methodName) {\n return obj !== null && obj !== undefined && typeof obj[methodName] === 'function';\n }\n /**\n @module @ember/utils\n */\n /**\n Checks to see if the `methodName` exists on the `obj`,\n and if it does, invokes it with the arguments passed.\n \n ```javascript\n import { tryInvoke } from '@ember/utils';\n \n let d = new Date('03/15/2013');\n \n tryInvoke(d, 'getTime'); // 1363320000000\n tryInvoke(d, 'setFullYear', [2014]); // 1394856000000\n tryInvoke(d, 'noSuchMethod', [2014]); // undefined\n ```\n \n @method tryInvoke\n @for @ember/utils\n @static\n @param {Object} obj The object to check for the method\n @param {String} methodName The method name to check for\n @param {Array} [args] The arguments to pass to the method\n @return {*} the return value of the invoked method or undefined if it cannot be invoked\n @public\n */\n function tryInvoke(obj, methodName, args) {\n if (canInvoke(obj, methodName)) {\n let method = obj[methodName];\n return method.apply(obj, args);\n }\n }\n});","enifed('@ember/-internals/utils/lib/is_proxy', ['exports', '@ember/polyfills', '@ember/-internals/utils/lib/spec'], function (exports, _polyfills, _spec) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isProxy = isProxy;\n exports.setProxy = setProxy;\n\n const PROXIES = new _polyfills._WeakSet();\n function isProxy(object) {\n if ((0, _spec.isObject)(object)) {\n return PROXIES.has(object);\n }\n return false;\n }\n function setProxy(object) {\n if ((0, _spec.isObject)(object)) {\n PROXIES.add(object);\n }\n }\n});","enifed(\"@ember/-internals/utils/lib/lookup-descriptor\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = lookupDescriptor;\n function lookupDescriptor(obj, keyName) {\n let current = obj;\n do {\n let descriptor = Object.getOwnPropertyDescriptor(current, keyName);\n if (descriptor !== undefined) {\n return descriptor;\n }\n current = Object.getPrototypeOf(current);\n } while (current !== null);\n return null;\n }\n});","enifed(\"@ember/-internals/utils/lib/make-array\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = makeArray;\n const { isArray } = Array;\n function makeArray(obj) {\n if (obj === null || obj === undefined) {\n return [];\n }\n return isArray(obj) ? obj : [obj];\n }\n});","enifed('@ember/-internals/utils/lib/name', ['exports', '@ember/-internals/utils/lib/spec'], function (exports, _spec) {\n 'use strict';\n\n exports.__esModule = true;\n exports.setName = setName;\n exports.getName = getName;\n\n const NAMES = new WeakMap();\n function setName(obj, name) {\n if ((0, _spec.isObject)(obj)) NAMES.set(obj, name);\n }\n function getName(obj) {\n return NAMES.get(obj);\n }\n});","enifed('@ember/-internals/utils/lib/proxy-utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n const HAS_NATIVE_PROXY = exports.HAS_NATIVE_PROXY = typeof Proxy === 'function';\n});","enifed('@ember/-internals/utils/lib/spec', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isObject = isObject;\n /**\n Returns whether Type(value) is Object.\n \n Useful for checking whether a value is a valid WeakMap key.\n \n Refs: https://tc39.github.io/ecma262/#sec-typeof-operator-runtime-semantics-evaluation\n https://tc39.github.io/ecma262/#sec-weakmap.prototype.set\n \n @private\n @function isObject\n */\n function isObject(value) {\n return value !== null && (typeof value === 'object' || typeof value === 'function');\n }\n});","enifed('@ember/-internals/utils/lib/super', ['exports', '@ember/polyfills'], function (exports, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ROOT = exports.checkHasSuper = undefined;\n exports.setObservers = setObservers;\n exports.getObservers = getObservers;\n exports.setListeners = setListeners;\n exports.getListeners = getListeners;\n exports.wrap = wrap;\n\n const HAS_SUPER_PATTERN = /\\.(_super|call\\(this|apply\\(this)/;\n const fnToString = Function.prototype.toString;\n const checkHasSuper = exports.checkHasSuper = (() => {\n let sourceAvailable = fnToString.call(function () {\n return this;\n }).indexOf('return this') > -1;\n if (sourceAvailable) {\n return function checkHasSuper(func) {\n return HAS_SUPER_PATTERN.test(fnToString.call(func));\n };\n }\n return function checkHasSuper() {\n return true;\n };\n })();\n const HAS_SUPER_MAP = new WeakMap();\n const ROOT = exports.ROOT = Object.freeze(function () {});\n HAS_SUPER_MAP.set(ROOT, false);\n function hasSuper(func) {\n let hasSuper = HAS_SUPER_MAP.get(func);\n if (hasSuper === undefined) {\n hasSuper = checkHasSuper(func);\n HAS_SUPER_MAP.set(func, hasSuper);\n }\n return hasSuper;\n }\n const OBSERVERS_MAP = new WeakMap();\n function setObservers(func, observers) {\n if (observers) {\n OBSERVERS_MAP.set(func, observers);\n }\n }\n function getObservers(func) {\n return OBSERVERS_MAP.get(func);\n }\n const LISTENERS_MAP = new WeakMap();\n function setListeners(func, listeners) {\n if (listeners) {\n LISTENERS_MAP.set(func, listeners);\n }\n }\n function getListeners(func) {\n return LISTENERS_MAP.get(func);\n }\n const IS_WRAPPED_FUNCTION_SET = new _polyfills._WeakSet();\n /**\n Wraps the passed function so that `this._super` will point to the superFunc\n when the function is invoked. This is the primitive we use to implement\n calls to super.\n \n @private\n @method wrap\n @for Ember\n @param {Function} func The function to call\n @param {Function} superFunc The super function.\n @return {Function} wrapped function.\n */\n function wrap(func, superFunc) {\n if (!hasSuper(func)) {\n return func;\n }\n // ensure an unwrapped super that calls _super is wrapped with a terminal _super\n if (!IS_WRAPPED_FUNCTION_SET.has(superFunc) && hasSuper(superFunc)) {\n return _wrap(func, _wrap(superFunc, ROOT));\n }\n return _wrap(func, superFunc);\n }\n function _wrap(func, superFunc) {\n function superWrapper() {\n let orig = this._super;\n this._super = superFunc;\n let ret = func.apply(this, arguments);\n this._super = orig;\n return ret;\n }\n IS_WRAPPED_FUNCTION_SET.add(superWrapper);\n setObservers(superWrapper, getObservers(func));\n setListeners(superWrapper, getListeners(func));\n return superWrapper;\n }\n});","enifed('@ember/-internals/utils/lib/symbol-utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n const HAS_NATIVE_SYMBOL = exports.HAS_NATIVE_SYMBOL = function () {\n if (typeof Symbol !== 'function') {\n return false;\n }\n // use `Object`'s `.toString` directly to prevent us from detecting\n // polyfills as native\n return Object.prototype.toString.call(Symbol()) === '[object Symbol]';\n }();\n});","enifed('@ember/-internals/utils/lib/symbol', ['exports', '@ember/-internals/utils/lib/guid', '@ember/-internals/utils/lib/intern'], function (exports, _guid, _intern) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isInternalSymbol = isInternalSymbol;\n exports.default = symbol;\n\n const GENERATED_SYMBOLS = [];\n function isInternalSymbol(possibleSymbol) {\n return GENERATED_SYMBOLS.indexOf(possibleSymbol) !== -1;\n }\n function symbol(debugName) {\n // TODO: Investigate using platform symbols, but we do not\n // want to require non-enumerability for this API, which\n // would introduce a large cost.\n let id = _guid.GUID_KEY + Math.floor(Math.random() * +new Date());\n let symbol = (0, _intern.default)(`__${debugName}${id}__`);\n GENERATED_SYMBOLS.push(symbol);\n return symbol;\n }\n});","enifed('@ember/-internals/utils/lib/to-string', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = toString;\n const objectToString = Object.prototype.toString;\n function isNone(obj) {\n return obj === null || obj === undefined;\n }\n /*\n A `toString` util function that supports objects without a `toString`\n method, e.g. an object created with `Object.create(null)`.\n */\n function toString(obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n if (null === obj) return 'null';\n if (undefined === obj) return 'undefined';\n if (Array.isArray(obj)) {\n // Reimplement Array.prototype.join according to spec (22.1.3.13)\n // Changing ToString(element) with this safe version of ToString.\n let r = '';\n for (let k = 0; k < obj.length; k++) {\n if (k > 0) {\n r += ',';\n }\n if (!isNone(obj[k])) {\n r += toString(obj[k]);\n }\n }\n return r;\n }\n if (typeof obj.toString === 'function') {\n return obj.toString();\n }\n return objectToString.call(obj);\n }\n});","enifed('@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 let cache = new _utils.Cache(100, key => key.toUpperCase());\n\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 let cache = new _utils.Cache(100, key => key.toUpperCase());\n\n assert.equal(cache.get('foo'), 'FOO');\n\n assert.equal(cache.set('foo', 'FOO!!!'), 'FOO!!!');\n\n assert.equal(cache.get('foo'), 'FOO!!!');\n\n assert.strictEqual(cache.set('foo', undefined), undefined);\n\n assert.strictEqual(cache.get('foo'), undefined);\n }\n\n ['@test caches computation correctly'](assert) {\n let count = 0;\n let cache = new _utils.Cache(100, key => {\n count++;\n return key.toUpperCase();\n });\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 let count = 0;\n let cache = new _utils.Cache(100, () => {\n count++;\n });\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 let cache = new _utils.Cache(3, key => key.toUpperCase());\n\n cache.get('a');\n cache.get('b');\n cache.get('c');\n\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});","enifed('@ember/-internals/utils/tests/can_invoke_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('Ember.canInvoke', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n obj = {\n foobar: 'foobar',\n aMethodThatExists() {}\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});","enifed('@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});","enifed('@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 let a = {};\n\n assert.ok((0, _utils.generateGuid)(a, 'tyrell').indexOf('tyrell') > -1, 'guid can be prefixed');\n }\n });\n});","enifed('@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 let 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 let a = {};\n let b = {};\n\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 let a = 'string A';\n let aprime = 'string A';\n let b = 'String B';\n\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 let a = 23;\n let aprime = 23;\n let b = 34;\n\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 if (typeof Symbol === 'undefined') {\n assert.ok(true, 'symbols are not supported on this browser');\n return;\n }\n\n let a = Symbol('a');\n let b = Symbol('b');\n\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 let a = true;\n let aprime = true;\n let b = false;\n\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 let a = null;\n let aprime = null;\n let b;\n\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 let a = ['a', 'b', 'c'];\n let aprime = ['a', 'b', 'c'];\n let b = ['1', '2', '3'];\n\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});","enifed('@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)({ foo: 'bar' }), '{ foo: \"bar\" }');\n let obj = {\n foo() {\n return this;\n }\n };\n // IE 11 doesn't have function name\n if (obj.foo.name) {\n assert.equal((0, _utils.inspect)(obj), `{ foo: [Function:foo] }`);\n } else {\n assert.equal((0, _utils.inspect)(obj), `{ foo: [Function] }`);\n }\n }\n\n ['@test objects without a prototype'](assert) {\n let prototypelessObj = Object.create(null);\n prototypelessObj.a = 1;\n prototypelessObj.b = [Object.create(null)];\n assert.equal((0, _utils.inspect)({ foo: prototypelessObj }), '{ 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 let a = [];\n for (let i = 0; i < 120; i++) {\n a.push(1);\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 let obj = {};\n let pairs = [];\n for (let i = 0; i < 120; i++) {\n obj['key' + i] = i;\n pairs.push(`key${i}: ${i}`);\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', { a: 1 }, [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 let obj = { a: 1 };\n obj.inspect = _utils.inspect;\n let depth = 2;\n let options = {};\n assert.equal(obj.inspect(depth, options), obj);\n }\n\n ['@test cycle'](assert) {\n let obj = {};\n obj.a = obj;\n let 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 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 let 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 if (_utils.HAS_NATIVE_SYMBOL) {\n let symbol = Symbol('test');\n assert.equal((0, _utils.inspect)(symbol), 'Symbol(test)');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@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 let proxy = {};\n (0, _utils.setProxy)(proxy);\n\n assert.equal((0, _utils.isProxy)(proxy), true);\n\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});","enifed('@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});","enifed('@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 let 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 let obj = Object.create(null);\n\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 let obj = Object.create(null);\n let arr = [obj, 2];\n\n assert.strictEqual((0, _utils.toString)(arr), `${{}.toString()},2`);\n }\n });\n});","enifed('@ember/-internals/utils/tests/try_invoke_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('Ember.tryInvoke', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n obj = {\n aMethodThatExists() {\n return true;\n },\n aMethodThatTakesArguments(arg1, arg2) {\n return arg1 === arg2;\n }\n };\n }\n\n teardown() {\n obj = undefined;\n }\n\n [\"@test should return undefined when the object doesn't exist\"](assert) {\n assert.equal((0, _utils.tryInvoke)(undefined, 'aMethodThatDoesNotExist'), undefined);\n }\n\n [\"@test should return undefined when asked to perform a method that doesn't exist on the object\"](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatDoesNotExist'), undefined);\n }\n\n ['@test should return what the method returns when asked to perform a method that exists on the object'](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatExists'), true);\n }\n\n ['@test should return what the method returns when asked to perform a method that takes arguments and exists on the object'](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatTakesArguments', [true, true]), true);\n }\n });\n});","enifed('@ember/-internals/views/index', ['exports', '@ember/-internals/views/lib/system/jquery', '@ember/-internals/views/lib/system/utils', '@ember/-internals/views/lib/system/event_dispatcher', '@ember/-internals/views/lib/component_lookup', '@ember/-internals/views/lib/mixins/text_support', '@ember/-internals/views/lib/views/core_view', '@ember/-internals/views/lib/mixins/class_names_support', '@ember/-internals/views/lib/mixins/child_views_support', '@ember/-internals/views/lib/mixins/view_state_support', '@ember/-internals/views/lib/mixins/view_support', '@ember/-internals/views/lib/mixins/action_support', '@ember/-internals/views/lib/compat/attrs', '@ember/-internals/views/lib/system/lookup_partial', '@ember/-internals/views/lib/utils/lookup-component', '@ember/-internals/views/lib/system/action_manager', '@ember/-internals/views/lib/compat/fallback-view-registry'], function (exports, _jquery, _utils, _event_dispatcher, _component_lookup, _text_support, _core_view, _class_names_support, _child_views_support, _view_state_support, _view_support, _action_support, _attrs, _lookup_partial, _lookupComponent, _action_manager, _fallbackViewRegistry) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'jQuery', {\n enumerable: true,\n get: function () {\n return _jquery.default;\n }\n });\n Object.defineProperty(exports, 'jQueryDisabled', {\n enumerable: true,\n get: function () {\n return _jquery.jQueryDisabled;\n }\n });\n Object.defineProperty(exports, 'addChildView', {\n enumerable: true,\n get: function () {\n return _utils.addChildView;\n }\n });\n Object.defineProperty(exports, 'isSimpleClick', {\n enumerable: true,\n get: function () {\n return _utils.isSimpleClick;\n }\n });\n Object.defineProperty(exports, 'getViewBounds', {\n enumerable: true,\n get: function () {\n return _utils.getViewBounds;\n }\n });\n Object.defineProperty(exports, 'getViewClientRects', {\n enumerable: true,\n get: function () {\n return _utils.getViewClientRects;\n }\n });\n Object.defineProperty(exports, 'getViewBoundingClientRect', {\n enumerable: true,\n get: function () {\n return _utils.getViewBoundingClientRect;\n }\n });\n Object.defineProperty(exports, 'getRootViews', {\n enumerable: true,\n get: function () {\n return _utils.getRootViews;\n }\n });\n Object.defineProperty(exports, 'getChildViews', {\n enumerable: true,\n get: function () {\n return _utils.getChildViews;\n }\n });\n Object.defineProperty(exports, 'getViewId', {\n enumerable: true,\n get: function () {\n return _utils.getViewId;\n }\n });\n Object.defineProperty(exports, 'getViewElement', {\n enumerable: true,\n get: function () {\n return _utils.getViewElement;\n }\n });\n Object.defineProperty(exports, 'setViewElement', {\n enumerable: true,\n get: function () {\n return _utils.setViewElement;\n }\n });\n Object.defineProperty(exports, 'constructStyleDeprecationMessage', {\n enumerable: true,\n get: function () {\n return _utils.constructStyleDeprecationMessage;\n }\n });\n Object.defineProperty(exports, 'EventDispatcher', {\n enumerable: true,\n get: function () {\n return _event_dispatcher.default;\n }\n });\n Object.defineProperty(exports, 'ComponentLookup', {\n enumerable: true,\n get: function () {\n return _component_lookup.default;\n }\n });\n Object.defineProperty(exports, 'TextSupport', {\n enumerable: true,\n get: function () {\n return _text_support.default;\n }\n });\n Object.defineProperty(exports, 'CoreView', {\n enumerable: true,\n get: function () {\n return _core_view.default;\n }\n });\n Object.defineProperty(exports, 'ClassNamesSupport', {\n enumerable: true,\n get: function () {\n return _class_names_support.default;\n }\n });\n Object.defineProperty(exports, 'ChildViewsSupport', {\n enumerable: true,\n get: function () {\n return _child_views_support.default;\n }\n });\n Object.defineProperty(exports, 'ViewStateSupport', {\n enumerable: true,\n get: function () {\n return _view_state_support.default;\n }\n });\n Object.defineProperty(exports, 'ViewMixin', {\n enumerable: true,\n get: function () {\n return _view_support.default;\n }\n });\n Object.defineProperty(exports, 'ActionSupport', {\n enumerable: true,\n get: function () {\n return _action_support.default;\n }\n });\n Object.defineProperty(exports, 'MUTABLE_CELL', {\n enumerable: true,\n get: function () {\n return _attrs.MUTABLE_CELL;\n }\n });\n Object.defineProperty(exports, 'lookupPartial', {\n enumerable: true,\n get: function () {\n return _lookup_partial.default;\n }\n });\n Object.defineProperty(exports, 'hasPartial', {\n enumerable: true,\n get: function () {\n return _lookup_partial.hasPartial;\n }\n });\n Object.defineProperty(exports, 'lookupComponent', {\n enumerable: true,\n get: function () {\n return _lookupComponent.default;\n }\n });\n Object.defineProperty(exports, 'ActionManager', {\n enumerable: true,\n get: function () {\n return _action_manager.default;\n }\n });\n Object.defineProperty(exports, 'fallbackViewRegistry', {\n enumerable: true,\n get: function () {\n return _fallbackViewRegistry.default;\n }\n });\n});","enifed('@ember/-internals/views/lib/compat/attrs', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.MUTABLE_CELL = undefined;\n let MUTABLE_CELL = exports.MUTABLE_CELL = (0, _utils.symbol)('MUTABLE_CELL');\n});","enifed('@ember/-internals/views/lib/compat/fallback-view-registry', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = (0, _utils.dictionary)(null);\n});","enifed('@ember/-internals/views/lib/component_lookup', ['exports', '@ember/canary-features', '@ember/debug', '@ember/-internals/runtime'], function (exports, _canaryFeatures, _debug, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _runtime.Object.extend({\n componentFor(name, owner, options) {\n (0, _debug.assert)(`You cannot use '${name}' as a component name. Component names must contain a hyphen${_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION ? ' or start with a capital letter' : ''}.`, name.indexOf('-') > -1 || _canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION);\n\n let fullName = `component:${name}`;\n return owner.factoryFor(fullName, options);\n },\n\n layoutFor(name, owner, options) {\n (0, _debug.assert)(`You cannot use '${name}' as a component name. Component names must contain a hyphen.`, name.indexOf('-') > -1 || _canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION);\n\n let templateFullName = `template:components/${name}`;\n return owner.lookup(templateFullName, options);\n }\n });\n});","enifed('@ember/-internals/views/lib/mixins/action_support', ['exports', '@ember/-internals/utils', '@ember/-internals/metal', '@ember/debug', '@ember/-internals/views/lib/compat/attrs', '@ember/deprecated-features'], function (exports, _utils, _metal, _debug, _attrs, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const mixinObj = {\n send(actionName, ...args) {\n (0, _debug.assert)(`Attempted to call .send() with the action '${actionName}' on the destroyed object '${this}'.`, !this.isDestroying && !this.isDestroyed);\n\n let action = this.actions && this.actions[actionName];\n\n if (action) {\n let shouldBubble = action.apply(this, args) === true;\n if (!shouldBubble) {\n return;\n }\n }\n\n let target = (0, _metal.get)(this, 'target');\n if (target) {\n (0, _debug.assert)(`The \\`target\\` for ${this} (${target}) does not have a \\`send\\` method`, typeof target.send === 'function');\n target.send(...arguments);\n } else {\n (0, _debug.assert)(`${(0, _utils.inspect)(this)} had no action handler for: ${actionName}`, action);\n }\n }\n }; /**\n @module ember\n */\n\n\n if (_deprecatedFeatures.SEND_ACTION) {\n /**\n Calls an action passed to a component.\n For example a component for playing or pausing music may translate click events\n into action notifications of \"play\" or \"stop\" depending on some internal state\n of the component:\n ```app/components/play-button.js\n import Component from '@ember/component';\n export default Component.extend({\n click() {\n if (this.get('isPlaying')) {\n this.sendAction('play');\n } else {\n this.sendAction('stop');\n }\n }\n });\n ```\n The actions \"play\" and \"stop\" must be passed to this `play-button` component:\n ```handlebars\n {{! app/templates/application.hbs }}\n {{play-button play=(action \"musicStarted\") stop=(action \"musicStopped\")}}\n ```\n When the component receives a browser `click` event it translate this\n interaction into application-specific semantics (\"play\" or \"stop\") and\n calls the specified action.\n ```app/controller/application.js\n import Controller from '@ember/controller';\n export default Controller.extend({\n actions: {\n musicStarted() {\n // called when the play button is clicked\n // and the music started playing\n },\n musicStopped() {\n // called when the play button is clicked\n // and the music stopped playing\n }\n }\n });\n ```\n If no action is passed to `sendAction` a default name of \"action\"\n is assumed.\n ```app/components/next-button.js\n import Component from '@ember/component';\n export default Component.extend({\n click() {\n this.sendAction();\n }\n });\n ```\n ```handlebars\n {{! app/templates/application.hbs }}\n {{next-button action=(action \"playNextSongInAlbum\")}}\n ```\n ```app/controllers/application.js\n import Controller from '@ember/controller';\n export default Controller.extend({\n actions: {\n playNextSongInAlbum() {\n ...\n }\n }\n });\n ```\n @method sendAction\n @param [action] {String} the action to call\n @param [params] {*} arguments for the action\n @public\n @deprecated\n */\n let sendAction = function sendAction(action, ...contexts) {\n (0, _debug.assert)(`Attempted to call .sendAction() with the action '${action}' on the destroyed object '${this}'.`, !this.isDestroying && !this.isDestroyed);\n (0, _debug.deprecate)(`You called ${(0, _utils.inspect)(this)}.sendAction(${typeof action === 'string' ? `\"${action}\"` : ''}) but Component#sendAction is deprecated. Please use closure actions instead.`, false, {\n id: 'ember-component.send-action',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_ember-component-send-action'\n });\n\n let actionName;\n\n // Send the default action\n if (action === undefined) {\n action = 'action';\n }\n actionName = (0, _metal.get)(this, `attrs.${action}`) || (0, _metal.get)(this, action);\n actionName = validateAction(this, actionName);\n\n // If no action name for that action could be found, just abort.\n if (actionName === undefined) {\n return;\n }\n\n if (typeof actionName === 'function') {\n actionName(...contexts);\n } else {\n this.triggerAction({\n action: actionName,\n actionContext: contexts\n });\n }\n };\n\n let validateAction = function validateAction(component, actionName) {\n if (actionName && actionName[_attrs.MUTABLE_CELL]) {\n actionName = actionName.value;\n }\n\n (0, _debug.assert)(`The default action was triggered on the component ${component.toString()}, but the action name (${actionName}) was not a string.`, actionName === null || actionName === undefined || typeof actionName === 'string' || typeof actionName === 'function');\n return actionName;\n };\n\n mixinObj.sendAction = sendAction;\n }\n\n /**\n @class ActionSupport\n @namespace Ember\n @private\n */\n exports.default = _metal.Mixin.create(mixinObj);\n});","enifed('@ember/-internals/views/lib/mixins/child_views_support', ['exports', '@ember/-internals/metal', '@ember/-internals/views/lib/system/utils'], function (exports, _metal, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n /**\n Array of child views. You should never edit this array directly.\n @property childViews\n @type Array\n @default []\n @private\n */\n childViews: (0, _metal.descriptor)({\n configurable: false,\n enumerable: false,\n get() {\n return (0, _utils.getChildViews)(this);\n }\n }),\n\n appendChild(view) {\n (0, _utils.addChildView)(this, view);\n }\n });\n});","enifed('@ember/-internals/views/lib/mixins/class_names_support', ['exports', '@ember/-internals/meta', '@ember/-internals/metal', '@ember/debug'], function (exports, _meta, _metal, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const EMPTY_ARRAY = Object.freeze([]);\n\n /**\n @class ClassNamesSupport\n @namespace Ember\n @private\n */\n /**\n @module ember\n */\n exports.default = _metal.Mixin.create({\n concatenatedProperties: ['classNames', 'classNameBindings'],\n\n init() {\n this._super(...arguments);\n\n (0, _debug.assert)(`Only arrays are allowed for 'classNameBindings'`, (0, _meta.descriptorFor)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings));\n (0, _debug.assert)(`Only arrays of static class strings are allowed for 'classNames'. For dynamic classes, use 'classNameBindings'.`, (0, _meta.descriptorFor)(this, 'classNames') === undefined && Array.isArray(this.classNames));\n },\n\n /**\n Standard CSS class names to apply to the view's outer element. This\n property automatically inherits any class names defined by the view's\n superclasses as well.\n @property classNames\n @type Array\n @default ['ember-view']\n @public\n */\n classNames: EMPTY_ARRAY,\n\n /**\n A list of properties of the view to apply as class names. If the property\n is a string value, the value of that string will be applied as a class\n name.\n ```javascript\n // Applies the 'high' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['priority'],\n priority: 'high'\n });\n ```\n If the value of the property is a Boolean, the name of that property is\n added as a dasherized class name.\n ```javascript\n // Applies the 'is-urgent' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['isUrgent'],\n isUrgent: true\n });\n ```\n If you would prefer to use a custom value instead of the dasherized\n property name, you can pass a binding like this:\n ```javascript\n // Applies the 'urgent' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['isUrgent:urgent'],\n isUrgent: true\n });\n ```\n If you would like to specify a class that should only be added when the\n property is false, you can declare a binding like this:\n ```javascript\n // Applies the 'disabled' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['isEnabled::disabled'],\n isEnabled: false\n });\n ```\n This list of properties is inherited from the component's superclasses as well.\n @property classNameBindings\n @type Array\n @default []\n @public\n */\n classNameBindings: EMPTY_ARRAY\n });\n});","enifed('@ember/-internals/views/lib/mixins/text_support', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/debug', '@ember/deprecated-features'], function (exports, _metal, _runtime, _debug, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n /**\n @module ember\n */\n\n const KEY_EVENTS = {\n 13: 'insertNewline',\n 27: 'cancel'\n };\n\n /**\n `TextSupport` is a shared mixin used by both `TextField` and\n `TextArea`. `TextSupport` adds a number of methods that allow you to\n specify a controller action to invoke when a certain event is fired on your\n text field or textarea. The specified controller action would get the current\n value of the field passed in as the only argument unless the value of\n the field is empty. In that case, the instance of the field itself is passed\n in as the only argument.\n \n Let's use the pressing of the escape key as an example. If you wanted to\n invoke a controller action when a user presses the escape key while on your\n field, you would use the `escape-press` attribute on your field like so:\n \n ```handlebars\n {{! application.hbs}}\n \n {{input escape-press='alertUser'}}\n ```\n \n ```javascript\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n App = Application.create();\n \n App.ApplicationController = Controller.extend({\n actions: {\n alertUser: function ( currentValue ) {\n alert( 'escape pressed, current value: ' + currentValue );\n }\n }\n });\n ```\n \n The following chart is a visual representation of what takes place when the\n escape key is pressed in this scenario:\n \n ```\n The Template\n +---------------------------+\n | |\n | escape-press='alertUser' |\n | | TextSupport Mixin\n +----+----------------------+ +-------------------------------+\n | | cancel method |\n | escape button pressed | |\n +-------------------------------> | checks for the `escape-press` |\n | attribute and pulls out the |\n +-------------------------------+ | `alertUser` value |\n | action name 'alertUser' +-------------------------------+\n | sent to controller\n v\n Controller\n +------------------------------------------ +\n | |\n | actions: { |\n | alertUser: function( currentValue ){ |\n | alert( 'the esc key was pressed!' ) |\n | } |\n | } |\n | |\n +-------------------------------------------+\n ```\n \n Here are the events that we currently support along with the name of the\n attribute you would need to use on your field. To reiterate, you would use the\n attribute name like so:\n \n ```handlebars\n {{input attribute-name='controllerAction'}}\n ```\n \n ```\n +--------------------+----------------+\n | | |\n | event | attribute name |\n +--------------------+----------------+\n | new line inserted | insert-newline |\n | | |\n | enter key pressed | enter |\n | | |\n | cancel key pressed | escape-press |\n | | |\n | focusin | focus-in |\n | | |\n | focusout | focus-out |\n | | |\n | keypress | key-press |\n | | |\n | keyup | key-up |\n | | |\n | keydown | key-down |\n +--------------------+----------------+\n ```\n \n @class TextSupport\n @namespace Ember\n @uses Ember.TargetActionSupport\n @extends Mixin\n @private\n */\n exports.default = _metal.Mixin.create(_runtime.TargetActionSupport, {\n value: '',\n\n attributeBindings: ['autocapitalize', 'autocorrect', 'autofocus', 'disabled', 'form', 'maxlength', 'minlength', 'placeholder', 'readonly', 'required', 'selectionDirection', 'spellcheck', 'tabindex', 'title'],\n placeholder: null,\n disabled: false,\n maxlength: null,\n\n init() {\n this._super(...arguments);\n this.on('paste', this, this._elementValueDidChange);\n this.on('cut', this, this._elementValueDidChange);\n this.on('input', this, this._elementValueDidChange);\n },\n\n /**\n Whether the `keyUp` event that triggers an `action` to be sent continues\n propagating to other views.\n By default, when the user presses the return key on their keyboard and\n the text field has an `action` set, the action will be sent to the view's\n controller and the key event will stop propagating.\n If you would like parent views to receive the `keyUp` event even after an\n action has been dispatched, set `bubbles` to true.\n @property bubbles\n @type Boolean\n @default false\n @private\n */\n bubbles: false,\n\n interpretKeyEvents(event) {\n let map = KEY_EVENTS;\n let method = map[event.keyCode];\n\n this._elementValueDidChange();\n if (method) {\n return this[method](event);\n }\n },\n\n _elementValueDidChange() {\n (0, _metal.set)(this, 'value', this.element.value);\n },\n\n change(event) {\n this._elementValueDidChange(event);\n },\n\n /**\n Allows you to specify a controller action to invoke when either the `enter`\n key is pressed or, in the case of the field being a textarea, when a newline\n is inserted. To use this method, give your field an `insert-newline`\n attribute. The value of that attribute should be the name of the action\n in your controller that you wish to invoke.\n For an example on how to use the `insert-newline` attribute, please\n reference the example near the top of this file.\n @method insertNewline\n @param {Event} event\n @private\n */\n insertNewline(event) {\n sendAction('enter', this, event);\n sendAction('insert-newline', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when the escape button\n is pressed. To use this method, give your field an `escape-press`\n attribute. The value of that attribute should be the name of the action\n in your controller that you wish to invoke.\n For an example on how to use the `escape-press` attribute, please reference\n the example near the top of this file.\n @method cancel\n @param {Event} event\n @private\n */\n cancel(event) {\n sendAction('escape-press', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when a field receives\n focus. To use this method, give your field a `focus-in` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `focus-in` attribute, please reference the\n example near the top of this file.\n @method focusIn\n @param {Event} event\n @private\n */\n focusIn(event) {\n sendAction('focus-in', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when a field loses\n focus. To use this method, give your field a `focus-out` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `focus-out` attribute, please reference the\n example near the top of this file.\n @method focusOut\n @param {Event} event\n @private\n */\n focusOut(event) {\n this._elementValueDidChange(event);\n sendAction('focus-out', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when a key is pressed.\n To use this method, give your field a `key-press` attribute. The value of\n that attribute should be the name of the action in your controller you\n that wish to invoke.\n For an example on how to use the `key-press` attribute, please reference the\n example near the top of this file.\n @method keyPress\n @param {Event} event\n @private\n */\n keyPress(event) {\n sendAction('key-press', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when a key-up event is\n fired. To use this method, give your field a `key-up` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `key-up` attribute, please reference the\n example near the top of this file.\n @method keyUp\n @param {Event} event\n @private\n */\n keyUp(event) {\n this.interpretKeyEvents(event);\n sendAction('key-up', this, event);\n },\n\n /**\n Allows you to specify a controller action to invoke when a key-down event is\n fired. To use this method, give your field a `key-down` attribute. The value\n of that attribute should be the name of the action in your controller that\n you wish to invoke.\n For an example on how to use the `key-down` attribute, please reference the\n example near the top of this file.\n @method keyDown\n @param {Event} event\n @private\n */\n keyDown(event) {\n sendAction('key-down', this, event);\n }\n });\n\n\n // In principle, this shouldn't be necessary, but the legacy\n // sendAction semantics for TextField are different from\n // the component semantics so this method normalizes them.\n function sendAction(eventName, view, event) {\n let actionName = (0, _metal.get)(view, `attrs.${eventName}`) || (0, _metal.get)(view, eventName);\n let value = (0, _metal.get)(view, 'value');\n\n if (_deprecatedFeatures.SEND_ACTION && typeof actionName === 'string') {\n (0, _debug.deprecate)(`Passing actions to components as strings (like {{input ${eventName}=\"${actionName}\"}}) is deprecated. Please use closure actions instead ({{input ${eventName}=(action \"${actionName}\")}})`, false, {\n id: 'ember-component.send-action',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_ember-component-send-action'\n });\n view.triggerAction({\n action: actionName,\n actionContext: [value, event]\n });\n } else if (typeof actionName === 'function') {\n actionName(value, event);\n }\n\n if (actionName && !(0, _metal.get)(view, 'bubbles')) {\n event.stopPropagation();\n }\n }\n});","enifed('@ember/-internals/views/lib/mixins/view_state_support', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create({\n _transitionTo(state) {\n let priorState = this._currentState;\n let currentState = this._currentState = this._states[state];\n this._state = state;\n\n if (priorState && priorState.exit) {\n priorState.exit(this);\n }\n if (currentState.enter) {\n currentState.enter(this);\n }\n }\n });\n});","enifed('@ember/-internals/views/lib/mixins/view_support', ['exports', '@ember/-internals/utils', '@ember/-internals/meta', '@ember/-internals/metal', '@ember/debug', '@ember/-internals/browser-environment', '@ember/-internals/views/lib/system/utils', '@ember/-internals/views/lib/system/jquery'], function (exports, _utils, _meta, _metal, _debug, _browserEnvironment, _utils2, _jquery) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n function K() {\n return this;\n }\n\n /**\n @class ViewMixin\n @namespace Ember\n @private\n */\n exports.default = _metal.Mixin.create({\n /**\n A list of properties of the view to apply as attributes. If the property\n is a string value, the value of that string will be applied as the value\n for an attribute of the property's name.\n The following example creates a tag like `
    `.\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['priority'],\n priority: 'high'\n });\n ```\n If the value of the property is a Boolean, the attribute is treated as\n an HTML Boolean attribute. It will be present if the property is `true`\n and omitted if the property is `false`.\n The following example creates markup like `
    `.\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['visible'],\n visible: true\n });\n ```\n If you would prefer to use a custom value instead of the property name,\n you can create the same markup as the last example with a binding like\n this:\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['isVisible:visible'],\n isVisible: true\n });\n ```\n This list of attributes is inherited from the component's superclasses,\n as well.\n @property attributeBindings\n @type Array\n @default []\n @public\n */\n concatenatedProperties: ['attributeBindings'],\n\n // ..........................................................\n // TEMPLATE SUPPORT\n //\n\n /**\n Return the nearest ancestor that is an instance of the provided\n class or mixin.\n @method nearestOfType\n @param {Class,Mixin} klass Subclass of Ember.View (or Ember.View itself),\n or an instance of Mixin.\n @return Ember.View\n @deprecated use `yield` and contextual components for composition instead.\n @private\n */\n nearestOfType(klass) {\n let view = this.parentView;\n let isOfType = klass instanceof _metal.Mixin ? view => klass.detect(view) : view => klass.detect(view.constructor);\n\n while (view) {\n if (isOfType(view)) {\n return view;\n }\n view = view.parentView;\n }\n },\n\n /**\n Return the nearest ancestor that has a given property.\n @method nearestWithProperty\n @param {String} property A property name\n @return Ember.View\n @deprecated use `yield` and contextual components for composition instead.\n @private\n */\n nearestWithProperty(property) {\n let view = this.parentView;\n\n while (view) {\n if (property in view) {\n return view;\n }\n view = view.parentView;\n }\n },\n\n /**\n Renders the view again. This will work regardless of whether the\n view is already in the DOM or not. If the view is in the DOM, the\n rendering process will be deferred to give bindings a chance\n to synchronize.\n If children were added during the rendering process using `appendChild`,\n `rerender` will remove them, because they will be added again\n if needed by the next `render`.\n In general, if the display of your view changes, you should modify\n the DOM element directly instead of manually calling `rerender`, which can\n be slow.\n @method rerender\n @public\n */\n rerender() {\n return this._currentState.rerender(this);\n },\n\n // ..........................................................\n // ELEMENT SUPPORT\n //\n\n /**\n Returns the current DOM element for the view.\n @property element\n @type DOMElement\n @public\n */\n element: (0, _metal.descriptor)({\n configurable: false,\n enumerable: false,\n get() {\n return this.renderer.getElement(this);\n }\n }),\n\n /**\n Returns a jQuery object for this view's element. If you pass in a selector\n string, this method will return a jQuery object, using the current element\n as its buffer.\n For example, calling `view.$('li')` will return a jQuery object containing\n all of the `li` elements inside the DOM element of this view.\n @method $\n @param {String} [selector] a jQuery-compatible selector string\n @return {jQuery} the jQuery object for the DOM node\n @public\n */\n $(sel) {\n (0, _debug.assert)(\"You cannot access this.$() on a component with `tagName: ''` specified.\", this.tagName !== '');\n (0, _debug.assert)('You cannot access this.$() with `jQuery` disabled.', !_jquery.jQueryDisabled);\n if (this.element) {\n return sel ? (0, _jquery.default)(sel, this.element) : (0, _jquery.default)(this.element);\n }\n },\n\n /**\n Appends the view's element to the specified parent element.\n Note that this method just schedules the view to be appended; the DOM\n element will not be appended to the given element until all bindings have\n finished synchronizing.\n This is not typically a function that you will need to call directly when\n building your application. If you do need to use `appendTo`, be sure that\n the target element you are providing is associated with an `Application`\n and does not have an ancestor element that is associated with an Ember view.\n @method appendTo\n @param {String|DOMElement|jQuery} A selector, element, HTML string, or jQuery object\n @return {Ember.View} receiver\n @private\n */\n appendTo(selector) {\n let target;\n\n if (_browserEnvironment.hasDOM) {\n target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n\n (0, _debug.assert)(`You tried to append to (${selector}) but that isn't in the DOM`, target);\n (0, _debug.assert)('You cannot append to an existing Ember.View.', !(0, _utils2.matches)(target, '.ember-view'));\n (0, _debug.assert)('You cannot append to an existing Ember.View.', (() => {\n let node = target.parentNode;\n while (node) {\n if (node.nodeType !== 9 && (0, _utils2.matches)(node, '.ember-view')) {\n return false;\n }\n\n node = node.parentNode;\n }\n\n return true;\n })());\n } else {\n target = selector;\n\n (0, _debug.assert)(`You tried to append to a selector string (${selector}) in an environment without jQuery`, typeof target !== 'string');\n (0, _debug.assert)(`You tried to append to a non-Element (${selector}) in an environment without jQuery`, typeof selector.appendChild === 'function');\n }\n\n this.renderer.appendTo(this, target);\n\n return this;\n },\n\n /**\n Appends the view's element to the document body. If the view does\n not have an HTML representation yet\n the element will be generated automatically.\n If your application uses the `rootElement` property, you must append\n the view within that element. Rendering views outside of the `rootElement`\n is not supported.\n Note that this method just schedules the view to be appended; the DOM\n element will not be appended to the document body until all bindings have\n finished synchronizing.\n @method append\n @return {Ember.View} receiver\n @private\n */\n append() {\n return this.appendTo(document.body);\n },\n\n /**\n The HTML `id` of the view's element in the DOM. You can provide this\n value yourself but it must be unique (just as in HTML):\n ```handlebars\n {{my-component elementId=\"a-really-cool-id\"}}\n ```\n If not manually set a default value will be provided by the framework.\n Once rendered an element's `elementId` is considered immutable and you\n should never change it. If you need to compute a dynamic value for the\n `elementId`, you should do this when the component or element is being\n instantiated:\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n init() {\n this._super(...arguments);\n let index = this.get('index');\n this.set('elementId', 'component-id' + index);\n }\n });\n ```\n @property elementId\n @type String\n @public\n */\n elementId: null,\n\n /**\n Attempts to discover the element in the parent element. The default\n implementation looks for an element with an ID of `elementId` (or the\n view's guid if `elementId` is null). You can override this method to\n provide your own form of lookup. For example, if you want to discover your\n element using a CSS class name instead of an ID.\n @method findElementInParentElement\n @param {DOMElement} parentElement The parent's DOM element\n @return {DOMElement} The discovered element\n @private\n */\n findElementInParentElement(parentElem) {\n let id = `#${this.elementId}`;\n return (0, _jquery.default)(id)[0] || (0, _jquery.default)(id, parentElem)[0];\n },\n\n /**\n Called when a view is going to insert an element into the DOM.\n @event willInsertElement\n @public\n */\n willInsertElement: K,\n\n /**\n Called when the element of the view has been inserted into the DOM.\n Override this function to do any set up that requires an element\n in the document body.\n When a view has children, didInsertElement will be called on the\n child view(s) first and on itself afterwards.\n @event didInsertElement\n @public\n */\n didInsertElement: K,\n\n /**\n Called when the view is about to rerender, but before anything has\n been torn down. This is a good opportunity to tear down any manual\n observers you have installed based on the DOM state\n @event willClearRender\n @public\n */\n willClearRender: K,\n\n /**\n You must call `destroy` on a view to destroy the view (and all of its\n child views). This will remove the view from any parent node, then make\n sure that the DOM element managed by the view can be released by the\n memory manager.\n @method destroy\n @private\n */\n destroy() {\n this._super(...arguments);\n this._currentState.destroy(this);\n },\n\n /**\n Called when the element of the view is going to be destroyed. Override\n this function to do any teardown that requires an element, like removing\n event listeners.\n Please note: any property changes made during this event will have no\n effect on object observers.\n @event willDestroyElement\n @public\n */\n willDestroyElement: K,\n\n /**\n Called after the element of the view is destroyed.\n @event willDestroyElement\n @public\n */\n didDestroyElement: K,\n\n /**\n Called when the parentView property has changed.\n @event parentViewDidChange\n @private\n */\n parentViewDidChange: K,\n\n // ..........................................................\n // STANDARD RENDER PROPERTIES\n //\n\n /**\n Tag name for the view's outer element. The tag name is only used when an\n element is first created. If you change the `tagName` for an element, you\n must destroy and recreate the view element.\n By default, the render buffer will use a `
    ` tag for views.\n @property tagName\n @type String\n @default null\n @public\n */\n\n // We leave this null by default so we can tell the difference between\n // the default case and a user-specified tag.\n tagName: null,\n\n // .......................................................\n // CORE DISPLAY METHODS\n //\n\n /**\n Setup a view, but do not finish waking it up.\n * configure `childViews`\n * register the view with the global views hash, which is used for event\n dispatch\n @method init\n @private\n */\n init() {\n this._super(...arguments);\n\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`You cannot use a computed property for the component's \\`elementId\\` (${this}).`, (0, _meta.descriptorFor)(this, 'elementId') === undefined);\n\n // tslint:disable-next-line:max-line-length\n (0, _debug.assert)(`You cannot use a computed property for the component's \\`tagName\\` (${this}).`, (0, _meta.descriptorFor)(this, 'tagName') === undefined);\n\n if (!this.elementId && this.tagName !== '') {\n this.elementId = (0, _utils.guidFor)(this);\n }\n\n (0, _debug.assert)('Using a custom `.render` function is no longer supported.', !this.render);\n },\n\n // .......................................................\n // EVENT HANDLING\n //\n\n /**\n Handle events from `EventDispatcher`\n @method handleEvent\n @param eventName {String}\n @param evt {Event}\n @private\n */\n handleEvent(eventName, evt) {\n return this._currentState.handleEvent(this, eventName, evt);\n }\n });\n});","enifed(\"@ember/-internals/views/lib/system/action_manager\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = ActionManager;\n /**\n @module ember\n */\n\n function ActionManager() {}\n\n /**\n Global action id hash.\n \n @private\n @property registeredActions\n @type Object\n */\n ActionManager.registeredActions = {};\n});","enifed('@ember/-internals/views/lib/system/event_dispatcher', ['exports', '@ember/-internals/owner', '@ember/polyfills', '@ember/debug', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/views/lib/system/jquery', '@ember/-internals/views/lib/system/action_manager', '@ember/-internals/views/lib/compat/fallback-view-registry', '@ember/-internals/views/lib/system/jquery_event_deprecation', '@ember/-internals/views/lib/system/utils'], function (exports, _owner, _polyfills, _debug, _metal, _runtime, _jquery, _action_manager, _fallbackViewRegistry, _jquery_event_deprecation, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n @module ember\n */\n\n const ROOT_ELEMENT_CLASS = 'ember-application';\n const ROOT_ELEMENT_SELECTOR = `.${ROOT_ELEMENT_CLASS}`;\n\n const EVENT_MAP = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n };\n\n /**\n `Ember.EventDispatcher` handles delegating browser events to their\n corresponding `Ember.Views.` For example, when you click on a view,\n `Ember.EventDispatcher` ensures that that view's `mouseDown` method gets\n called.\n \n @class EventDispatcher\n @namespace Ember\n @private\n @extends Ember.Object\n */\n exports.default = _runtime.Object.extend({\n /**\n The set of events names (and associated handler function names) to be setup\n and dispatched by the `EventDispatcher`. Modifications to this list can be done\n at setup time, generally via the `Application.customEvents` hash.\n To add new events to be listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n paste: 'paste'\n }\n });\n ```\n To prevent default events from being listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n @property events\n @type Object\n @private\n */\n 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 mousemove: 'mouseMove',\n focusin: 'focusIn',\n focusout: 'focusOut',\n mouseenter: 'mouseEnter',\n mouseleave: 'mouseLeave',\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\n /**\n The root DOM element to which event listeners should be attached. Event\n listeners will be attached to the document unless this is overridden.\n Can be specified as a DOMElement or a selector string.\n The default body is a string since this may be evaluated before document.body\n exists in the DOM.\n @private\n @property rootElement\n @type DOMElement\n @default 'body'\n */\n rootElement: 'body',\n\n init() {\n this._super();\n\n (0, _debug.assert)('EventDispatcher should never be instantiated in fastboot mode. Please report this as an Ember bug.', (() => {\n let owner = (0, _owner.getOwner)(this);\n let environment = owner.lookup('-environment:main');\n\n return environment.isInteractive;\n })());\n\n this._eventHandlers = Object.create(null);\n },\n\n /**\n Sets up event listeners for standard browser events.\n This will be called after the browser sends a `DOMContentReady` event. By\n default, it will set up all of the listeners on the document body. If you\n would like to register the listeners on a different element, set the event\n dispatcher's `root` property.\n @private\n @method setup\n @param addedEvents {Object}\n */\n setup(addedEvents, _rootElement) {\n let events = this._finalEvents = (0, _polyfills.assign)({}, (0, _metal.get)(this, 'events'), addedEvents);\n\n if (_rootElement !== undefined && _rootElement !== null) {\n (0, _metal.set)(this, 'rootElement', _rootElement);\n }\n\n let rootElementSelector = (0, _metal.get)(this, 'rootElement');\n let rootElement;\n if (_jquery.jQueryDisabled) {\n if (typeof rootElementSelector !== 'string') {\n rootElement = rootElementSelector;\n } else {\n rootElement = document.querySelector(rootElementSelector);\n }\n\n (0, _debug.assert)(`You cannot use the same root element (${(0, _metal.get)(this, 'rootElement') || rootElement.tagName}) multiple times in an Ember.Application`, !rootElement.classList.contains(ROOT_ELEMENT_CLASS));\n (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', (() => {\n let target = rootElement.parentNode;\n do {\n if (target.classList.contains(ROOT_ELEMENT_CLASS)) {\n return false;\n }\n\n target = target.parentNode;\n } while (target && target.nodeType === 1);\n\n return true;\n })());\n (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.querySelector(ROOT_ELEMENT_SELECTOR));\n\n rootElement.classList.add(ROOT_ELEMENT_CLASS);\n\n (0, _debug.assert)(`Unable to add '${ROOT_ELEMENT_CLASS}' class to root element (${(0, _metal.get)(this, 'rootElement') || rootElement.tagName}). Make sure you set rootElement to the body or an element in the body.`, rootElement.classList.contains(ROOT_ELEMENT_CLASS));\n } else {\n rootElement = (0, _jquery.default)(rootElementSelector);\n (0, _debug.assert)(`You cannot use the same root element (${rootElement.selector || rootElement[0].tagName}) multiple times in an Ember.Application`, !rootElement.is(ROOT_ELEMENT_SELECTOR));\n (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', !rootElement.closest(ROOT_ELEMENT_SELECTOR).length);\n (0, _debug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.find(ROOT_ELEMENT_SELECTOR).length);\n\n rootElement.addClass(ROOT_ELEMENT_CLASS);\n\n if (!rootElement.is(ROOT_ELEMENT_SELECTOR)) {\n throw new TypeError(`Unable to add '${ROOT_ELEMENT_CLASS}' class to root element (${rootElement.selector || rootElement[0].tagName}). Make sure you set rootElement to the body or an element in the body.`);\n }\n }\n\n let viewRegistry = this._getViewRegistry();\n\n for (let event in events) {\n if (events.hasOwnProperty(event)) {\n this.setupHandler(rootElement, event, events[event], viewRegistry);\n }\n }\n },\n\n /**\n Registers an event listener on the rootElement. If the given event is\n triggered, the provided event handler will be triggered on the target view.\n If the target view does not implement the event handler, or if the handler\n returns `false`, the parent view will be called. The event will continue to\n bubble to each successive parent view until it reaches the top.\n @private\n @method setupHandler\n @param {Element} rootElement\n @param {String} event the browser-originated event to listen to\n @param {String} eventName the name of the method to call on the view\n @param {Object} viewRegistry\n */\n setupHandler(rootElement, event, eventName, viewRegistry) {\n if (eventName === null) {\n return;\n }\n\n if (_jquery.jQueryDisabled) {\n let viewHandler = (target, event) => {\n let view = viewRegistry[target.id];\n let result = true;\n\n if (view) {\n result = view.handleEvent(eventName, event);\n }\n\n return result;\n };\n\n let actionHandler = (target, event) => {\n let actionId = target.getAttribute('data-ember-action');\n let actions = _action_manager.default.registeredActions[actionId];\n\n // In Glimmer2 this attribute is set to an empty string and an additional\n // attribute it set for each action on a given element. In this case, the\n // attributes need to be read so that a proper set of action handlers can\n // be coalesced.\n if (actionId === '') {\n let attributes = target.attributes;\n let attributeCount = attributes.length;\n\n actions = [];\n\n for (let i = 0; i < attributeCount; i++) {\n let attr = attributes.item(i);\n let attrName = attr.name;\n\n if (attrName.indexOf('data-ember-action-') === 0) {\n actions = actions.concat(_action_manager.default.registeredActions[attr.value]);\n }\n }\n }\n\n // We have to check for actions here since in some cases, jQuery will trigger\n // an event on `removeChild` (i.e. focusout) after we've already torn down the\n // action handlers for the view.\n if (!actions) {\n return;\n }\n\n for (let index = 0; index < actions.length; index++) {\n let action = actions[index];\n\n if (action && action.eventName === eventName) {\n return action.handler(event);\n }\n }\n };\n\n // Special handling of events that don't bubble (event delegation does not work).\n // Mimics the way this is handled in jQuery,\n // see https://github.com/jquery/jquery/blob/899c56f6ada26821e8af12d9f35fa039100e838e/src/event.js#L666-L700\n if (EVENT_MAP[event] !== undefined) {\n let mappedEventType = EVENT_MAP[event];\n let origEventType = event;\n\n let createFakeEvent = (eventType, event) => {\n let fakeEvent = document.createEvent('MouseEvent');\n fakeEvent.initMouseEvent(eventType, false, false, event.view, event.detail, event.screenX, event.screenY, event.clientX, event.clientY, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, event.button, event.relatedTarget);\n\n // fake event.target as we don't dispatch the event\n Object.defineProperty(fakeEvent, 'target', { value: event.target, enumerable: true });\n\n return fakeEvent;\n };\n\n let handleMappedEvent = this._eventHandlers[mappedEventType] = event => {\n let target = event.target;\n let related = event.relatedTarget;\n\n while (target && target.nodeType === 1 && (related === null || related !== target && !(0, _utils.contains)(target, related))) {\n // mouseEnter/Leave don't bubble, so there is no logic to prevent it as with other events\n if (viewRegistry[target.id]) {\n viewHandler(target, createFakeEvent(origEventType, event));\n } else if (target.hasAttribute('data-ember-action')) {\n actionHandler(target, createFakeEvent(origEventType, event));\n }\n\n // separate mouseEnter/Leave events are dispatched for each listening element\n // until the element (related) has been reached that the pointing device exited from/to\n target = target.parentNode;\n }\n };\n\n rootElement.addEventListener(mappedEventType, handleMappedEvent);\n } else {\n let handleEvent = this._eventHandlers[event] = event => {\n let target = event.target;\n\n do {\n if (viewRegistry[target.id]) {\n if (viewHandler(target, event) === false) {\n event.preventDefault();\n event.stopPropagation();\n break;\n }\n } else if (target.hasAttribute('data-ember-action')) {\n if (actionHandler(target, event) === false) {\n break;\n }\n }\n\n target = target.parentNode;\n } while (target && target.nodeType === 1);\n };\n\n rootElement.addEventListener(event, handleEvent);\n }\n } else {\n rootElement.on(`${event}.ember`, '.ember-view', function (evt) {\n let view = viewRegistry[this.id];\n let result = true;\n\n if (view) {\n result = view.handleEvent(eventName, (0, _jquery_event_deprecation.default)(evt));\n }\n\n return result;\n });\n\n rootElement.on(`${event}.ember`, '[data-ember-action]', evt => {\n let attributes = evt.currentTarget.attributes;\n let handledActions = [];\n\n evt = (0, _jquery_event_deprecation.default)(evt);\n\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes.item(i);\n let attrName = attr.name;\n\n if (attrName.lastIndexOf('data-ember-action-', 0) !== -1) {\n let action = _action_manager.default.registeredActions[attr.value];\n\n // We have to check for action here since in some cases, jQuery will trigger\n // an event on `removeChild` (i.e. focusout) after we've already torn down the\n // action handlers for the view.\n if (action && action.eventName === eventName && handledActions.indexOf(action) === -1) {\n action.handler(evt);\n // Action handlers can mutate state which in turn creates new attributes on the element.\n // This effect could cause the `data-ember-action` attribute to shift down and be invoked twice.\n // To avoid this, we keep track of which actions have been handled.\n handledActions.push(action);\n }\n }\n }\n });\n }\n },\n\n _getViewRegistry() {\n let owner = (0, _owner.getOwner)(this);\n let viewRegistry = owner && owner.lookup('-view-registry:main') || _fallbackViewRegistry.default;\n\n return viewRegistry;\n },\n\n destroy() {\n let rootElementSelector = (0, _metal.get)(this, 'rootElement');\n let rootElement;\n if (rootElementSelector.nodeType) {\n rootElement = rootElementSelector;\n } else {\n rootElement = document.querySelector(rootElementSelector);\n }\n\n if (!rootElement) {\n return;\n }\n\n if (_jquery.jQueryDisabled) {\n for (let event in this._eventHandlers) {\n rootElement.removeEventListener(event, this._eventHandlers[event]);\n }\n } else {\n (0, _jquery.default)(rootElementSelector).off('.ember', '**');\n }\n\n rootElement.classList.remove(ROOT_ELEMENT_CLASS);\n\n return this._super(...arguments);\n },\n\n toString() {\n return '(EventDispatcher)';\n }\n });\n});","enifed('@ember/-internals/views/lib/system/jquery', ['exports', '@ember/-internals/environment', '@ember/-internals/browser-environment'], function (exports, _environment, _browserEnvironment) {\n 'use strict';\n\n exports.__esModule = true;\n exports.jQueryDisabled = undefined;\n\n\n let jQuery;\n let jQueryDisabled = exports.jQueryDisabled = _environment.ENV._JQUERY_INTEGRATION === false;\n\n if (_browserEnvironment.hasDOM) {\n jQuery = _environment.context.imports.jQuery;\n\n if (!jQueryDisabled && jQuery) {\n if (jQuery.event.addProp) {\n jQuery.event.addProp('dataTransfer');\n } else {\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents\n ['dragstart', 'drag', 'dragenter', 'dragleave', 'dragover', 'drop', 'dragend'].forEach(eventName => {\n jQuery.event.fixHooks[eventName] = {\n props: ['dataTransfer']\n };\n });\n }\n } else {\n exports.jQueryDisabled = jQueryDisabled = true;\n }\n }\n\n exports.default = jQueryDisabled ? undefined : jQuery;\n});","enifed('@ember/-internals/views/lib/system/jquery_event_deprecation', ['exports', '@ember/debug', '@ember/-internals/environment', '@ember/-internals/utils', '@glimmer/env'], function (exports, _debug, _environment, _utils, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = addJQueryEventDeprecation;\n /* global Proxy */\n function addJQueryEventDeprecation(jqEvent) {\n if (!_env.DEBUG || !_utils.HAS_NATIVE_PROXY) {\n return jqEvent;\n }\n\n let boundFunctions = new Map();\n\n // wrap the jQuery event in a Proxy to add the deprecation message for originalEvent, according to RFC#294\n // we need a native Proxy here, so we can make sure that the internal use of originalEvent in jQuery itself does\n // not trigger a deprecation\n return new Proxy(jqEvent, {\n get(target, name) {\n switch (name) {\n case 'originalEvent':\n (0, _debug.deprecate)('Accessing jQuery.Event specific properties is deprecated. Either use the ember-jquery-legacy addon to normalize events to native events, or explicitly opt into jQuery integration using @ember/optional-features.', (EmberENV => {\n // this deprecation is intentionally checking `global.EmberENV` /\n // `global.ENV` so that we can ensure we _only_ deprecate in the\n // case where jQuery integration is enabled implicitly (e.g.\n // \"defaulted\" to enabled) as opposed to when the user explicitly\n // opts in to using jQuery\n if (typeof EmberENV !== 'object' || EmberENV === null) return false;\n\n return EmberENV._JQUERY_INTEGRATION === true;\n })(_environment.global.EmberENV || _environment.global.ENV), {\n id: 'ember-views.event-dispatcher.jquery-event',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_jquery-event'\n });\n return target[name];\n\n // provide an escape hatch for ember-jquery-legacy to access originalEvent without a deprecation\n case '__originalEvent':\n return target.originalEvent;\n\n default:\n if (typeof target[name] === 'function') {\n // cache functions for reuse\n if (!boundFunctions.has(name)) {\n // for jQuery.Event methods call them with `target` as the `this` context, so they will access\n // `originalEvent` from the original jQuery event, not our proxy, thus not trigger the deprecation\n boundFunctions.set(name, target[name].bind(target));\n }\n\n return boundFunctions.get(name);\n }\n // same for jQuery's getter functions for simple properties\n return target[name];\n }\n }\n });\n }\n});","enifed('@ember/-internals/views/lib/system/lookup_partial', ['exports', '@ember/debug', '@ember/error'], function (exports, _debug, _error) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = lookupPartial;\n exports.hasPartial = hasPartial;\n\n\n function parseUnderscoredName(templateName) {\n let nameParts = templateName.split('/');\n let lastPart = nameParts[nameParts.length - 1];\n\n nameParts[nameParts.length - 1] = `_${lastPart}`;\n\n return nameParts.join('/');\n }\n\n function lookupPartial(templateName, owner) {\n if (templateName == null) {\n return;\n }\n\n let template = templateFor(owner, parseUnderscoredName(templateName), templateName);\n\n (0, _debug.assert)(`Unable to find partial with name \"${templateName}\"`, !!template);\n\n return template;\n }\n\n function hasPartial(name, owner) {\n if (!owner) {\n throw new _error.default('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');\n }\n\n return owner.hasRegistration(`template:${parseUnderscoredName(name)}`) || owner.hasRegistration(`template:${name}`);\n }\n\n function templateFor(owner, underscored, name) {\n if (!name) {\n return;\n }\n (0, _debug.assert)(`templateNames are not allowed to contain periods: ${name}`, name.indexOf('.') === -1);\n\n if (!owner) {\n throw new _error.default('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');\n }\n\n return owner.lookup(`template:${underscored}`) || owner.lookup(`template:${name}`);\n }\n});","enifed('@ember/-internals/views/lib/system/utils', ['exports', '@ember/-internals/owner', '@ember/-internals/utils'], function (exports, _owner, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.elMatches = undefined;\n exports.isSimpleClick = isSimpleClick;\n exports.constructStyleDeprecationMessage = constructStyleDeprecationMessage;\n exports.getRootViews = getRootViews;\n exports.getViewId = getViewId;\n exports.getViewElement = getViewElement;\n exports.initViewElement = initViewElement;\n exports.setViewElement = setViewElement;\n exports.getChildViews = getChildViews;\n exports.initChildViews = initChildViews;\n exports.addChildView = addChildView;\n exports.collectChildViews = collectChildViews;\n exports.getViewBounds = getViewBounds;\n exports.getViewRange = getViewRange;\n exports.getViewClientRects = getViewClientRects;\n exports.getViewBoundingClientRect = getViewBoundingClientRect;\n exports.matches = matches;\n exports.contains = contains;\n\n\n /**\n @module ember\n */\n\n function isSimpleClick(event) {\n let modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey;\n let secondaryClick = event.which > 1; // IE9 may return undefined\n\n return !modifier && !secondaryClick;\n }\n /* globals Element */\n function constructStyleDeprecationMessage(affectedStyle) {\n return '' + 'Binding style attributes may introduce cross-site scripting vulnerabilities; ' + 'please ensure that values being bound are properly escaped. For more information, ' + 'including how to disable this warning, see ' + 'https://emberjs.com/deprecations/v1.x/#toc_binding-style-attributes. ' + 'Style affected: \"' + affectedStyle + '\"';\n }\n\n /**\n @private\n @method getRootViews\n @param {Object} owner\n */\n function getRootViews(owner) {\n let registry = owner.lookup('-view-registry:main');\n\n let rootViews = [];\n\n Object.keys(registry).forEach(id => {\n let view = registry[id];\n\n if (view.parentView === null) {\n rootViews.push(view);\n }\n });\n\n return rootViews;\n }\n\n /**\n @private\n @method getViewId\n @param {Ember.View} view\n */\n function getViewId(view) {\n if (view.tagName !== '' && view.elementId) {\n return view.elementId;\n } else {\n return (0, _utils.guidFor)(view);\n }\n }\n\n const VIEW_ELEMENT = (0, _utils.symbol)('VIEW_ELEMENT');\n\n /**\n @private\n @method getViewElement\n @param {Ember.View} view\n */\n function getViewElement(view) {\n return view[VIEW_ELEMENT];\n }\n\n function initViewElement(view) {\n view[VIEW_ELEMENT] = null;\n }\n\n function setViewElement(view, element) {\n return view[VIEW_ELEMENT] = element;\n }\n\n const CHILD_VIEW_IDS = new WeakMap();\n\n /**\n @private\n @method getChildViews\n @param {Ember.View} view\n */\n function getChildViews(view) {\n let owner = (0, _owner.getOwner)(view);\n let registry = owner.lookup('-view-registry:main');\n return collectChildViews(view, registry);\n }\n\n function initChildViews(view) {\n let childViews = new Set();\n CHILD_VIEW_IDS.set(view, childViews);\n return childViews;\n }\n\n function addChildView(parent, child) {\n let childViews = CHILD_VIEW_IDS.get(parent);\n if (childViews === undefined) {\n childViews = initChildViews(parent);\n }\n\n childViews.add(getViewId(child));\n }\n\n function collectChildViews(view, registry) {\n let views = [];\n let childViews = CHILD_VIEW_IDS.get(view);\n\n if (childViews !== undefined) {\n childViews.forEach(id => {\n let view = registry[id];\n if (view && !view.isDestroying && !view.isDestroyed) {\n views.push(view);\n }\n });\n }\n\n return views;\n }\n\n /**\n @private\n @method getViewBounds\n @param {Ember.View} view\n */\n function getViewBounds(view) {\n return view.renderer.getBounds(view);\n }\n\n /**\n @private\n @method getViewRange\n @param {Ember.View} view\n */\n function getViewRange(view) {\n let bounds = getViewBounds(view);\n\n let range = document.createRange();\n range.setStartBefore(bounds.firstNode);\n range.setEndAfter(bounds.lastNode);\n\n return range;\n }\n\n /**\n `getViewClientRects` provides information about the position of the border\n box edges of a view relative to the viewport.\n \n It is only intended to be used by development tools like the Ember Inspector\n and may not work on older browsers.\n \n @private\n @method getViewClientRects\n @param {Ember.View} view\n */\n function getViewClientRects(view) {\n let range = getViewRange(view);\n return range.getClientRects();\n }\n\n /**\n `getViewBoundingClientRect` provides information about the position of the\n bounding border box edges of a view relative to the viewport.\n \n It is only intended to be used by development tools like the Ember Inspector\n and may not work on older browsers.\n \n @private\n @method getViewBoundingClientRect\n @param {Ember.View} view\n */\n function getViewBoundingClientRect(view) {\n let range = getViewRange(view);\n return range.getBoundingClientRect();\n }\n\n /**\n Determines if the element matches the specified selector.\n \n @private\n @method matches\n @param {DOMElement} el\n @param {String} selector\n */\n const elMatches = exports.elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);\n\n function matches(el, selector) {\n return elMatches.call(el, selector);\n }\n\n function contains(a, b) {\n if (a.contains !== undefined) {\n return a.contains(b);\n }\n while (b = b.parentNode) {\n if (b === a) {\n return true;\n }\n }\n return false;\n }\n});","enifed('@ember/-internals/views/lib/utils/lookup-component', ['exports', '@ember/canary-features'], function (exports, _canaryFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = lookupComponent;\n\n\n function lookupModuleUnificationComponentPair(componentLookup, owner, name, options) {\n let localComponent = componentLookup.componentFor(name, owner, options);\n let localLayout = componentLookup.layoutFor(name, owner, options);\n\n let globalComponent = componentLookup.componentFor(name, owner);\n let globalLayout = componentLookup.layoutFor(name, owner);\n\n // TODO: we shouldn't have to recheck fallback, we should have a lookup that doesn't fallback\n if (localComponent !== undefined && globalComponent !== undefined && globalComponent.class === localComponent.class) {\n localComponent = undefined;\n }\n if (localLayout !== undefined && globalLayout !== undefined && localLayout.referrer.moduleName === globalLayout.referrer.moduleName) {\n localLayout = undefined;\n }\n\n if (localLayout !== undefined || localComponent !== undefined) {\n return { layout: localLayout, component: localComponent };\n }\n\n return { layout: globalLayout, component: globalComponent };\n }\n\n function lookupComponentPair(componentLookup, owner, name, options) {\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n return lookupModuleUnificationComponentPair(componentLookup, owner, name, options);\n }\n\n let component = componentLookup.componentFor(name, owner, options);\n let layout = componentLookup.layoutFor(name, owner, options);\n\n let result = { layout, component };\n\n return result;\n }\n\n function lookupComponent(owner, name, options) {\n let componentLookup = owner.lookup('component-lookup:main');\n\n if (options && (options.source || options.namespace)) {\n let localResult = lookupComponentPair(componentLookup, owner, name, options);\n\n if (localResult.component || localResult.layout) {\n return localResult;\n }\n }\n\n return lookupComponentPair(componentLookup, owner, name);\n }\n});","enifed('@ember/-internals/views/lib/views/core_view', ['exports', '@ember/-internals/runtime', '@ember/-internals/views/lib/system/utils', '@ember/-internals/views/lib/views/states'], function (exports, _runtime, _utils, _states) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n `Ember.CoreView` is an abstract class that exists to give view-like behavior\n to both Ember's main view class `Component` and other classes that don't need\n the full functionality of `Component`.\n \n Unless you have specific needs for `CoreView`, you will use `Component`\n in your applications.\n \n @class CoreView\n @namespace Ember\n @extends EmberObject\n @deprecated Use `Component` instead.\n @uses Evented\n @uses Ember.ActionHandler\n @private\n */\n const CoreView = _runtime.FrameworkObject.extend(_runtime.Evented, _runtime.ActionHandler, {\n isView: true,\n\n _states: (0, _states.cloneStates)(_states.states),\n\n init() {\n this._super(...arguments);\n this._state = 'preRender';\n this._currentState = this._states.preRender;\n\n (0, _utils.initViewElement)(this);\n\n if (!this.renderer) {\n throw new Error(`Cannot instantiate a component without a renderer. Please ensure that you are creating ${this} with a proper container/registry.`);\n }\n },\n\n /**\n If the view is currently inserted into the DOM of a parent view, this\n property will point to the parent of the view.\n @property parentView\n @type Ember.View\n @default null\n @private\n */\n parentView: null,\n\n instrumentDetails(hash) {\n hash.object = this.toString();\n hash.containerKey = this._debugContainerKey;\n hash.view = this;\n return hash;\n },\n\n /**\n Override the default event firing from `Evented` to\n also call methods with the given name.\n @method trigger\n @param name {String}\n @private\n */\n trigger(name, ...args) {\n this._super(...arguments);\n let method = this[name];\n if (typeof method === 'function') {\n return method.apply(this, args);\n }\n },\n\n has(name) {\n return typeof this[name] === 'function' || this._super(name);\n }\n });\n\n CoreView.reopenClass({\n isViewFactory: true\n });\n\n exports.default = CoreView;\n});","enifed('@ember/-internals/views/lib/views/states', ['exports', '@ember/polyfills', '@ember/-internals/views/lib/views/states/default', '@ember/-internals/views/lib/views/states/pre_render', '@ember/-internals/views/lib/views/states/has_element', '@ember/-internals/views/lib/views/states/in_dom', '@ember/-internals/views/lib/views/states/destroying'], function (exports, _polyfills, _default2, _pre_render, _has_element, _in_dom, _destroying) {\n 'use strict';\n\n exports.__esModule = true;\n exports.states = undefined;\n exports.cloneStates = cloneStates;\n function cloneStates(from) {\n let into = {};\n\n into._default = {};\n into.preRender = Object.create(into._default);\n into.destroying = Object.create(into._default);\n into.hasElement = Object.create(into._default);\n into.inDOM = Object.create(into.hasElement);\n\n for (let stateName in from) {\n if (!from.hasOwnProperty(stateName)) {\n continue;\n }\n (0, _polyfills.assign)(into[stateName], from[stateName]);\n }\n\n return into;\n }\n\n /*\n Describe how the specified actions should behave in the various\n states that a view can exist in. Possible states:\n \n * preRender: when a view is first instantiated, and after its\n element was destroyed, it is in the preRender state\n * hasElement: the DOM representation of the view is created,\n and is ready to be inserted\n * inDOM: once a view has been inserted into the DOM it is in\n the inDOM state. A view spends the vast majority of its\n existence in this state.\n * destroyed: once a view has been destroyed (using the destroy\n method), it is in this state. No further actions can be invoked\n on a destroyed view.\n */\n let states = exports.states = {\n _default: _default2.default,\n preRender: _pre_render.default,\n inDOM: _in_dom.default,\n hasElement: _has_element.default,\n destroying: _destroying.default\n };\n});","enifed(\"@ember/-internals/views/lib/views/states/default\", [\"exports\", \"@ember/error\"], function (exports, _error) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = {\n // appendChild is only legal while rendering the buffer.\n appendChild() {\n throw new _error.default(\"You can't use appendChild outside of the rendering process\");\n },\n\n // Handle events from `Ember.EventDispatcher`\n handleEvent() {\n return true; // continue event propagation\n },\n\n rerender() {},\n\n destroy() {}\n };\n});","enifed('@ember/-internals/views/lib/views/states/destroying', ['exports', '@ember/polyfills', '@ember/error', '@ember/-internals/views/lib/views/states/default'], function (exports, _polyfills, _error, _default2) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const destroying = Object.create(_default2.default);\n\n (0, _polyfills.assign)(destroying, {\n appendChild() {\n throw new _error.default(\"You can't call appendChild on a view being destroyed\");\n },\n rerender() {\n throw new _error.default(\"You can't call rerender on a view being destroyed\");\n }\n });\n\n exports.default = destroying;\n});","enifed('@ember/-internals/views/lib/views/states/has_element', ['exports', '@ember/polyfills', '@ember/-internals/views/lib/views/states/default', '@ember/runloop', '@ember/instrumentation'], function (exports, _polyfills, _default2, _runloop, _instrumentation) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const hasElement = Object.create(_default2.default);\n\n (0, _polyfills.assign)(hasElement, {\n rerender(view) {\n view.renderer.rerender(view);\n },\n\n destroy(view) {\n view.renderer.remove(view);\n },\n\n // Handle events from `Ember.EventDispatcher`\n handleEvent(view, eventName, event) {\n if (view.has(eventName)) {\n // Handler should be able to re-dispatch events, so we don't\n // preventDefault or stopPropagation.\n return (0, _instrumentation.flaggedInstrument)(`interaction.${eventName}`, { event, view }, () => {\n return (0, _runloop.join)(view, view.trigger, eventName, event);\n });\n } else {\n return true; // continue event propagation\n }\n }\n });\n\n exports.default = hasElement;\n});","enifed('@ember/-internals/views/lib/views/states/in_dom', ['exports', '@ember/polyfills', '@ember/-internals/metal', '@ember/error', '@glimmer/env', '@ember/-internals/views/lib/views/states/has_element'], function (exports, _polyfills, _metal, _error, _env, _has_element) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const inDOM = Object.create(_has_element.default);\n\n (0, _polyfills.assign)(inDOM, {\n enter(view) {\n // Register the view for event handling. This hash is used by\n // Ember.EventDispatcher to dispatch incoming events.\n view.renderer.register(view);\n\n if (_env.DEBUG) {\n (0, _metal.addObserver)(view, 'elementId', () => {\n throw new _error.default(\"Changing a view's elementId after creation is not allowed\");\n });\n }\n },\n\n exit(view) {\n view.renderer.unregister(view);\n }\n });\n\n exports.default = inDOM;\n});","enifed('@ember/-internals/views/lib/views/states/pre_render', ['exports', '@ember/-internals/views/lib/views/states/default'], function (exports, _default2) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = Object.create(_default2.default);\n});","enifed('@ember/application/globals-resolver', ['exports', '@ember/-internals/utils', '@ember/-internals/metal', '@ember/debug', '@ember/string', '@ember/-internals/runtime', '@ember/application/lib/validate-type', '@ember/-internals/glimmer', '@glimmer/env'], function (exports, _utils, _metal, _debug, _string, _runtime, _validateType, _glimmer, _env) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n The DefaultResolver defines the default lookup rules to resolve\n container lookups before consulting the container for registered\n items:\n \n * templates are looked up on `Ember.TEMPLATES`\n * other names are looked up on the application after converting\n the name. For example, `controller:post` looks up\n `App.PostController` by default.\n * there are some nuances (see examples below)\n \n ### How Resolving Works\n \n The container calls this object's `resolve` method with the\n `fullName` argument.\n \n It first parses the fullName into an object using `parseName`.\n \n Then it checks for the presence of a type-specific instance\n method of the form `resolve[Type]` and calls it if it exists.\n For example if it was resolving 'template:post', it would call\n the `resolveTemplate` method.\n \n Its last resort is to call the `resolveOther` method.\n \n The methods of this object are designed to be easy to override\n in a subclass. For example, you could enhance how a template\n is resolved like so:\n \n ```app/app.js\n import Application from '@ember/application';\n import GlobalsResolver from '@ember/application/globals-resolver';\n \n App = Application.create({\n Resolver: GlobalsResolver.extend({\n resolveTemplate(parsedName) {\n let resolvedTemplate = this._super(parsedName);\n if (resolvedTemplate) { return resolvedTemplate; }\n \n return Ember.TEMPLATES['not_found'];\n }\n })\n });\n ```\n \n Some examples of how names are resolved:\n \n ```text\n 'template:post' //=> Ember.TEMPLATES['post']\n 'template:posts/byline' //=> Ember.TEMPLATES['posts/byline']\n 'template:posts.byline' //=> Ember.TEMPLATES['posts/byline']\n 'template:blogPost' //=> Ember.TEMPLATES['blog-post']\n 'controller:post' //=> App.PostController\n 'controller:posts.index' //=> App.PostsIndexController\n 'controller:blog/post' //=> Blog.PostController\n 'controller:basic' //=> Controller\n 'route:post' //=> App.PostRoute\n 'route:posts.index' //=> App.PostsIndexRoute\n 'route:blog/post' //=> Blog.PostRoute\n 'route:basic' //=> Route\n 'foo:post' //=> App.PostFoo\n 'model:post' //=> App.Post\n ```\n \n @class GlobalsResolver\n @extends EmberObject\n @public\n */\n\n /**\n @module @ember/application\n */\n\n class DefaultResolver extends _runtime.Object {\n static create(props) {\n // DO NOT REMOVE even though this doesn't do anything\n // This is required for a FireFox 60+ JIT bug with our tests.\n // without it, create(props) in our tests would lose props on a deopt.\n return super.create(props);\n }\n\n /**\n This will be set to the Application instance when it is\n created.\n @property namespace\n @public\n */\n\n init() {\n this._parseNameCache = (0, _utils.dictionary)(null);\n }\n\n normalize(fullName) {\n let [type, name] = fullName.split(':');\n\n (0, _debug.assert)('Tried to normalize a container name without a colon (:) in it. ' + 'You probably tried to lookup a name that did not contain a type, ' + 'a colon, and a name. A proper lookup name would be `view:post`.', fullName.split(':').length === 2);\n\n if (type !== 'template') {\n let result = name.replace(/(\\.|_|-)./g, m => m.charAt(1).toUpperCase());\n\n return `${type}:${result}`;\n } else {\n return fullName;\n }\n }\n\n /**\n This method is called via the container's resolver method.\n It parses the provided `fullName` and then looks up and\n returns the appropriate template or class.\n @method resolve\n @param {String} fullName the lookup string\n @return {Object} the resolved factory\n @public\n */\n resolve(fullName) {\n let parsedName = this.parseName(fullName);\n let resolveMethodName = parsedName.resolveMethodName;\n let resolved;\n\n if (this[resolveMethodName]) {\n resolved = this[resolveMethodName](parsedName);\n }\n\n resolved = resolved || this.resolveOther(parsedName);\n\n if (_env.DEBUG) {\n if (parsedName.root && parsedName.root.LOG_RESOLVER) {\n this._logLookup(resolved, parsedName);\n }\n }\n\n if (resolved) {\n (0, _validateType.default)(resolved, parsedName);\n }\n\n return resolved;\n }\n\n /**\n Convert the string name of the form 'type:name' to\n a Javascript object with the parsed aspects of the name\n broken out.\n @param {String} fullName the lookup string\n @method parseName\n @protected\n */\n\n parseName(fullName) {\n return this._parseNameCache[fullName] || (this._parseNameCache[fullName] = this._parseName(fullName));\n }\n\n _parseName(fullName) {\n let [type, fullNameWithoutType] = fullName.split(':');\n\n let name = fullNameWithoutType;\n let namespace = (0, _metal.get)(this, 'namespace');\n let root = namespace;\n let lastSlashIndex = name.lastIndexOf('/');\n let dirname = lastSlashIndex !== -1 ? name.slice(0, lastSlashIndex) : null;\n\n if (type !== 'template' && lastSlashIndex !== -1) {\n let parts = name.split('/');\n name = parts[parts.length - 1];\n let namespaceName = (0, _string.capitalize)(parts.slice(0, -1).join('.'));\n root = (0, _metal.findNamespace)(namespaceName);\n\n (0, _debug.assert)(`You are looking for a ${name} ${type} in the ${namespaceName} namespace, but the namespace could not be found`, root);\n }\n\n let resolveMethodName = fullNameWithoutType === 'main' ? 'Main' : (0, _string.classify)(type);\n\n if (!(name && type)) {\n throw new TypeError(`Invalid fullName: \\`${fullName}\\`, must be of the form \\`type:name\\` `);\n }\n\n return {\n fullName,\n type,\n fullNameWithoutType,\n dirname,\n name,\n root,\n resolveMethodName: `resolve${resolveMethodName}`\n };\n }\n\n /**\n Returns a human-readable description for a fullName. Used by the\n Application namespace in assertions to describe the\n precise name of the class that Ember is looking for, rather than\n container keys.\n @param {String} fullName the lookup string\n @method lookupDescription\n @protected\n */\n lookupDescription(fullName) {\n let parsedName = this.parseName(fullName);\n let description;\n\n if (parsedName.type === 'template') {\n return `template at ${parsedName.fullNameWithoutType.replace(/\\./g, '/')}`;\n }\n\n description = `${parsedName.root}.${(0, _string.classify)(parsedName.name).replace(/\\./g, '')}`;\n\n if (parsedName.type !== 'model') {\n description += (0, _string.classify)(parsedName.type);\n }\n\n return description;\n }\n\n makeToString(factory) {\n return factory.toString();\n }\n\n /**\n Given a parseName object (output from `parseName`), apply\n the conventions expected by `Router`\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method useRouterNaming\n @protected\n */\n useRouterNaming(parsedName) {\n if (parsedName.name === 'basic') {\n parsedName.name = '';\n } else {\n parsedName.name = parsedName.name.replace(/\\./g, '_');\n }\n }\n /**\n Look up the template in Ember.TEMPLATES\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveTemplate\n @protected\n */\n resolveTemplate(parsedName) {\n let templateName = parsedName.fullNameWithoutType.replace(/\\./g, '/');\n\n return (0, _glimmer.getTemplate)(templateName) || (0, _glimmer.getTemplate)((0, _string.decamelize)(templateName));\n }\n\n /**\n Lookup the view using `resolveOther`\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveView\n @protected\n */\n resolveView(parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n }\n\n /**\n Lookup the controller using `resolveOther`\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveController\n @protected\n */\n resolveController(parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n }\n /**\n Lookup the route using `resolveOther`\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveRoute\n @protected\n */\n resolveRoute(parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n }\n\n /**\n Lookup the model on the Application namespace\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveModel\n @protected\n */\n resolveModel(parsedName) {\n let className = (0, _string.classify)(parsedName.name);\n let factory = (0, _metal.get)(parsedName.root, className);\n\n return factory;\n }\n /**\n Look up the specified object (from parsedName) on the appropriate\n namespace (usually on the Application)\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveHelper\n @protected\n */\n resolveHelper(parsedName) {\n return this.resolveOther(parsedName);\n }\n /**\n Look up the specified object (from parsedName) on the appropriate\n namespace (usually on the Application)\n @param {Object} parsedName a parseName object with the parsed\n fullName lookup string\n @method resolveOther\n @protected\n */\n resolveOther(parsedName) {\n let className = (0, _string.classify)(parsedName.name) + (0, _string.classify)(parsedName.type);\n let factory = (0, _metal.get)(parsedName.root, className);\n return factory;\n }\n\n resolveMain(parsedName) {\n let className = (0, _string.classify)(parsedName.type);\n return (0, _metal.get)(parsedName.root, className);\n }\n\n /**\n Used to iterate all items of a given type.\n @method knownForType\n @param {String} type the type to search for\n @private\n */\n knownForType(type) {\n let namespace = (0, _metal.get)(this, 'namespace');\n let suffix = (0, _string.classify)(type);\n let typeRegexp = new RegExp(`${suffix}$`);\n\n let known = (0, _utils.dictionary)(null);\n let knownKeys = Object.keys(namespace);\n for (let index = 0; index < knownKeys.length; index++) {\n let name = knownKeys[index];\n\n if (typeRegexp.test(name)) {\n let containerName = this.translateToContainerFullname(type, name);\n\n known[containerName] = true;\n }\n }\n\n return known;\n }\n\n /**\n Converts provided name from the backing namespace into a container lookup name.\n Examples:\n * App.FooBarHelper -> helper:foo-bar\n * App.THelper -> helper:t\n @method translateToContainerFullname\n @param {String} type\n @param {String} name\n @private\n */\n translateToContainerFullname(type, name) {\n let suffix = (0, _string.classify)(type);\n let namePrefix = name.slice(0, suffix.length * -1);\n let dasherizedName = (0, _string.dasherize)(namePrefix);\n\n return `${type}:${dasherizedName}`;\n }\n }\n\n exports.default = DefaultResolver;\n\n\n if (_env.DEBUG) {\n /**\n @method _logLookup\n @param {Boolean} found\n @param {Object} parsedName\n @private\n */\n DefaultResolver.prototype._logLookup = function (found, parsedName) {\n let symbol = found ? '[✓]' : '[ ]';\n\n let padding;\n if (parsedName.fullName.length > 60) {\n padding = '.';\n } else {\n padding = new Array(60 - parsedName.fullName.length).join('.');\n }\n\n (0, _debug.info)(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));\n };\n }\n});","enifed('@ember/application/index', ['exports', '@ember/-internals/owner', '@ember/application/lib/lazy_load', '@ember/application/lib/application'], function (exports, _owner, _lazy_load, _application) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'getOwner', {\n enumerable: true,\n get: function () {\n return _owner.getOwner;\n }\n });\n Object.defineProperty(exports, 'setOwner', {\n enumerable: true,\n get: function () {\n return _owner.setOwner;\n }\n });\n Object.defineProperty(exports, 'onLoad', {\n enumerable: true,\n get: function () {\n return _lazy_load.onLoad;\n }\n });\n Object.defineProperty(exports, 'runLoadHooks', {\n enumerable: true,\n get: function () {\n return _lazy_load.runLoadHooks;\n }\n });\n Object.defineProperty(exports, '_loaded', {\n enumerable: true,\n get: function () {\n return _lazy_load._loaded;\n }\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _application.default;\n }\n });\n});","enifed('@ember/application/instance', ['exports', '@ember/polyfills', '@ember/-internals/metal', '@ember/-internals/browser-environment', '@ember/-internals/views', '@ember/engine/instance', '@ember/-internals/glimmer'], function (exports, _polyfills, _metal, _browserEnvironment, _views, _instance, _glimmer) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n The `ApplicationInstance` encapsulates all of the stateful aspects of a\n running `Application`.\n \n At a high-level, we break application boot into two distinct phases:\n \n * Definition time, where all of the classes, templates, and other\n dependencies are loaded (typically in the browser).\n * Run time, where we begin executing the application once everything\n has loaded.\n \n Definition time can be expensive and only needs to happen once since it is\n an idempotent operation. For example, between test runs and FastBoot\n requests, the application stays the same. It is only the state that we want\n to reset.\n \n That state is what the `ApplicationInstance` manages: it is responsible for\n creating the container that contains all application state, and disposing of\n it once the particular test run or FastBoot request has finished.\n \n @public\n @class ApplicationInstance\n @extends EngineInstance\n */\n\n /**\n @module @ember/application\n */\n\n const ApplicationInstance = _instance.default.extend({\n /**\n The `Application` for which this is an instance.\n @property {Application} application\n @private\n */\n application: null,\n\n /**\n The DOM events for which the event dispatcher should listen.\n By default, the application's `Ember.EventDispatcher` listens\n for a set of standard DOM events, such as `mousedown` and\n `keyup`, and delegates them to your application's `Ember.View`\n instances.\n @private\n @property {Object} customEvents\n */\n customEvents: null,\n\n /**\n The root DOM element of the Application as an element or a\n [jQuery-compatible selector\n string](http://api.jquery.com/category/selectors/).\n @private\n @property {String|DOMElement} rootElement\n */\n rootElement: null,\n\n init() {\n this._super(...arguments);\n\n this.application._watchInstance(this);\n\n // Register this instance in the per-instance registry.\n //\n // Why do we need to register the instance in the first place?\n // Because we need a good way for the root route (a.k.a ApplicationRoute)\n // to notify us when it has created the root-most view. That view is then\n // appended to the rootElement, in the case of apps, to the fixture harness\n // in tests, or rendered to a string in the case of FastBoot.\n this.register('-application-instance:main', this, { instantiate: false });\n },\n\n /**\n Overrides the base `EngineInstance._bootSync` method with concerns relevant\n to booting application (instead of engine) instances.\n This method should only contain synchronous boot concerns. Asynchronous\n boot concerns should eventually be moved to the `boot` method, which\n returns a promise.\n Until all boot code has been made asynchronous, we need to continue to\n expose this method for use *internally* in places where we need to boot an\n instance synchronously.\n @private\n */\n _bootSync(options) {\n if (this._booted) {\n return this;\n }\n\n options = new BootOptions(options);\n\n this.setupRegistry(options);\n\n if (options.rootElement) {\n this.rootElement = options.rootElement;\n } else {\n this.rootElement = this.application.rootElement;\n }\n\n if (options.location) {\n let router = (0, _metal.get)(this, 'router');\n (0, _metal.set)(router, 'location', options.location);\n }\n\n this.application.runInstanceInitializers(this);\n\n if (options.isInteractive) {\n this.setupEventDispatcher();\n }\n\n this._booted = true;\n\n return this;\n },\n\n setupRegistry(options) {\n this.constructor.setupRegistry(this.__registry__, options);\n },\n\n router: (0, _metal.computed)(function () {\n return this.lookup('router:main');\n }).readOnly(),\n\n /**\n This hook is called by the root-most Route (a.k.a. the ApplicationRoute)\n when it has finished creating the root View. By default, we simply take the\n view and append it to the `rootElement` specified on the Application.\n In cases like FastBoot and testing, we can override this hook and implement\n custom behavior, such as serializing to a string and sending over an HTTP\n socket rather than appending to DOM.\n @param view {Ember.View} the root-most view\n @private\n */\n didCreateRootView(view) {\n view.appendTo(this.rootElement);\n },\n\n /**\n Tells the router to start routing. The router will ask the location for the\n current URL of the page to determine the initial URL to start routing to.\n To start the app at a specific URL, call `handleURL` instead.\n @private\n */\n startRouting() {\n let router = (0, _metal.get)(this, 'router');\n router.startRouting();\n this._didSetupRouter = true;\n },\n\n /**\n @private\n Sets up the router, initializing the child router and configuring the\n location before routing begins.\n Because setup should only occur once, multiple calls to `setupRouter`\n beyond the first call have no effect.\n */\n setupRouter() {\n if (this._didSetupRouter) {\n return;\n }\n this._didSetupRouter = true;\n\n let router = (0, _metal.get)(this, 'router');\n router.setupRouter();\n },\n\n /**\n Directs the router to route to a particular URL. This is useful in tests,\n for example, to tell the app to start at a particular URL.\n @param url {String} the URL the router should route to\n @private\n */\n handleURL(url) {\n let router = (0, _metal.get)(this, 'router');\n\n this.setupRouter();\n return router.handleURL(url);\n },\n\n /**\n @private\n */\n setupEventDispatcher() {\n let dispatcher = this.lookup('event_dispatcher:main');\n let applicationCustomEvents = (0, _metal.get)(this.application, 'customEvents');\n let instanceCustomEvents = (0, _metal.get)(this, 'customEvents');\n\n let customEvents = (0, _polyfills.assign)({}, applicationCustomEvents, instanceCustomEvents);\n dispatcher.setup(customEvents, this.rootElement);\n\n return dispatcher;\n },\n\n /**\n Returns the current URL of the app instance. This is useful when your\n app does not update the browsers URL bar (i.e. it uses the `'none'`\n location adapter).\n @public\n @return {String} the current URL\n */\n getURL() {\n return (0, _metal.get)(this, 'router.url');\n },\n\n // `instance.visit(url)` should eventually replace `instance.handleURL()`;\n // the test helpers can probably be switched to use this implementation too\n\n /**\n Navigate the instance to a particular URL. This is useful in tests, for\n example, or to tell the app to start at a particular URL. This method\n returns a promise that resolves with the app instance when the transition\n is complete, or rejects if the transion was aborted due to an error.\n @public\n @param url {String} the destination URL\n @return {Promise}\n */\n visit(url) {\n this.setupRouter();\n\n let bootOptions = this.__container__.lookup('-environment:main');\n\n let router = (0, _metal.get)(this, 'router');\n\n let handleTransitionResolve = () => {\n if (!bootOptions.options.shouldRender) {\n // No rendering is needed, and routing has completed, simply return.\n return this;\n } else {\n // Ensure that the visit promise resolves when all rendering has completed\n return (0, _glimmer.renderSettled)().then(() => this);\n }\n };\n\n let handleTransitionReject = error => {\n if (error.error) {\n throw error.error;\n } else if (error.name === 'TransitionAborted' && router._routerMicrolib.activeTransition) {\n return router._routerMicrolib.activeTransition.then(handleTransitionResolve, handleTransitionReject);\n } else if (error.name === 'TransitionAborted') {\n throw new Error(error.message);\n } else {\n throw error;\n }\n };\n\n let location = (0, _metal.get)(router, 'location');\n\n // Keeps the location adapter's internal URL in-sync\n location.setURL(url);\n\n // getURL returns the set url with the rootURL stripped off\n return router.handleURL(location.getURL()).then(handleTransitionResolve, handleTransitionReject);\n },\n\n willDestroy() {\n this._super(...arguments);\n this.application._unwatchInstance(this);\n }\n });\n\n ApplicationInstance.reopenClass({\n /**\n @private\n @method setupRegistry\n @param {Registry} registry\n @param {BootOptions} options\n */\n setupRegistry(registry, options = {}) {\n if (!options.toEnvironment) {\n options = new BootOptions(options);\n }\n\n registry.register('-environment:main', options.toEnvironment(), {\n instantiate: false\n });\n registry.register('service:-document', options.document, {\n instantiate: false\n });\n\n this._super(registry, options);\n }\n });\n\n /**\n A list of boot-time configuration options for customizing the behavior of\n an `ApplicationInstance`.\n \n This is an interface class that exists purely to document the available\n options; you do not need to construct it manually. Simply pass a regular\n JavaScript object containing the desired options into methods that require\n one of these options object:\n \n ```javascript\n MyApp.visit(\"/\", { location: \"none\", rootElement: \"#container\" });\n ```\n \n Not all combinations of the supported options are valid. See the documentation\n on `Application#visit` for the supported configurations.\n \n Internal, experimental or otherwise unstable flags are marked as private.\n \n @class BootOptions\n @namespace ApplicationInstance\n @public\n */\n class BootOptions {\n constructor(options = {}) {\n /**\n Provide a specific instance of jQuery. This is useful in conjunction with\n the `document` option, as it allows you to use a copy of `jQuery` that is\n appropriately bound to the foreign `document` (e.g. a jsdom).\n This is highly experimental and support very incomplete at the moment.\n @property jQuery\n @type Object\n @default auto-detected\n @private\n */\n this.jQuery = _views.jQuery; // This default is overridable below\n\n /**\n Interactive mode: whether we need to set up event delegation and invoke\n lifecycle callbacks on Components.\n @property isInteractive\n @type boolean\n @default auto-detected\n @private\n */\n this.isInteractive = _browserEnvironment.hasDOM; // This default is overridable below\n\n /**\n @property _renderMode\n @type string\n @default false\n @private\n */\n this._renderMode = options._renderMode;\n\n /**\n Run in a full browser environment.\n When this flag is set to `true`, it will disable most browser-specific\n and interactive features. Specifically:\n * It does not use `jQuery` to append the root view; the `rootElement`\n (either specified as a subsequent option or on the application itself)\n must already be an `Element` in the given `document` (as opposed to a\n string selector).\n * It does not set up an `EventDispatcher`.\n * It does not run any `Component` lifecycle hooks (such as `didInsertElement`).\n * It sets the `location` option to `\"none\"`. (If you would like to use\n the location adapter specified in the app's router instead, you can also\n specify `{ location: null }` to specifically opt-out.)\n @property isBrowser\n @type boolean\n @default auto-detected\n @public\n */\n if (options.isBrowser !== undefined) {\n this.isBrowser = !!options.isBrowser;\n } else {\n this.isBrowser = _browserEnvironment.hasDOM;\n }\n\n if (!this.isBrowser) {\n this.jQuery = null;\n this.isInteractive = false;\n this.location = 'none';\n }\n\n /**\n Disable rendering completely.\n When this flag is set to `true`, it will disable the entire rendering\n pipeline. Essentially, this puts the app into \"routing-only\" mode. No\n templates will be rendered, and no Components will be created.\n @property shouldRender\n @type boolean\n @default true\n @public\n */\n if (options.shouldRender !== undefined) {\n this.shouldRender = !!options.shouldRender;\n } else {\n this.shouldRender = true;\n }\n\n if (!this.shouldRender) {\n this.jQuery = null;\n this.isInteractive = false;\n }\n\n /**\n If present, render into the given `Document` object instead of the\n global `window.document` object.\n In practice, this is only useful in non-browser environment or in\n non-interactive mode, because Ember's `jQuery` dependency is\n implicitly bound to the current document, causing event delegation\n to not work properly when the app is rendered into a foreign\n document object (such as an iframe's `contentDocument`).\n In non-browser mode, this could be a \"`Document`-like\" object as\n Ember only interact with a small subset of the DOM API in non-\n interactive mode. While the exact requirements have not yet been\n formalized, the `SimpleDOM` library's implementation is known to\n work.\n @property document\n @type Document\n @default the global `document` object\n @public\n */\n if (options.document) {\n this.document = options.document;\n } else {\n this.document = typeof document !== 'undefined' ? document : null;\n }\n\n /**\n If present, overrides the application's `rootElement` property on\n the instance. This is useful for testing environment, where you\n might want to append the root view to a fixture area.\n In non-browser mode, because Ember does not have access to jQuery,\n this options must be specified as a DOM `Element` object instead of\n a selector string.\n See the documentation on `Application`'s `rootElement` for\n details.\n @property rootElement\n @type String|Element\n @default null\n @public\n */\n if (options.rootElement) {\n this.rootElement = options.rootElement;\n }\n\n // Set these options last to give the user a chance to override the\n // defaults from the \"combo\" options like `isBrowser` (although in\n // practice, the resulting combination is probably invalid)\n\n /**\n If present, overrides the router's `location` property with this\n value. This is useful for environments where trying to modify the\n URL would be inappropriate.\n @property location\n @type string\n @default null\n @public\n */\n if (options.location !== undefined) {\n this.location = options.location;\n }\n\n if (options.jQuery !== undefined) {\n this.jQuery = options.jQuery;\n }\n\n if (options.isInteractive !== undefined) {\n this.isInteractive = !!options.isInteractive;\n }\n }\n\n toEnvironment() {\n // Do we really want to assign all of this!?\n let env = (0, _polyfills.assign)({}, _browserEnvironment);\n // For compatibility with existing code\n env.hasDOM = this.isBrowser;\n env.isInteractive = this.isInteractive;\n env._renderMode = this._renderMode;\n env.options = this;\n return env;\n }\n }\n\n exports.default = ApplicationInstance;\n});","enifed('@ember/application/lib/application', ['exports', '@ember/-internals/utils', '@ember/-internals/environment', '@ember/-internals/browser-environment', '@ember/debug', '@glimmer/env', '@ember/runloop', '@ember/-internals/metal', '@ember/application/lib/lazy_load', '@ember/-internals/runtime', '@ember/-internals/views', '@ember/-internals/routing', '@ember/application/instance', '@ember/engine', '@ember/-internals/container', '@ember/-internals/glimmer'], function (exports, _utils, _environment, _browserEnvironment, _debug, _env, _runloop, _metal, _lazy_load, _runtime, _views, _routing, _instance, _engine, _container, _glimmer) {\n 'use strict';\n\n exports.__esModule = true;\n /**\n @module @ember/application\n */\n\n let librariesRegistered = false;\n\n /**\n An instance of `Application` is the starting point for every Ember\n application. It helps to instantiate, initialize and coordinate the many\n objects that make up your app.\n \n Each Ember app has one and only one `Application` object. In fact, the\n very first thing you should do in your application is create the instance:\n \n ```javascript\n import Application from '@ember/application';\n \n window.App = Application.create();\n ```\n \n Typically, the application object is the only global variable. All other\n classes in your app should be properties on the `Application` instance,\n which highlights its first role: a global namespace.\n \n For example, if you define a view class, it might look like this:\n \n ```javascript\n import Application from '@ember/application';\n \n App.MyView = Ember.View.extend();\n ```\n \n By default, calling `Application.create()` will automatically initialize\n your application by calling the `Application.initialize()` method. If\n you need to delay initialization, you can call your app's `deferReadiness()`\n method. When you are ready for your app to be initialized, call its\n `advanceReadiness()` method.\n \n You can define a `ready` method on the `Application` instance, which\n will be run by Ember when the application is initialized.\n \n Because `Application` inherits from `Ember.Namespace`, any classes\n you create will have useful string representations when calling `toString()`.\n See the `Ember.Namespace` documentation for more information.\n \n While you can think of your `Application` as a container that holds the\n other classes in your application, there are several other responsibilities\n going on under-the-hood that you may want to understand.\n \n ### Event Delegation\n \n Ember uses a technique called _event delegation_. This allows the framework\n to set up a global, shared event listener instead of requiring each view to\n do it manually. For example, instead of each view registering its own\n `mousedown` listener on its associated element, Ember sets up a `mousedown`\n listener on the `body`.\n \n If a `mousedown` event occurs, Ember will look at the target of the event and\n start walking up the DOM node tree, finding corresponding views and invoking\n their `mouseDown` method as it goes.\n \n `Application` has a number of default events that it listens for, as\n well as a mapping from lowercase events to camel-cased view method names. For\n example, the `keypress` event causes the `keyPress` method on the view to be\n called, the `dblclick` event causes `doubleClick` to be called, and so on.\n \n If there is a bubbling browser event that Ember does not listen for by\n default, you can specify custom events and their corresponding view method\n names by setting the application's `customEvents` property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n customEvents: {\n // add support for the paste event\n paste: 'paste'\n }\n });\n ```\n \n To prevent Ember from setting up a listener for a default event,\n specify the event name with a `null` value in the `customEvents`\n property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n customEvents: {\n // prevent listeners for mouseenter/mouseleave events\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n \n By default, the application sets up these event listeners on the document\n body. However, in cases where you are embedding an Ember application inside\n an existing page, you may want it to set up the listeners on an element\n inside the body.\n \n For example, if only events inside a DOM element with the ID of `ember-app`\n should be delegated, set your application's `rootElement` property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n rootElement: '#ember-app'\n });\n ```\n \n The `rootElement` can be either a DOM element or a jQuery-compatible selector\n string. Note that *views appended to the DOM outside the root element will\n not receive events.* If you specify a custom root element, make sure you only\n append views inside it!\n \n To learn more about the events Ember components use, see\n \n [components/handling-events](https://guides.emberjs.com/release/components/handling-events/#toc_event-names).\n \n ### Initializers\n \n Libraries on top of Ember can add initializers, like so:\n \n ```javascript\n import Application from '@ember/application';\n \n Application.initializer({\n name: 'api-adapter',\n \n initialize: function(application) {\n application.register('api-adapter:main', ApiAdapter);\n }\n });\n ```\n \n Initializers provide an opportunity to access the internal registry, which\n organizes the different components of an Ember application. Additionally\n they provide a chance to access the instantiated application. Beyond\n being used for libraries, initializers are also a great way to organize\n dependency injection or setup in your own application.\n \n ### Routing\n \n In addition to creating your application's router, `Application` is\n also responsible for telling the router when to start routing. Transitions\n between routes can be logged with the `LOG_TRANSITIONS` flag, and more\n detailed intra-transition logging can be logged with\n the `LOG_TRANSITIONS_INTERNAL` flag:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n LOG_TRANSITIONS: true, // basic logging of successful transitions\n LOG_TRANSITIONS_INTERNAL: true // detailed logging of all routing steps\n });\n ```\n \n By default, the router will begin trying to translate the current URL into\n application state once the browser emits the `DOMContentReady` event. If you\n need to defer routing, you can call the application's `deferReadiness()`\n method. Once routing can begin, call the `advanceReadiness()` method.\n \n If there is any setup required before routing begins, you can implement a\n `ready()` method on your app that will be invoked immediately before routing\n begins.\n \n @class Application\n @extends Engine\n @uses RegistryProxyMixin\n @public\n */\n\n const Application = _engine.default.extend({\n /**\n The root DOM element of the Application. This can be specified as an\n element or a\n [jQuery-compatible selector string](http://api.jquery.com/category/selectors/).\n This is the element that will be passed to the Application's,\n `eventDispatcher`, which sets up the listeners for event delegation. Every\n view in your application should be a child of the element you specify here.\n @property rootElement\n @type DOMElement\n @default 'body'\n @public\n */\n rootElement: 'body',\n\n /**\n The `Ember.EventDispatcher` responsible for delegating events to this\n application's views.\n The event dispatcher is created by the application at initialization time\n and sets up event listeners on the DOM element described by the\n application's `rootElement` property.\n See the documentation for `Ember.EventDispatcher` for more information.\n @property eventDispatcher\n @type Ember.EventDispatcher\n @default null\n @public\n */\n eventDispatcher: null,\n\n /**\n The DOM events for which the event dispatcher should listen.\n By default, the application's `Ember.EventDispatcher` listens\n for a set of standard DOM events, such as `mousedown` and\n `keyup`, and delegates them to your application's `Ember.View`\n instances.\n If you would like additional bubbling events to be delegated to your\n views, set your `Application`'s `customEvents` property\n to a hash containing the DOM event name as the key and the\n corresponding view method name as the value. Setting an event to\n a value of `null` will prevent a default event listener from being\n added for that event.\n To add new events to be listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n // add support for the paste event\n paste: 'paste'\n }\n });\n ```\n To prevent default events from being listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n // remove support for mouseenter / mouseleave events\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n @property customEvents\n @type Object\n @default null\n @public\n */\n customEvents: null,\n\n /**\n Whether the application should automatically start routing and render\n templates to the `rootElement` on DOM ready. While default by true,\n other environments such as FastBoot or a testing harness can set this\n property to `false` and control the precise timing and behavior of the boot\n process.\n @property autoboot\n @type Boolean\n @default true\n @private\n */\n autoboot: true,\n\n /**\n Whether the application should be configured for the legacy \"globals mode\".\n Under this mode, the Application object serves as a global namespace for all\n classes.\n ```javascript\n import Application from '@ember/application';\n import Component from '@ember/component';\n let App = Application.create({\n ...\n });\n App.Router.reopen({\n location: 'none'\n });\n App.Router.map({\n ...\n });\n App.MyComponent = Component.extend({\n ...\n });\n ```\n This flag also exposes other internal APIs that assumes the existence of\n a special \"default instance\", like `App.__container__.lookup(...)`.\n This option is currently not configurable, its value is derived from\n the `autoboot` flag – disabling `autoboot` also implies opting-out of\n globals mode support, although they are ultimately orthogonal concerns.\n Some of the global modes features are already deprecated in 1.x. The\n existence of this flag is to untangle the globals mode code paths from\n the autoboot code paths, so that these legacy features can be reviewed\n for deprecation/removal separately.\n Forcing the (autoboot=true, _globalsMode=false) here and running the tests\n would reveal all the places where we are still relying on these legacy\n behavior internally (mostly just tests).\n @property _globalsMode\n @type Boolean\n @default true\n @private\n */\n _globalsMode: true,\n\n /**\n An array of application instances created by `buildInstance()`. Used\n internally to ensure that all instances get destroyed.\n @property _applicationInstances\n @type Array\n @default null\n @private\n */\n _applicationInstances: null,\n\n init() {\n // eslint-disable-line no-unused-vars\n this._super(...arguments);\n\n if (!this.$) {\n this.$ = _views.jQuery;\n }\n\n registerLibraries();\n\n if (_env.DEBUG) {\n if (_environment.ENV.LOG_VERSION) {\n // we only need to see this once per Application#init\n _environment.ENV.LOG_VERSION = false;\n _metal.libraries.logVersions();\n }\n }\n\n // Start off the number of deferrals at 1. This will be decremented by\n // the Application's own `boot` method.\n this._readinessDeferrals = 1;\n this._booted = false;\n this._applicationInstances = new Set();\n\n this.autoboot = this._globalsMode = !!this.autoboot;\n\n if (this._globalsMode) {\n this._prepareForGlobalsMode();\n }\n\n if (this.autoboot) {\n this.waitForDOMReady();\n }\n },\n\n /**\n Create an ApplicationInstance for this application.\n @public\n @method buildInstance\n @return {ApplicationInstance} the application instance\n */\n buildInstance(options = {}) {\n options.base = this;\n options.application = this;\n return _instance.default.create(options);\n },\n\n /**\n Start tracking an ApplicationInstance for this application.\n Used when the ApplicationInstance is created.\n @private\n @method _watchInstance\n */\n _watchInstance(instance) {\n this._applicationInstances.add(instance);\n },\n\n /**\n Stop tracking an ApplicationInstance for this application.\n Used when the ApplicationInstance is about to be destroyed.\n @private\n @method _unwatchInstance\n */\n _unwatchInstance(instance) {\n return this._applicationInstances.delete(instance);\n },\n\n /**\n Enable the legacy globals mode by allowing this application to act\n as a global namespace. See the docs on the `_globalsMode` property\n for details.\n Most of these features are already deprecated in 1.x, so we can\n stop using them internally and try to remove them.\n @private\n @method _prepareForGlobalsMode\n */\n _prepareForGlobalsMode() {\n // Create subclass of Router for this Application instance.\n // This is to ensure that someone reopening `App.Router` does not\n // tamper with the default `Router`.\n this.Router = (this.Router || _routing.Router).extend();\n\n this._buildDeprecatedInstance();\n },\n\n /*\n Build the deprecated instance for legacy globals mode support.\n Called when creating and resetting the application.\n This is orthogonal to autoboot: the deprecated instance needs to\n be created at Application construction (not boot) time to expose\n App.__container__. If autoboot sees that this instance exists,\n it will continue booting it to avoid doing unncessary work (as\n opposed to building a new instance at boot time), but they are\n otherwise unrelated.\n @private\n @method _buildDeprecatedInstance\n */\n _buildDeprecatedInstance() {\n // Build a default instance\n let instance = this.buildInstance();\n\n // Legacy support for App.__container__ and other global methods\n // on App that rely on a single, default instance.\n this.__deprecatedInstance__ = instance;\n this.__container__ = instance.__container__;\n },\n\n /**\n Automatically kick-off the boot process for the application once the\n DOM has become ready.\n The initialization itself is scheduled on the actions queue which\n ensures that code-loading finishes before booting.\n If you are asynchronously loading code, you should call `deferReadiness()`\n to defer booting, and then call `advanceReadiness()` once all of your code\n has finished loading.\n @private\n @method waitForDOMReady\n */\n waitForDOMReady() {\n if (!this.$ || this.$.isReady) {\n (0, _runloop.schedule)('actions', this, 'domReady');\n } else {\n this.$().ready((0, _runloop.bind)(this, 'domReady'));\n }\n },\n\n /**\n This is the autoboot flow:\n 1. Boot the app by calling `this.boot()`\n 2. Create an instance (or use the `__deprecatedInstance__` in globals mode)\n 3. Boot the instance by calling `instance.boot()`\n 4. Invoke the `App.ready()` callback\n 5. Kick-off routing on the instance\n Ideally, this is all we would need to do:\n ```javascript\n _autoBoot() {\n this.boot().then(() => {\n let instance = (this._globalsMode) ? this.__deprecatedInstance__ : this.buildInstance();\n return instance.boot();\n }).then((instance) => {\n App.ready();\n instance.startRouting();\n });\n }\n ```\n Unfortunately, we cannot actually write this because we need to participate\n in the \"synchronous\" boot process. While the code above would work fine on\n the initial boot (i.e. DOM ready), when `App.reset()` is called, we need to\n boot a new instance synchronously (see the documentation on `_bootSync()`\n for details).\n Because of this restriction, the actual logic of this method is located\n inside `didBecomeReady()`.\n @private\n @method domReady\n */\n domReady() {\n if (this.isDestroyed) {\n return;\n }\n\n this._bootSync();\n\n // Continues to `didBecomeReady`\n },\n\n /**\n Use this to defer readiness until some condition is true.\n Example:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create();\n App.deferReadiness();\n // $ is a reference to the jQuery object/function\n import $ from 'jquery;\n $.getJSON('/auth-token', function(token) {\n App.token = token;\n App.advanceReadiness();\n });\n ```\n This allows you to perform asynchronous setup logic and defer\n booting your application until the setup has finished.\n However, if the setup requires a loading UI, it might be better\n to use the router for this purpose.\n @method deferReadiness\n @public\n */\n deferReadiness() {\n (0, _debug.assert)('You must call deferReadiness on an instance of Application', this instanceof Application);\n (0, _debug.assert)('You cannot defer readiness since the `ready()` hook has already been called.', this._readinessDeferrals > 0);\n this._readinessDeferrals++;\n },\n\n /**\n Call `advanceReadiness` after any asynchronous setup logic has completed.\n Each call to `deferReadiness` must be matched by a call to `advanceReadiness`\n or the application will never become ready and routing will not begin.\n @method advanceReadiness\n @see {Application#deferReadiness}\n @public\n */\n advanceReadiness() {\n (0, _debug.assert)('You must call advanceReadiness on an instance of Application', this instanceof Application);\n this._readinessDeferrals--;\n\n if (this._readinessDeferrals === 0) {\n (0, _runloop.once)(this, this.didBecomeReady);\n }\n },\n\n /**\n Initialize the application and return a promise that resolves with the `Application`\n object when the boot process is complete.\n Run any application initializers and run the application load hook. These hooks may\n choose to defer readiness. For example, an authentication hook might want to defer\n readiness until the auth token has been retrieved.\n By default, this method is called automatically on \"DOM ready\"; however, if autoboot\n is disabled, this is automatically called when the first application instance is\n created via `visit`.\n @public\n @method boot\n @return {Promise}\n */\n boot() {\n if (this._bootPromise) {\n return this._bootPromise;\n }\n\n try {\n this._bootSync();\n } catch (_) {\n // Ignore the error: in the asynchronous boot path, the error is already reflected\n // in the promise rejection\n }\n\n return this._bootPromise;\n },\n\n /**\n Unfortunately, a lot of existing code assumes the booting process is\n \"synchronous\". Specifically, a lot of tests assumes the last call to\n `app.advanceReadiness()` or `app.reset()` will result in the app being\n fully-booted when the current runloop completes.\n We would like new code (like the `visit` API) to stop making this assumption,\n so we created the asynchronous version above that returns a promise. But until\n we have migrated all the code, we would have to expose this method for use\n *internally* in places where we need to boot an app \"synchronously\".\n @private\n */\n _bootSync() {\n if (this._booted) {\n return;\n }\n\n // Even though this returns synchronously, we still need to make sure the\n // boot promise exists for book-keeping purposes: if anything went wrong in\n // the boot process, we need to store the error as a rejection on the boot\n // promise so that a future caller of `boot()` can tell what failed.\n let defer = this._bootResolver = _runtime.RSVP.defer();\n this._bootPromise = defer.promise;\n\n try {\n this.runInitializers();\n (0, _lazy_load.runLoadHooks)('application', this);\n this.advanceReadiness();\n // Continues to `didBecomeReady`\n } catch (error) {\n // For the asynchronous boot path\n defer.reject(error);\n\n // For the synchronous boot path\n throw error;\n }\n },\n\n /**\n Reset the application. This is typically used only in tests. It cleans up\n the application in the following order:\n 1. Deactivate existing routes\n 2. Destroy all objects in the container\n 3. Create a new application container\n 4. Re-route to the existing url\n Typical Example:\n ```javascript\n import Application from '@ember/application';\n let App;\n run(function() {\n App = Application.create();\n });\n module('acceptance test', {\n setup: function() {\n App.reset();\n }\n });\n test('first test', function() {\n // App is freshly reset\n });\n test('second test', function() {\n // App is again freshly reset\n });\n ```\n Advanced Example:\n Occasionally you may want to prevent the app from initializing during\n setup. This could enable extra configuration, or enable asserting prior\n to the app becoming ready.\n ```javascript\n import Application from '@ember/application';\n let App;\n run(function() {\n App = Application.create();\n });\n module('acceptance test', {\n setup: function() {\n run(function() {\n App.reset();\n App.deferReadiness();\n });\n }\n });\n test('first test', function() {\n ok(true, 'something before app is initialized');\n run(function() {\n App.advanceReadiness();\n });\n ok(true, 'something after app is initialized');\n });\n ```\n @method reset\n @public\n */\n reset() {\n (0, _debug.assert)(`Calling reset() on instances of \\`Application\\` is not\n supported when globals mode is disabled; call \\`visit()\\` to\n create new \\`ApplicationInstance\\`s and dispose them\n via their \\`destroy()\\` method instead.`, this._globalsMode && this.autoboot);\n\n let instance = this.__deprecatedInstance__;\n\n this._readinessDeferrals = 1;\n this._bootPromise = null;\n this._bootResolver = null;\n this._booted = false;\n\n function handleReset() {\n (0, _runloop.run)(instance, 'destroy');\n this._buildDeprecatedInstance();\n (0, _runloop.schedule)('actions', this, '_bootSync');\n }\n\n (0, _runloop.join)(this, handleReset);\n },\n\n /**\n @private\n @method didBecomeReady\n */\n didBecomeReady() {\n try {\n // TODO: Is this still needed for _globalsMode = false?\n if (!(0, _debug.isTesting)()) {\n // Eagerly name all classes that are already loaded\n (0, _metal.processAllNamespaces)();\n (0, _metal.setNamespaceSearchDisabled)(true);\n }\n\n // See documentation on `_autoboot()` for details\n if (this.autoboot) {\n let instance;\n\n if (this._globalsMode) {\n // If we already have the __deprecatedInstance__ lying around, boot it to\n // avoid unnecessary work\n instance = this.__deprecatedInstance__;\n } else {\n // Otherwise, build an instance and boot it. This is currently unreachable,\n // because we forced _globalsMode to === autoboot; but having this branch\n // allows us to locally toggle that flag for weeding out legacy globals mode\n // dependencies independently\n instance = this.buildInstance();\n }\n\n instance._bootSync();\n\n // TODO: App.ready() is not called when autoboot is disabled, is this correct?\n this.ready();\n\n instance.startRouting();\n }\n\n // For the asynchronous boot path\n this._bootResolver.resolve(this);\n\n // For the synchronous boot path\n this._booted = true;\n } catch (error) {\n // For the asynchronous boot path\n this._bootResolver.reject(error);\n\n // For the synchronous boot path\n throw error;\n }\n },\n\n /**\n Called when the Application has become ready, immediately before routing\n begins. The call will be delayed until the DOM has become ready.\n @event ready\n @public\n */\n ready() {\n return this;\n },\n\n // This method must be moved to the application instance object\n willDestroy() {\n this._super(...arguments);\n (0, _metal.setNamespaceSearchDisabled)(false);\n this._booted = false;\n this._bootPromise = null;\n this._bootResolver = null;\n\n if (_lazy_load._loaded.application === this) {\n _lazy_load._loaded.application = undefined;\n }\n\n if (this._applicationInstances.size) {\n this._applicationInstances.forEach(i => i.destroy());\n this._applicationInstances.clear();\n }\n },\n\n /**\n Boot a new instance of `ApplicationInstance` for the current\n application and navigate it to the given `url`. Returns a `Promise` that\n resolves with the instance when the initial routing and rendering is\n complete, or rejects with any error that occurred during the boot process.\n When `autoboot` is disabled, calling `visit` would first cause the\n application to boot, which runs the application initializers.\n This method also takes a hash of boot-time configuration options for\n customizing the instance's behavior. See the documentation on\n `ApplicationInstance.BootOptions` for details.\n `ApplicationInstance.BootOptions` is an interface class that exists\n purely to document the available options; you do not need to construct it\n manually. Simply pass a regular JavaScript object containing of the\n desired options:\n ```javascript\n MyApp.visit(\"/\", { location: \"none\", rootElement: \"#container\" });\n ```\n ### Supported Scenarios\n While the `BootOptions` class exposes a large number of knobs, not all\n combinations of them are valid; certain incompatible combinations might\n result in unexpected behavior.\n For example, booting the instance in the full browser environment\n while specifying a foreign `document` object (e.g. `{ isBrowser: true,\n document: iframe.contentDocument }`) does not work correctly today,\n largely due to Ember's jQuery dependency.\n Currently, there are three officially supported scenarios/configurations.\n Usages outside of these scenarios are not guaranteed to work, but please\n feel free to file bug reports documenting your experience and any issues\n you encountered to help expand support.\n #### Browser Applications (Manual Boot)\n The setup is largely similar to how Ember works out-of-the-box. Normally,\n Ember will boot a default instance for your Application on \"DOM ready\".\n However, you can customize this behavior by disabling `autoboot`.\n For example, this allows you to render a miniture demo of your application\n into a specific area on your marketing website:\n ```javascript\n import MyApp from 'my-app';\n $(function() {\n let App = MyApp.create({ autoboot: false });\n let options = {\n // Override the router's location adapter to prevent it from updating\n // the URL in the address bar\n location: 'none',\n // Override the default `rootElement` on the app to render into a\n // specific `div` on the page\n rootElement: '#demo'\n };\n // Start the app at the special demo URL\n App.visit('/demo', options);\n });\n ```\n Or perhaps you might want to boot two instances of your app on the same\n page for a split-screen multiplayer experience:\n ```javascript\n import MyApp from 'my-app';\n $(function() {\n let App = MyApp.create({ autoboot: false });\n let sessionId = MyApp.generateSessionID();\n let player1 = App.visit(`/matches/join?name=Player+1&session=${sessionId}`, { rootElement: '#left', location: 'none' });\n let player2 = App.visit(`/matches/join?name=Player+2&session=${sessionId}`, { rootElement: '#right', location: 'none' });\n Promise.all([player1, player2]).then(() => {\n // Both apps have completed the initial render\n $('#loading').fadeOut();\n });\n });\n ```\n Do note that each app instance maintains their own registry/container, so\n they will run in complete isolation by default.\n #### Server-Side Rendering (also known as FastBoot)\n This setup allows you to run your Ember app in a server environment using\n Node.js and render its content into static HTML for SEO purposes.\n ```javascript\n const HTMLSerializer = new SimpleDOM.HTMLSerializer(SimpleDOM.voidMap);\n function renderURL(url) {\n let dom = new SimpleDOM.Document();\n let rootElement = dom.body;\n let options = { isBrowser: false, document: dom, rootElement: rootElement };\n return MyApp.visit(options).then(instance => {\n try {\n return HTMLSerializer.serialize(rootElement.firstChild);\n } finally {\n instance.destroy();\n }\n });\n }\n ```\n In this scenario, because Ember does not have access to a global `document`\n object in the Node.js environment, you must provide one explicitly. In practice,\n in the non-browser environment, the stand-in `document` object only needs to\n implement a limited subset of the full DOM API. The `SimpleDOM` library is known\n to work.\n Since there is no access to jQuery in the non-browser environment, you must also\n specify a DOM `Element` object in the same `document` for the `rootElement` option\n (as opposed to a selector string like `\"body\"`).\n See the documentation on the `isBrowser`, `document` and `rootElement` properties\n on `ApplicationInstance.BootOptions` for details.\n #### Server-Side Resource Discovery\n This setup allows you to run the routing layer of your Ember app in a server\n environment using Node.js and completely disable rendering. This allows you\n to simulate and discover the resources (i.e. AJAX requests) needed to fulfill\n a given request and eagerly \"push\" these resources to the client.\n ```app/initializers/network-service.js\n import BrowserNetworkService from 'app/services/network/browser';\n import NodeNetworkService from 'app/services/network/node';\n // Inject a (hypothetical) service for abstracting all AJAX calls and use\n // the appropriate implementation on the client/server. This also allows the\n // server to log all the AJAX calls made during a particular request and use\n // that for resource-discovery purpose.\n export function initialize(application) {\n if (window) { // browser\n application.register('service:network', BrowserNetworkService);\n } else { // node\n application.register('service:network', NodeNetworkService);\n }\n application.inject('route', 'network', 'service:network');\n };\n export default {\n name: 'network-service',\n initialize: initialize\n };\n ```\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n // An example of how the (hypothetical) service is used in routes.\n export default Route.extend({\n model(params) {\n return this.network.fetch(`/api/posts/${params.post_id}.json`);\n },\n afterModel(post) {\n if (post.isExternalContent) {\n return this.network.fetch(`/api/external/?url=${post.externalURL}`);\n } else {\n return post;\n }\n }\n });\n ```\n ```javascript\n // Finally, put all the pieces together\n function discoverResourcesFor(url) {\n return MyApp.visit(url, { isBrowser: false, shouldRender: false }).then(instance => {\n let networkService = instance.lookup('service:network');\n return networkService.requests; // => { \"/api/posts/123.json\": \"...\" }\n });\n }\n ```\n @public\n @method visit\n @param url {String} The initial URL to navigate to\n @param options {ApplicationInstance.BootOptions}\n @return {Promise}\n */\n visit(url, options) {\n return this.boot().then(() => {\n let instance = this.buildInstance();\n\n return instance.boot(options).then(() => instance.visit(url)).catch(error => {\n (0, _runloop.run)(instance, 'destroy');\n throw error;\n });\n });\n }\n });\n\n Application.reopenClass({\n /**\n This creates a registry with the default Ember naming conventions.\n It also configures the registry:\n * registered views are created every time they are looked up (they are\n not singletons)\n * registered templates are not factories; the registered value is\n returned directly.\n * the router receives the application as its `namespace` property\n * all controllers receive the router as their `target` and `controllers`\n properties\n * all controllers receive the application as their `namespace` property\n * the application view receives the application controller as its\n `controller` property\n * the application view receives the application template as its\n `defaultTemplate` property\n @method buildRegistry\n @static\n @param {Application} namespace the application for which to\n build the registry\n @return {Ember.Registry} the built registry\n @private\n */\n buildRegistry() {\n // eslint-disable-line no-unused-vars\n let registry = this._super(...arguments);\n\n commonSetupRegistry(registry);\n\n (0, _glimmer.setupApplicationRegistry)(registry);\n\n return registry;\n }\n });\n\n function commonSetupRegistry(registry) {\n registry.register('router:main', _routing.Router.extend());\n registry.register('-view-registry:main', {\n create() {\n return (0, _utils.dictionary)(null);\n }\n });\n\n registry.register('route:basic', _routing.Route);\n registry.register('event_dispatcher:main', _views.EventDispatcher);\n\n registry.injection('router:main', 'namespace', 'application:main');\n\n registry.register('location:auto', _routing.AutoLocation);\n registry.register('location:hash', _routing.HashLocation);\n registry.register('location:history', _routing.HistoryLocation);\n registry.register('location:none', _routing.NoneLocation);\n\n registry.register(_container.privatize`-bucket-cache:main`, {\n create() {\n return new _routing.BucketCache();\n }\n });\n\n registry.register('service:router', _routing.RouterService);\n registry.injection('service:router', '_router', 'router:main');\n }\n\n function registerLibraries() {\n if (!librariesRegistered) {\n librariesRegistered = true;\n\n if (_browserEnvironment.hasDOM && !_views.jQueryDisabled) {\n _metal.libraries.registerCoreLibrary('jQuery', (0, _views.jQuery)().jquery);\n }\n }\n }\n\n exports.default = Application;\n});","enifed('@ember/application/lib/lazy_load', ['exports', '@ember/-internals/environment', '@ember/-internals/browser-environment'], function (exports, _environment, _browserEnvironment) {\n 'use strict';\n\n exports.__esModule = true;\n exports._loaded = undefined;\n exports.onLoad = onLoad;\n exports.runLoadHooks = runLoadHooks;\n\n\n /**\n @module @ember/application\n */\n\n /*globals CustomEvent */\n\n const loadHooks = _environment.ENV.EMBER_LOAD_HOOKS || {};\n const loaded = {};\n let _loaded = exports._loaded = loaded;\n\n /**\n Detects when a specific package of Ember (e.g. 'Application')\n has fully loaded and is available for extension.\n \n The provided `callback` will be called with the `name` passed\n resolved from a string into the object:\n \n ``` javascript\n import { onLoad } from '@ember/application';\n \n onLoad('Ember.Application' function(hbars) {\n hbars.registerHelper(...);\n });\n ```\n \n @method onLoad\n @static\n @for @ember/application\n @param name {String} name of hook\n @param callback {Function} callback to be called\n @private\n */\n function onLoad(name, callback) {\n let object = loaded[name];\n\n loadHooks[name] = loadHooks[name] || [];\n loadHooks[name].push(callback);\n\n if (object) {\n callback(object);\n }\n }\n\n /**\n Called when an Ember.js package (e.g Application) has finished\n loading. Triggers any callbacks registered for this event.\n \n @method runLoadHooks\n @static\n @for @ember/application\n @param name {String} name of hook\n @param object {Object} object to pass to callbacks\n @private\n */\n function runLoadHooks(name, object) {\n loaded[name] = object;\n\n if (_browserEnvironment.window && typeof CustomEvent === 'function') {\n let event = new CustomEvent(name, { detail: object, name });\n _browserEnvironment.window.dispatchEvent(event);\n }\n\n if (loadHooks[name]) {\n loadHooks[name].forEach(callback => callback(object));\n }\n }\n});","enifed('@ember/application/lib/validate-type', ['exports', '@ember/debug'], function (exports, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = validateType;\n\n\n const VALIDATED_TYPES = {\n route: ['assert', 'isRouteFactory', 'Ember.Route'],\n component: ['deprecate', 'isComponentFactory', 'Ember.Component'],\n view: ['deprecate', 'isViewFactory', 'Ember.View'],\n service: ['deprecate', 'isServiceFactory', 'Ember.Service']\n };\n\n function validateType(resolvedType, parsedName) {\n let validationAttributes = VALIDATED_TYPES[parsedName.type];\n\n if (!validationAttributes) {\n return;\n }\n\n let [, factoryFlag, expectedType] = validationAttributes;\n\n (0, _debug.assert)(`Expected ${parsedName.fullName} to resolve to an ${expectedType} but ` + `instead it was ${resolvedType}.`, !!resolvedType[factoryFlag]);\n }\n});","enifed('@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 const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n let application, appInstance;\n\n (0, _internalTestHelpers.moduleFor)('ApplicationInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n\n document.getElementById('qunit-fixture').innerHTML = `\n
    HI
    HI
    \n `;\n application = (0, _runloop.run)(() => _application.default.create({ rootElement: '#one', router: null }));\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\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({ 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\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n application.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\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 before setupEventDispatcher'](assert) {\n assert.expect(1);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n application.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\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\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n appInstance.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\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\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n\n let PostController1 = (0, _internalTestHelpers.factory)();\n let PostController2 = (0, _internalTestHelpers.factory)();\n\n appInstance.register('controller:post', PostController1);\n\n let postController1 = appInstance.lookup('controller:post');\n let 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\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2);\n\n let postController2 = appInstance.lookup('controller:post');\n let postController2Factory = appInstance.factoryFor('controller:post');\n assert.ok(postController2 instanceof PostController2, 'lookup creates instance');\n assert.equal(PostController2, postController2Factory.class, 'factoryFor().class matches');\n\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\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n\n let PostController1 = (0, _internalTestHelpers.factory)();\n let PostController2 = (0, _internalTestHelpers.factory)();\n\n appInstance.register('controller:post', PostController1);\n\n appInstance.lookup('controller:post');\n let postControllerLookupWithSource = appInstance.lookup('controller:post', {\n source: 'doesnt-even-matter'\n });\n\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2);\n\n // The cache that is source-specific is not cleared\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(11);\n\n let ChatEngine = _engine.default.extend();\n let chatEngineInstance;\n\n application.register('engine:chat', ChatEngine);\n\n (0, _runloop.run)(() => {\n appInstance = _instance.default.create({ application });\n appInstance.setupRegistry();\n chatEngineInstance = appInstance.buildChildEngineInstance('chat');\n });\n\n return chatEngineInstance.boot().then(() => {\n assert.ok(true, 'boot successful');\n\n let registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment'];\n\n registrations.forEach(key => {\n assert.strictEqual(chatEngineInstance.resolveRegistration(key), appInstance.resolveRegistration(key), `Engine and parent app share registrations for '${key}'`);\n });\n\n let singletons = ['router:main', _container.privatize`-bucket-cache:main`, '-view-registry:main', '-environment:main', 'service:-document', 'event_dispatcher:main'];\n\n let env = appInstance.lookup('-environment:main');\n singletons.push(env.isInteractive ? 'renderer:-dom' : 'renderer:-inert');\n\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 let namespace = _runtime.Object.create({\n Resolver: { create: function () {} }\n });\n\n let registry = _application.default.buildRegistry(namespace);\n\n _instance.default.setupRegistry(registry);\n\n assert.equal(registry.resolve('service:-document'), document);\n }\n });\n});","enifed('@ember/application/tests/application_test', ['ember/version', '@ember/-internals/environment', '@ember/-internals/metal', '@ember/debug', '@ember/application', '@ember/-internals/routing', '@ember/-internals/views', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/glimmer', '@ember/-internals/container', '@ember/polyfills', 'internal-test-helpers', '@ember/runloop'], function (_version, _environment, _metal, _debug, _application, _routing, _views, _controller, _runtime, _glimmer, _container, _polyfills, _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
    HI
    \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one',\n router: null,\n autoboot: true\n });\n }\n\n createSecondApplication(options) {\n let myOptions = (0, _polyfills.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 this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test you can make a new application in a non-overlapping element`](assert) {\n let app = this.runTask(() => this.createSecondApplication({\n rootElement: '#two'\n }));\n\n this.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 this.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 this.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 this.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 this.runTask(() => this.createSecondApplication());\n });\n }\n }); /*globals EmberDev */\n\n\n (0, _internalTestHelpers.moduleFor)('Application', class extends _internalTestHelpers.ApplicationTestCase {\n [`@test builds a registry`](assert) {\n let { application } = this;\n assert.strictEqual(application.resolveRegistration('application:main'), application, `application:main is registered`);\n assert.deepEqual(application.registeredOptionsForType('component'), { singleton: false }, `optionsForType 'component'`);\n assert.deepEqual(application.registeredOptionsForType('view'), { singleton: false }, `optionsForType 'view'`);\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'controller:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view', '_viewRegistry', '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_topLevelViewTemplate', 'template:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'route:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'event_dispatcher:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'router:main', 'namespace', 'application:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view:-outlet', 'namespace', 'application:main');\n\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\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'controller', 'target', 'router:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'controller', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'router', '_bucketCache', _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_bucketCache', _container.privatize`-bucket-cache:main`);\n\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_router', 'router:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-text-field');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-text-area');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-checkbox');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:link-to');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-routing');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component-lookup:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-glimmer-environment');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-dom-changes');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-dom-tree-construction');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-glimmer-environment', 'appendOperations', 'service:-dom-tree-construction');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-glimmer-environment', 'updateOperations', 'service:-dom-changes');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'renderer', 'env', 'service:-glimmer-environment');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'renderer:-dom');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'renderer:-inert');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, _container.privatize`template:components/-default`);\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view:-outlet', 'template', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'template', 'compiler', _container.privatize`template-compiler:main`);\n\n assert.deepEqual(application.registeredOptionsForType('helper'), { instantiate: false }, `optionsForType 'helper'`);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application, default resolver with autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super(...arguments);\n this.originalLookup = _environment.context.lookup;\n }\n\n teardown() {\n _environment.context.lookup = this.originalLookup;\n super.teardown();\n (0, _glimmer.setTemplates)({});\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true\n });\n }\n\n [`@test acts like a namespace`](assert) {\n this.application = this.runTask(() => this.createApplication());\n let Foo = this.application.Foo = _runtime.Object.extend();\n assert.equal(Foo.toString(), 'TestApp.Foo', 'Classes pick up their parent namespace');\n }\n\n [`@test can specify custom router`](assert) {\n let MyRouter = _routing.Router.extend();\n this.runTask(() => {\n this.createApplication();\n this.application.Router = MyRouter;\n });\n\n assert.ok(this.application.__deprecatedInstance__.lookup('router:main') instanceof MyRouter, 'application resolved the correct router');\n }\n\n [`@test Minimal Application initialized with just an application template`]() {\n this.setupFixture('');\n this.runTask(() => this.createApplication());\n this.assertInnerHTML('Hello World');\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 this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', '

    Hi from index

    ');\n });\n\n this.assertText('Hi from index');\n }\n\n [`@test ready hook is called before routing begins`](assert) {\n assert.expect(2);\n\n this.runTask(() => {\n function registerRoute(application, name, callback) {\n let route = _routing.Route.extend({\n activate: callback\n });\n\n application.register('route:' + name, route);\n }\n\n let MyApplication = _application.default.extend({\n ready() {\n registerRoute(this, 'index', () => {\n assert.ok(true, 'last-minute route is activated');\n });\n }\n });\n\n let app = this.createApplication({}, MyApplication);\n\n registerRoute(app, 'application', () => assert.ok(true, 'normal route is activated'));\n });\n }\n\n [`@test initialize application via initialize call`](assert) {\n this.runTask(() => this.createApplication());\n // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n let 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 this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '

    Hello!

    ');\n });\n // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n let router = this.application.__deprecatedInstance__.lookup('router:main');\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 this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '

    {{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 (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n let messages = [];\n\n _environment.ENV.LOG_VERSION = true;\n\n (0, _debug.setDebugFunction)('debug', message => messages.push(message));\n\n _metal.libraries.register('my-lib', '2.0.0a');\n\n this.runTask(() => this.createApplication());\n\n assert.equal(messages[1], 'Ember : ' + _version.default);\n if (_views.jQueryDisabled) {\n assert.equal(messages[2], 'my-lib : ' + '2.0.0a');\n } else {\n assert.equal(messages[2], 'jQuery : ' + (0, _views.jQuery)().jquery);\n assert.equal(messages[3], 'my-lib : ' + '2.0.0a');\n }\n\n _metal.libraries.deRegister('my-lib');\n }\n\n [`@test disable log of version of libraries with an ENV var`](assert) {\n let logged = false;\n\n _environment.ENV.LOG_VERSION = false;\n\n (0, _debug.setDebugFunction)('debug', () => logged = true);\n\n this.runTask(() => this.createApplication());\n\n assert.ok(!logged, 'library version logging skipped');\n }\n\n [`@test can resolve custom router`](assert) {\n let CustomRouter = _routing.Router.extend();\n\n this.runTask(() => {\n this.createApplication();\n this.add('router:main', CustomRouter);\n });\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 this.runTask(() => this.createApplication());\n assert.equal(_application._loaded.application, this.application);\n this.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 let namespace = _runtime.Object.create({\n Resolver: { create: function () {} }\n });\n\n let 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 let namespace = _runtime.Object.create({\n Resolver: { create() {} }\n });\n\n let 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 let instance = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n\n assert.ok(instance.isDestroyed, 'instance was destroyed');\n }\n\n ['@test tracks built instances'](assert) {\n let instanceA = this.application.buildInstance();\n let instanceB = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n\n assert.ok(instanceA.isDestroyed, 'instanceA was destroyed');\n assert.ok(instanceB.isDestroyed, 'instanceB was destroyed');\n }\n });\n});","enifed('@ember/application/tests/bootstrap-test', ['@ember/polyfills', 'internal-test-helpers'], function (_polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application with default resolver and autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n get fixture() {\n return `\n
    \n\n \n \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true,\n rootElement: '#app'\n });\n }\n\n ['@test templates in script tags are extracted at application creation'](assert) {\n this.runTask(() => this.createApplication());\n assert.equal(document.getElementById('app').textContent, 'Hello World!');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/custom_resolver_test', ['@ember/application/globals-resolver', '@ember/polyfills', 'internal-test-helpers'], function (_globalsResolver, _polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application with extended default resolver and autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n get applicationOptions() {\n let applicationTemplate = this.compile(`

    Fallback

    `);\n\n let Resolver = _globalsResolver.default.extend({\n resolveTemplate(resolvable) {\n if (resolvable.fullNameWithoutType === 'application') {\n return applicationTemplate;\n } else {\n return this._super(resolvable);\n }\n }\n });\n\n return (0, _polyfills.assign)(super.applicationOptions, {\n Resolver,\n autoboot: true\n });\n }\n\n [`@test a resolver can be supplied to application`]() {\n this.runTask(() => this.createApplication());\n this.assertText('Fallback');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/default_resolver_test', ['internal-test-helpers', '@ember/-internals/environment', '@ember/controller', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/routing', '@ember/-internals/glimmer', '@ember/debug'], function (_internalTestHelpers, _environment, _controller, _service, _runtime, _routing, _glimmer, _debug) {\n 'use strict';\n\n /* globals EmberDev */\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n beforeEach() {\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n get privateRegistry() {\n return this.application.__registry__;\n }\n\n /*\n * This first batch of tests are integration tests against the public\n * applicationInstance API.\n */\n\n [`@test the default resolver looks up templates in Ember.TEMPLATES`](assert) {\n let fooTemplate = this.addTemplate('foo', `foo template`);\n let fooBarTemplate = this.addTemplate('fooBar', `fooBar template`);\n let fooBarBazTemplate = this.addTemplate('fooBar/baz', `fooBar/baz template`);\n\n assert.equal(this.applicationInstance.factoryFor('template:foo').class, fooTemplate, 'resolves template:foo');\n assert.equal(this.applicationInstance.factoryFor('template:fooBar').class, fooBarTemplate, 'resolves template:foo_bar');\n assert.equal(this.applicationInstance.factoryFor('template:fooBar.baz').class, fooBarBazTemplate, 'resolves template:foo_bar.baz');\n }\n\n [`@test the default resolver looks up basic name as no prefix`](assert) {\n let instance = this.applicationInstance.lookup('controller:basic');\n assert.ok(_controller.default.detect(instance), 'locator looks up correct controller');\n }\n\n [`@test the default resolver looks up arbitrary types on the namespace`](assert) {\n let Class = this.application.FooManager = _runtime.Object.extend();\n let resolvedClass = this.application.resolveRegistration('manager:foo');\n assert.equal(Class, resolvedClass, 'looks up FooManager on application');\n }\n\n [`@test the default resolver resolves models on the namespace`](assert) {\n let Class = this.application.Post = _runtime.Object.extend();\n let factoryClass = this.applicationInstance.factoryFor('model:post').class;\n assert.equal(Class, factoryClass, 'looks up Post model on application');\n }\n\n [`@test the default resolver resolves *:main on the namespace`](assert) {\n let Class = this.application.FooBar = _runtime.Object.extend();\n let factoryClass = this.applicationInstance.factoryFor('foo-bar:main').class;\n assert.equal(Class, factoryClass, 'looks up FooBar type without name on application');\n }\n\n [`@test the default resolver resolves container-registered helpers`](assert) {\n let shorthandHelper = (0, _glimmer.helper)(() => {});\n let helper = _glimmer.Helper.extend();\n\n this.application.register('helper:shorthand', shorthandHelper);\n this.application.register('helper:complete', helper);\n\n let lookedUpShorthandHelper = this.applicationInstance.factoryFor('helper:shorthand').class;\n\n assert.ok(lookedUpShorthandHelper.isHelperFactory, 'shorthand helper isHelper');\n\n let lookedUpHelper = this.applicationInstance.factoryFor('helper:complete').class;\n\n assert.ok(lookedUpHelper.isHelperFactory, 'complete helper is factory');\n assert.ok(helper.detect(lookedUpHelper), 'looked up complete helper');\n }\n\n [`@test the default resolver resolves container-registered helpers via lookupFor`](assert) {\n let shorthandHelper = (0, _glimmer.helper)(() => {});\n let helper = _glimmer.Helper.extend();\n\n this.application.register('helper:shorthand', shorthandHelper);\n this.application.register('helper:complete', helper);\n\n let lookedUpShorthandHelper = this.applicationInstance.factoryFor('helper:shorthand').class;\n\n assert.ok(lookedUpShorthandHelper.isHelperFactory, 'shorthand helper isHelper');\n\n let lookedUpHelper = this.applicationInstance.factoryFor('helper:complete').class;\n\n assert.ok(lookedUpHelper.isHelperFactory, 'complete helper is factory');\n assert.ok(helper.detect(lookedUpHelper), 'looked up complete helper');\n }\n\n [`@test the default resolver resolves helpers on the namespace`](assert) {\n let ShorthandHelper = (0, _glimmer.helper)(() => {});\n let CompleteHelper = _glimmer.Helper.extend();\n\n this.application.ShorthandHelper = ShorthandHelper;\n this.application.CompleteHelper = CompleteHelper;\n\n let resolvedShorthand = this.application.resolveRegistration('helper:shorthand');\n let resolvedComplete = this.application.resolveRegistration('helper:complete');\n\n assert.equal(resolvedShorthand, ShorthandHelper, 'resolve fetches the shorthand helper factory');\n assert.equal(resolvedComplete, CompleteHelper, 'resolve fetches the complete helper factory');\n }\n\n [`@test the default resolver resolves to the same instance, no matter the notation `](assert) {\n this.application.NestedPostController = _controller.default.extend({});\n\n assert.equal(this.applicationInstance.lookup('controller:nested-post'), this.applicationInstance.lookup('controller:nested_post'), 'looks up NestedPost controller on application');\n }\n\n [`@test the default resolver throws an error if the fullName to resolve is invalid`]() {\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(undefined);\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(null);\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(':');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('model');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('model:');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(':type');\n }, /fullName must be a proper full name/);\n }\n\n /*\n * The following are integration tests against the private registry API.\n */\n\n [`@test lookup description`](assert) {\n this.application.toString = () => 'App';\n\n assert.equal(this.privateRegistry.describe('controller:foo'), 'App.FooController', 'Type gets appended at the end');\n assert.equal(this.privateRegistry.describe('controller:foo.bar'), 'App.FooBarController', 'dots are removed');\n assert.equal(this.privateRegistry.describe('model:foo'), 'App.Foo', \"models don't get appended at the end\");\n }\n\n [`@test assertion for routes without isRouteFactory property`]() {\n this.application.FooRoute = _glimmer.Component.extend();\n\n expectAssertion(() => {\n this.privateRegistry.resolve(`route:foo`);\n }, /to resolve to an Ember.Route/, 'Should assert');\n }\n\n [`@test no assertion for routes that extend from Route`](assert) {\n assert.expect(0);\n this.application.FooRoute = _routing.Route.extend();\n this.privateRegistry.resolve(`route:foo`);\n }\n\n [`@test deprecation warning for service factories without isServiceFactory property`]() {\n expectAssertion(() => {\n this.application.FooService = _runtime.Object.extend();\n this.privateRegistry.resolve('service:foo');\n }, /Expected service:foo to resolve to an Ember.Service but instead it was TestApp\\.FooService\\./);\n }\n\n [`@test no deprecation warning for service factories that extend from Service`](assert) {\n assert.expect(0);\n this.application.FooService = _service.default.extend();\n this.privateRegistry.resolve('service:foo');\n }\n\n [`@test deprecation warning for component factories without isComponentFactory property`]() {\n expectAssertion(() => {\n this.application.FooComponent = _runtime.Object.extend();\n this.privateRegistry.resolve('component:foo');\n }, /Expected component:foo to resolve to an Ember\\.Component but instead it was TestApp\\.FooComponent\\./);\n }\n\n [`@test no deprecation warning for component factories that extend from Component`]() {\n expectNoDeprecation();\n this.application.FooView = _glimmer.Component.extend();\n this.privateRegistry.resolve('component:foo');\n }\n\n [`@test knownForType returns each item for a given type found`](assert) {\n this.application.FooBarHelper = 'foo';\n this.application.BazQuxHelper = 'bar';\n\n let found = this.privateRegistry.resolver.knownForType('helper');\n\n assert.deepEqual(found, {\n 'helper:foo-bar': true,\n 'helper:baz-qux': true\n });\n }\n\n [`@test knownForType is not required to be present on the resolver`](assert) {\n delete this.privateRegistry.resolver.knownForType;\n\n this.privateRegistry.resolver.knownForType('helper', () => {});\n\n assert.ok(true, 'does not error');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver w/ other namespace', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n beforeEach() {\n this.UserInterface = _environment.context.lookup.UserInterface = _runtime.Namespace.create();\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n teardown() {\n let UserInterfaceNamespace = _runtime.Namespace.NAMESPACES_BY_ID['UserInterface'];\n if (UserInterfaceNamespace) {\n this.runTask(() => {\n UserInterfaceNamespace.destroy();\n });\n }\n super.teardown();\n }\n\n [`@test the default resolver can look things up in other namespaces`](assert) {\n this.UserInterface.NavigationController = _controller.default.extend();\n\n let nav = this.applicationInstance.lookup('controller:userInterface/navigation');\n\n assert.ok(nav instanceof this.UserInterface.NavigationController, 'the result should be an instance of the specified class');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super();\n this._originalLookup = _environment.context.lookup;\n this._originalInfo = (0, _debug.getDebugFunction)('info');\n }\n\n beforeEach() {\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('info', this._originalInfo);\n _environment.context.lookup = this._originalLookup;\n super.teardown();\n }\n\n [`@test the default resolver logs hits if 'LOG_RESOLVER' is set`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(3);\n\n this.application.LOG_RESOLVER = true;\n this.application.ScoobyDoo = _runtime.Object.extend();\n this.application.toString = () => 'App';\n\n (0, _debug.setDebugFunction)('info', function (symbol, name, padding, lookupDescription) {\n assert.equal(symbol, '[✓]', 'proper symbol is printed when a module is found');\n assert.equal(name, 'doo:scooby', 'proper lookup value is logged');\n assert.equal(lookupDescription, 'App.ScoobyDoo');\n });\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n }\n\n [`@test the default resolver logs misses if 'LOG_RESOLVER' is set`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(3);\n\n this.application.LOG_RESOLVER = true;\n this.application.toString = () => 'App';\n\n (0, _debug.setDebugFunction)('info', function (symbol, name, padding, lookupDescription) {\n assert.equal(symbol, '[ ]', 'proper symbol is printed when a module is not found');\n assert.equal(name, 'doo:scooby', 'proper lookup value is logged');\n assert.equal(lookupDescription, 'App.ScoobyDoo');\n });\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n }\n\n [`@test doesn't log without LOG_RESOLVER`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n let infoCount = 0;\n\n this.application.ScoobyDoo = _runtime.Object.extend();\n\n (0, _debug.setDebugFunction)('info', () => infoCount = infoCount + 1);\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n this.applicationInstance.resolveRegistration('doo:scrappy');\n assert.equal(infoCount, 0, 'console.info should not be called if LOG_RESOLVER is not set');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/normalization_test', ['@ember/runloop', '@ember/application', 'internal-test-helpers'], function (_runloop, _application, _internalTestHelpers) {\n 'use strict';\n\n let application, registry;\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - normalize', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n application = (0, _runloop.run)(_application.default, 'create');\n registry = application.__registry__;\n }\n\n teardown() {\n super.teardown();\n (0, _runloop.run)(application, 'destroy');\n application = undefined;\n registry = undefined;\n }\n\n ['@test normalization'](assert) {\n assert.ok(registry.normalize, 'registry#normalize is present');\n\n assert.equal(registry.normalize('foo:bar'), 'foo:bar');\n\n assert.equal(registry.normalize('controller:posts'), 'controller:posts');\n assert.equal(registry.normalize('controller:posts_index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts.index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts-index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts.post.index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts_post.index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts.post_index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts.post-index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:postsIndex'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:blogPosts.index'), 'controller:blogPostsIndex');\n assert.equal(registry.normalize('controller:blog/posts.index'), 'controller:blog/postsIndex');\n assert.equal(registry.normalize('controller:blog/posts-index'), 'controller:blog/postsIndex');\n assert.equal(registry.normalize('controller:blog/posts.post.index'), 'controller:blog/postsPostIndex');\n assert.equal(registry.normalize('controller:blog/posts_post.index'), 'controller:blog/postsPostIndex');\n assert.equal(registry.normalize('controller:blog/posts_post-index'), 'controller:blog/postsPostIndex');\n\n assert.equal(registry.normalize('template:blog/posts_index'), 'template:blog/posts_index');\n }\n\n ['@test normalization is indempotent'](assert) {\n let examples = ['controller:posts', 'controller:posts.post.index', 'controller:blog/posts.post_index', 'template:foo_bar'];\n\n examples.forEach(example => {\n assert.equal(registry.normalize(registry.normalize(example)), registry.normalize(example));\n });\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/to_string_test', ['@ember/polyfills', '@ember/-internals/utils', '@ember/-internals/runtime', 'internal-test-helpers'], function (_polyfills, _utils, _runtime, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - DefaultResolver#toString', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super();\n this.runTask(() => this.createApplication());\n this.application.Post = _runtime.Object.extend();\n }\n\n beforeEach() {\n return this.visit('/');\n }\n\n ['@test factories'](assert) {\n let PostFactory = this.applicationInstance.factoryFor('model:post').class;\n assert.equal(PostFactory.toString(), 'TestApp.Post', 'expecting the model to be post');\n }\n\n ['@test instances'](assert) {\n let post = this.applicationInstance.lookup('model:post');\n let guid = (0, _utils.guidFor)(post);\n\n assert.equal(post.toString(), '', 'expecting the model to be post');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Resolver#toString', class extends _internalTestHelpers.ApplicationTestCase {\n beforeEach() {\n return this.visit('/');\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n Resolver: class extends _internalTestHelpers.ModuleBasedTestResolver {\n makeToString(_, fullName) {\n return fullName;\n }\n }\n });\n }\n\n ['@test toString called on a resolver'](assert) {\n this.add('model:peter', _runtime.Object.extend());\n\n let peter = this.applicationInstance.lookup('model:peter');\n let guid = (0, _utils.guidFor)(peter);\n assert.equal(peter.toString(), ``, 'expecting the supermodel to be peter');\n }\n });\n});","enifed('@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 let originalLookup = _environment.context.lookup;\n let registry, locator, application;\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n application = (0, _runloop.run)(_application.default, 'create');\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\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\n registry = application.__registry__;\n locator = application.__container__;\n\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 container lookup is normalized'](assert) {\n let dotNotationController = locator.lookup('controller:post.index');\n let camelCaseController = locator.lookup('controller:postIndex');\n\n assert.ok(dotNotationController instanceof application.PostIndexController);\n assert.ok(camelCaseController instanceof application.PostIndexController);\n\n assert.equal(dotNotationController, camelCaseController);\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\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 ['@test injections'](assert) {\n application.inject('model', 'fruit', 'fruit:favorite');\n application.inject('model:user', 'communication', 'communication:main');\n\n let user = locator.lookup('model:user');\n let person = locator.lookup('model:person');\n let fruit = locator.lookup('fruit:favorite');\n\n assert.equal(user.get('fruit'), fruit);\n assert.equal(person.get('fruit'), fruit);\n\n assert.ok(application.Email.detectInstance(user.get('communication')));\n }\n });\n});","enifed('@ember/application/tests/initializers_test', ['@ember/polyfills', 'internal-test-helpers', '@ember/application'], function (_polyfills, _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 (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n let secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n let MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.initializer({ name: 'initializer' });\n });\n\n expectAssertion(() => {\n MyApplication.initializer({ initialize() {} });\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 let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n initialize() {\n throw new Error('boot failure');\n }\n });\n\n this.runTask(() => {\n this.createApplication({\n autoboot: false\n }, MyApplication);\n });\n\n let app = this.application;\n\n try {\n this.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 let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n initialize(App) {\n assert.ok(App instanceof _application.default, 'initialize is passed an Application');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.initializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\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 let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.initializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\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\n this.runTask(() => this.createApplication({}, MyApplication));\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = _application.default.extend();\n\n SecondApp.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = FirstApp.extend();\n SecondApp.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\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\n firstInitializerRunCount = 0;\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\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 let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(() => {\n FirstApp.initializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'abc',\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 let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n });\n});","enifed('@ember/application/tests/instance_initializers_test', ['@ember/polyfills', 'internal-test-helpers', '@ember/application/instance', '@ember/application'], function (_polyfills, _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 (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n let secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n let MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.instanceInitializer({ name: 'initializer' });\n });\n\n expectAssertion(() => {\n MyApplication.instanceInitializer({ initialize() {} });\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are passed an app instance`](assert) {\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'initializer',\n initialize(instance) {\n assert.ok(instance instanceof _instance.default, 'initialize is passed an application instance');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\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 let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\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\n this.runTask(() => this.createApplication({}, MyApplication));\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = FirstApp.extend();\n SecondApp.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\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\n firstInitializerRunCount = 0;\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\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 let FirstApp = _application.default.extend();\n FirstApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(function () {\n FirstApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\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 let MyApplication = _application.default.extend({\n ready() {\n assert.ok(true, 'ready is called');\n readyWasCalled = false;\n }\n });\n let readyWasCalled = false;\n\n MyApplication.instanceInitializer({\n name: 'initializer',\n initialize() {\n assert.ok(!readyWasCalled, 'ready is not yet called');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are executed in their own context`](assert) {\n assert.expect(1);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers get an instance on app reset`](assert) {\n assert.expect(2);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'giveMeAnInstance',\n initialize(instance) {\n assert.ok(!!instance, 'Initializer got an instance');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n this.runTask(() => this.application.reset());\n }\n });\n});","enifed('@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 let keys = Object.keys(_application._loaded);\n for (let 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 let count = 0;\n\n (0, _runloop.run)(function () {\n (0, _application.onLoad)('__test_hook__', function (object) {\n count += object;\n });\n });\n\n (0, _runloop.run)(function () {\n (0, _application.runLoadHooks)('__test_hook__', 1);\n });\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 let count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n\n (0, _runloop.run)(() => (0, _application.runLoadHooks)('__test_hook__', 1));\n\n count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n\n assert.equal(count, 1, 'the original object was passed into the load hook');\n }\n\n [\"@test hooks in ENV.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\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__before_ember_test_hook__', 1);\n });\n\n assert.equal(window.ENV.__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 let eventObject = 'super duper awesome events';\n\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\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__test_hook_for_events__', eventObject);\n });\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/application/tests/logging_test', ['internal-test-helpers', '@ember/controller', '@ember/-internals/routing', '@ember/polyfills'], function (_internalTestHelpers, _controller, _routing, _polyfills) {\n 'use strict';\n\n /*globals EmberDev */\n\n class LoggingApplicationTestCase extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.logs = {};\n\n /* eslint-disable no-console */\n this._originalLogger = console.info;\n\n console.info = (_, { fullName }) => {\n if (!this.logs.hasOwnProperty(fullName)) {\n this.logs[fullName] = 0;\n }\n /* eslint-ensable no-console */\n this.logs[fullName]++;\n };\n\n this.router.map(function () {\n this.route('posts', { resetNamespace: true });\n });\n }\n\n teardown() {\n /* eslint-disable no-console */\n console.info = this._originalLogger;\n /* eslint-enable no-console */\n super.teardown();\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Application with LOG_ACTIVE_GENERATION=true', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n LOG_ACTIVE_GENERATION: true\n });\n }\n\n ['@test log class generation if logging enabled'](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\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 (EmberDev && EmberDev.runningProdBuild) {\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\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\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\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 (0, _polyfills.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 (0, _polyfills.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 (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n this.addTemplate('application', '{{outlet}}');\n\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 (0, _polyfills.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});","enifed('@ember/application/tests/readiness_test', ['internal-test-helpers', '@ember/runloop', '@ember/application'], function (_internalTestHelpers, _runloop, _application) {\n 'use strict';\n\n let jQuery, application, Application;\n let readyWasCalled, domReady, readyCallbacks;\n\n // We are using a small mock of jQuery because jQuery is third-party code with\n // very well-defined semantics, and we want to confirm that a jQuery stub run\n // in a more minimal server environment that implements this behavior will be\n // sufficient for Ember's requirements.\n (0, _internalTestHelpers.moduleFor)('Application readiness', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n readyWasCalled = 0;\n readyCallbacks = [];\n\n let jQueryInstance = {\n ready(callback) {\n readyCallbacks.push(callback);\n if (jQuery.isReady) {\n domReady();\n }\n }\n };\n\n jQuery = function () {\n return jQueryInstance;\n };\n jQuery.isReady = false;\n\n let domReadyCalled = 0;\n domReady = function () {\n if (domReadyCalled !== 0) {\n return;\n }\n domReadyCalled++;\n for (let i = 0; i < readyCallbacks.length; i++) {\n readyCallbacks[i]();\n }\n };\n\n Application = _application.default.extend({\n $: jQuery,\n\n ready() {\n readyWasCalled++;\n }\n });\n }\n\n teardown() {\n if (application) {\n (0, _runloop.run)(() => application.destroy());\n jQuery = readyCallbacks = domReady = Application = application = undefined;\n }\n }\n\n // These tests are confirming that if the callbacks passed into jQuery's ready hook is called\n // synchronously during the application's initialization, we get the same behavior as if\n // it was triggered after initialization.\n\n [\"@test Application's ready event is called right away if jQuery is already ready\"](assert) {\n jQuery.isReady = true;\n\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n\n assert.equal(readyWasCalled, 0, 'ready is not called until later');\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called');\n\n domReady();\n\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 (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n });\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n domReady();\n\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 (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n application.deferReadiness();\n });\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n domReady();\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n (0, _runloop.run)(() => {\n application.advanceReadiness();\n assert.equal(readyWasCalled, 0);\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called now all readiness deferrals are advanced');\n }\n\n [\"@test Application's ready event can be deferred by other components\"](assert) {\n jQuery.isReady = false;\n\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n application.deferReadiness();\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n });\n\n domReady();\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n (0, _runloop.run)(() => {\n application.advanceReadiness();\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called now all readiness deferrals are advanced');\n\n expectAssertion(() => {\n application.deferReadiness();\n });\n }\n });\n});","enifed('@ember/application/tests/reset_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/controller', '@ember/-internals/routing', 'internal-test-helpers'], function (_runloop, _metal, _controller, _routing, _internalTestHelpers) {\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\n let didBecomeReady = false;\n\n (0, _runloop.run)(() => this.createApplication());\n\n (0, _runloop.run)(() => {\n this.application.ready = () => {\n didBecomeReady = true;\n };\n\n this.application.reset();\n\n this.application.deferReadiness();\n assert.ok(!didBecomeReady, 'app is not ready');\n });\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\n let firstController = this.applicationInstance.lookup('controller:academic');\n let secondController = this.applicationInstance.lookup('controller:academic');\n\n this.application.reset();\n\n let thirdController = this.applicationInstance.lookup('controller:academic');\n\n assert.strictEqual(firstController, secondController, 'controllers looked up in succession should be the same instance');\n\n assert.ok(firstController.isDestroying, 'controllers are destroyed when their application is reset');\n\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 let eventDispatcherWasSetup = 0;\n let eventDispatcherWasDestroyed = 0;\n\n let mockEventDispatcher = {\n setup() {\n eventDispatcherWasSetup++;\n },\n destroy() {\n eventDispatcherWasDestroyed++;\n }\n };\n\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('event_dispatcher:main', {\n create: () => mockEventDispatcher\n });\n\n assert.equal(eventDispatcherWasSetup, 0);\n assert.equal(eventDispatcherWasDestroyed, 0);\n });\n\n assert.equal(eventDispatcherWasSetup, 1);\n assert.equal(eventDispatcherWasDestroyed, 0);\n\n this.application.reset();\n\n assert.equal(eventDispatcherWasDestroyed, 1);\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\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n\n this.router.map(function () {\n this.route('one');\n this.route('two');\n });\n });\n\n let initialRouter, initialApplicationController;\n return this.visit('/one').then(() => {\n initialApplicationController = this.applicationInstance.lookup('controller:application');\n initialRouter = this.applicationInstance.lookup('router:main');\n let location = initialRouter.get('location');\n\n assert.equal(location.getURL(), '/one');\n assert.equal((0, _metal.get)(initialApplicationController, 'currentPath'), 'one');\n\n this.application.reset();\n\n return this.application._bootPromise;\n }).then(() => {\n let applicationController = this.applicationInstance.lookup('controller:application');\n assert.strictEqual(applicationController, undefined, 'application controller no longer exists');\n\n return this.visit('/one');\n }).then(() => {\n let applicationController = this.applicationInstance.lookup('controller:application');\n let router = this.applicationInstance.lookup('router:main');\n let location = router.get('location');\n\n assert.notEqual(initialRouter, router, 'a different router instance was created');\n assert.notEqual(initialApplicationController, applicationController, 'a different application controller is created');\n\n assert.equal(location.getURL(), '/one');\n assert.equal((0, _metal.get)(applicationController, '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 let readyCallCount = 0;\n\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\n (0, _runloop.run)(this.application, 'advanceReadiness');\n\n assert.equal(readyCallCount, 1, 'ready was called once');\n\n this.application.reset();\n\n assert.equal(readyCallCount, 2, 'ready was called twice');\n }\n });\n});","enifed('@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 _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 let templateContent = '
    Hi, Mom!
    ';\n this.addTemplate('index', templateContent);\n let rootElement = document.createElement('div');\n\n let bootOptions = {\n isBrowser: false,\n rootElement\n };\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\n let indexTemplate = '
    Hi, Mom!
    ';\n this.addTemplate('index', indexTemplate);\n let rootElement = document.createElement('div');\n\n let bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'serialize'\n };\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\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 this.runTask(() => {\n this.applicationInstance.destroy();\n this.applicationInstance = null;\n });\n }).then(() => {\n bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'rehydrate'\n };\n\n this.application.visit('/', bootOptions).then(instance => {\n assert.equal(instance.rootElement.innerHTML, indexTemplate, 'was not properly rehydrated');\n });\n });\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 [`@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 let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\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');\n\n // Continue after 500ms\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\n return this.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 let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\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 let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n initialize() {\n instanceBooted++;\n }\n });\n\n return this.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\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 /*\n * Destroy the instance.\n */\n return this.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 initialize() {\n throw new Error('boot failure');\n }\n });\n\n expectAsyncError();\n\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 initialize() {\n throw new Error('boot failure');\n }\n });\n\n expectAsyncError();\n\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', { path: '/b/:b' });\n this.route('c', { path: '/c/:c' });\n });\n\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n this.replaceWith('b', 'zomg');\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n this.transitionTo('c', params.b);\n }\n }));\n\n /*\n * First call to `visit` is `this.application.visit` and returns the\n * applicationInstance.\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', { path: '/b/:b' });\n this.route('c', { path: '/c/:c' });\n });\n\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n this.replaceWith('b', 'zomg');\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n this.transitionTo('c', params.b);\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\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\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\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\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\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\n this.assertEmptyFixture();\n\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\n this.addTemplate('application', '

    Hello world

    ');\n\n this.assertEmptyFixture();\n\n return this.visit('/', { shouldRender: false }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n\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\n this.addTemplate('application', '

    Hello world

    ');\n\n this.assertEmptyFixture();\n\n return this.visit('/', { shouldRender: true }).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\n this.router.map(function () {\n this.mount('blog');\n });\n\n this.addTemplate('application', '

    Hello world

    ');\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: false }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n\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\n this.router.map(function () {\n this.mount('blog');\n });\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\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\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 this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { isInteractive: false }).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\n this.router.map(function () {\n this.mount('blog');\n });\n\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\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 this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: true }).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\n this.router.map(function () {\n this.mount('blog');\n });\n\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\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 this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n assert.strictEqual(this.element.textContent, 'turnt up', 'Engine component is resolved');\n });\n }\n\n [`@test Ember Islands-style setup`](assert) {\n let xFooInitCalled = false;\n let xFooDidInsertElementCalled = false;\n\n let xBarInitCalled = false;\n let xBarDidInsertElementCalled = false;\n\n this.router.map(function () {\n this.route('show', { path: '/:component_name' });\n });\n\n this.add('route:show', _routing.Route.extend({\n queryParams: {\n data: { refreshModel: true }\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 let Counter = _runtime.Object.extend({\n value: 0,\n\n increment() {\n this.incrementProperty('value');\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\n this.addTemplate('show', '{{component model.componentName model=model.componentData}}');\n\n this.addTemplate('components/x-foo', `\n

    X-Foo

    \n

    Hello {{model.name}}, I have been clicked {{isolatedCounter.value}} times ({{sharedCounter.value}} times combined)!

    \n `);\n\n this.add('component:x-foo', _glimmer.Component.extend({\n tagName: 'x-foo',\n\n isolatedCounter: (0, _service.inject)(),\n sharedCounter: (0, _service.inject)(),\n\n init() {\n this._super();\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 \n `);\n\n this.add('component:x-bar', _glimmer.Component.extend({\n counter: (0, _service.inject)('sharedCounter'),\n\n actions: {\n incrementCounter() {\n this.get('counter').increment();\n }\n },\n\n init() {\n this._super();\n xBarInitCalled = true;\n },\n\n didInsertElement() {\n xBarDidInsertElementCalled = true;\n }\n }));\n\n let fixtureElement = document.querySelector('#qunit-fixture');\n let foo = document.createElement('div');\n let bar = document.createElement('div');\n fixtureElement.appendChild(foo);\n fixtureElement.appendChild(bar);\n\n let data = encodeURIComponent(JSON.stringify({ name: 'Godfrey' }));\n let instances = [];\n\n return _runtime.RSVP.all([this.runTask(() => {\n return this.application.visit(`/x-foo?data=${data}`, {\n rootElement: foo\n });\n }), this.runTask(() => {\n return this.application.visit('/x-bar', { rootElement: bar });\n })]).then(_instances => {\n instances = _instances;\n\n assert.ok(xFooInitCalled);\n assert.ok(xFooDidInsertElementCalled);\n\n assert.ok(xBarInitCalled);\n assert.ok(xBarDidInsertElementCalled);\n\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\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\n this.runTask(() => {\n this.click(foo.querySelector('x-foo'));\n });\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\n this.runTask(() => {\n this.click(bar.querySelector('button'));\n this.click(bar.querySelector('button'));\n });\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 this.runTask(() => {\n instances.forEach(instance => {\n instance.destroy();\n });\n });\n });\n }\n });\n});","enifed('@ember/canary-features/index', ['exports', '@ember/-internals/environment', '@ember/polyfills'], function (exports, _environment, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n exports.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION = exports.EMBER_TEMPLATE_BLOCK_LET_HELPER = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.EMBER_METAL_TRACKED_PROPERTIES = exports.EMBER_MODULE_UNIFICATION = exports.EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_LIBRARIES_ISREGISTERED = exports.FEATURES = exports.DEFAULT_FEATURES = undefined;\n exports.isEnabled = isEnabled;\n\n /**\n Set `EmberENV.FEATURES` in your application's `config/environment.js` file\n to enable canary features in your application.\n \n See the [feature flag guide](https://guides.emberjs.com/release/configuring-ember/feature-flags/)\n for more details.\n \n @module @ember/canary-features\n @public\n */\n const DEFAULT_FEATURES = exports.DEFAULT_FEATURES = {\n EMBER_LIBRARIES_ISREGISTERED: false,\n EMBER_IMPROVED_INSTRUMENTATION: false,\n EMBER_GLIMMER_NAMED_ARGUMENTS: true,\n EMBER_ROUTING_ROUTER_SERVICE: true,\n EMBER_ENGINES_MOUNT_PARAMS: true,\n EMBER_MODULE_UNIFICATION: false,\n GLIMMER_CUSTOM_COMPONENT_MANAGER: true,\n EMBER_TEMPLATE_BLOCK_LET_HELPER: true,\n EMBER_METAL_TRACKED_PROPERTIES: false,\n EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION: true\n };\n /**\n The hash of enabled Canary features. Add to this, any canary features\n before creating your application.\n \n @class FEATURES\n @static\n @since 1.1.0\n @public\n */\n const FEATURES = exports.FEATURES = (0, _polyfills.assign)(DEFAULT_FEATURES, _environment.ENV.FEATURES);\n /**\n Determine whether the specified `feature` is enabled. Used by Ember's\n build tools to exclude experimental features from beta/stable builds.\n \n You can define the following configuration options:\n \n * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly\n enabled/disabled.\n \n @method isEnabled\n @param {String} feature The feature to check\n @return {Boolean}\n @since 1.1.0\n @public\n */\n function isEnabled(feature) {\n let featureValue = FEATURES[feature];\n if (featureValue === true || featureValue === false) {\n return featureValue;\n } else if (_environment.ENV.ENABLE_OPTIONAL_FEATURES) {\n return true;\n } else {\n return false;\n }\n }\n function featureValue(value) {\n if (_environment.ENV.ENABLE_OPTIONAL_FEATURES && value === null) {\n return true;\n }\n return value;\n }\n const EMBER_LIBRARIES_ISREGISTERED = exports.EMBER_LIBRARIES_ISREGISTERED = featureValue(FEATURES.EMBER_LIBRARIES_ISREGISTERED);\n const EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_IMPROVED_INSTRUMENTATION = featureValue(FEATURES.EMBER_IMPROVED_INSTRUMENTATION);\n const EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = featureValue(FEATURES.EMBER_GLIMMER_NAMED_ARGUMENTS);\n const EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_ROUTING_ROUTER_SERVICE = featureValue(FEATURES.EMBER_ROUTING_ROUTER_SERVICE);\n const EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ENGINES_MOUNT_PARAMS = featureValue(FEATURES.EMBER_ENGINES_MOUNT_PARAMS);\n const EMBER_MODULE_UNIFICATION = exports.EMBER_MODULE_UNIFICATION = featureValue(FEATURES.EMBER_MODULE_UNIFICATION);\n const EMBER_METAL_TRACKED_PROPERTIES = exports.EMBER_METAL_TRACKED_PROPERTIES = featureValue(FEATURES.EMBER_METAL_TRACKED_PROPERTIES);\n const GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = featureValue(FEATURES.GLIMMER_CUSTOM_COMPONENT_MANAGER);\n const EMBER_TEMPLATE_BLOCK_LET_HELPER = exports.EMBER_TEMPLATE_BLOCK_LET_HELPER = featureValue(FEATURES.EMBER_TEMPLATE_BLOCK_LET_HELPER);\n const EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION = exports.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION = featureValue(FEATURES.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION);\n});","enifed('@ember/controller/index', ['exports', '@ember/-internals/runtime', '@ember/controller/lib/controller_mixin', '@ember/-internals/metal'], function (exports, _runtime, _controller_mixin, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.inject = inject;\n\n\n /**\n @module @ember/controller\n */\n\n /**\n @class Controller\n @extends EmberObject\n @uses Ember.ControllerMixin\n @public\n */\n const Controller = _runtime.Object.extend(_controller_mixin.default);\n\n /**\n Creates a property that lazily looks up another controller in the container.\n Can only be used when defining another controller.\n \n Example:\n \n ```app/controllers/post.js\n import Controller, {\n inject as controller\n } from '@ember/controller';\n \n export default Controller.extend({\n posts: controller()\n });\n ```\n \n This example will create a `posts` property on the `post` controller that\n looks up the `posts` controller in the container, making it easy to\n reference other controllers.\n \n @method inject\n @static\n @for @ember/controller\n @since 1.10.0\n @param {String} name (optional) name of the controller to inject, defaults\n to the property's name\n @return {Ember.InjectedProperty} injection descriptor instance\n @public\n */\n function inject(name, options) {\n return new _metal.InjectedProperty('controller', name, options);\n }\n\n exports.default = Controller;\n});","enifed('@ember/controller/lib/controller_mixin', ['exports', '@ember/-internals/metal', '@ember/-internals/runtime'], function (exports, _metal, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = _metal.Mixin.create(_runtime.ActionHandler, {\n /* ducktype as a controller */\n isController: true,\n\n /**\n The object to which actions from the view should be sent.\n For example, when a Handlebars template uses the `{{action}}` helper,\n it will attempt to send the action to the view's controller's `target`.\n By default, the value of the target property is set to the router, and\n is injected when a controller is instantiated. This injection is applied\n as part of the application's initialization process. In most cases the\n `target` property will automatically be set to the logical consumer of\n actions for the controller.\n @property target\n @default null\n @public\n */\n target: null,\n\n store: null,\n\n /**\n The controller's current model. When retrieving or modifying a controller's\n model, this property should be used instead of the `content` property.\n @property model\n @public\n */\n model: null\n });\n});","enifed('@ember/controller/tests/controller_test', ['@ember/controller', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _service, _runtime, _metal, _internalTestHelpers) {\n 'use strict';\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 let TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked');\n }\n }\n });\n let 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 let TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 1');\n return true;\n }\n }\n });\n\n let controller = TestController.create({\n target: _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 2');\n }\n }\n }).create()\n });\n controller.send('poke');\n }\n\n [\"@test Action can be handled by a superclass' actions object\"](assert) {\n assert.expect(4);\n\n let SuperController = _controller.default.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let BarControllerMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\n }\n }\n });\n\n let IndexController = SuperController.extend(BarControllerMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n }\n });\n\n let 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 let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:application', _controller.default.extend({\n toString() {\n return 'controller:rip-alley';\n }\n }));\n\n let controller = owner.lookup('controller:application');\n (0, _internalTestHelpers.runDestroy)(owner);\n\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 let controller;\n\n ignoreDeprecation(function () {\n controller = _controller.default.extend({\n content: 'foo-bar'\n }).create();\n });\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 let 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 let controller = _controller.default.extend({\n content: 'foo-bar',\n model: 'blammo'\n }).create();\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 let owner = (0, _internalTestHelpers.buildOwner)();\n\n let 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\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 let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:post', _controller.default.extend({\n postsController: (0, _controller.inject)('posts')\n }));\n\n owner.register('controller:posts', _controller.default.extend());\n\n let postController = owner.lookup('controller:post');\n let postsController = owner.lookup('controller:posts');\n\n assert.equal(postsController, postController.get('postsController'), 'controller.posts is injected');\n }\n\n ['@test services can be injected into controllers'](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:application', _controller.default.extend({\n authService: (0, _service.inject)('auth')\n }));\n\n owner.register('service:auth', _service.default.extend());\n\n let appController = owner.lookup('controller:application');\n let authService = owner.lookup('service:auth');\n\n assert.equal(authService, appController.get('authService'), 'service.auth is injected');\n }\n });\n});","enifed('@ember/debug/index', ['exports', '@ember/debug/lib/warn', '@ember/debug/lib/deprecate', '@ember/debug/lib/testing', '@ember/-internals/browser-environment', '@ember/error', '@glimmer/env'], function (exports, _warn2, _deprecate2, _testing, _browserEnvironment, _error, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;\n Object.defineProperty(exports, 'registerWarnHandler', {\n enumerable: true,\n get: function () {\n return _warn2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'registerDeprecationHandler', {\n enumerable: true,\n get: function () {\n return _deprecate2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'isTesting', {\n enumerable: true,\n get: function () {\n return _testing.isTesting;\n }\n });\n Object.defineProperty(exports, 'setTesting', {\n enumerable: true,\n get: function () {\n return _testing.setTesting;\n }\n });\n\n // These are the default production build versions:\n const noop = () => {};\n let assert = noop;\n let info = noop;\n let warn = noop;\n let debug = noop;\n let deprecate = noop;\n let debugSeal = noop;\n let debugFreeze = noop;\n let runInDebug = noop;\n let setDebugFunction = noop;\n let getDebugFunction = noop;\n let deprecateFunc = function () {\n return arguments[arguments.length - 1];\n };\n if (_env.DEBUG) {\n exports.setDebugFunction = setDebugFunction = function (type, callback) {\n switch (type) {\n case 'assert':\n return exports.assert = assert = callback;\n case 'info':\n return exports.info = info = callback;\n case 'warn':\n return exports.warn = warn = callback;\n case 'debug':\n return exports.debug = debug = callback;\n case 'deprecate':\n return exports.deprecate = deprecate = callback;\n case 'debugSeal':\n return exports.debugSeal = debugSeal = callback;\n case 'debugFreeze':\n return exports.debugFreeze = debugFreeze = callback;\n case 'runInDebug':\n return exports.runInDebug = runInDebug = callback;\n case 'deprecateFunc':\n return exports.deprecateFunc = deprecateFunc = callback;\n }\n };\n exports.getDebugFunction = getDebugFunction = function (type) {\n switch (type) {\n case 'assert':\n return assert;\n case 'info':\n return info;\n case 'warn':\n return warn;\n case 'debug':\n return debug;\n case 'deprecate':\n return deprecate;\n case 'debugSeal':\n return debugSeal;\n case 'debugFreeze':\n return debugFreeze;\n case 'runInDebug':\n return runInDebug;\n case 'deprecateFunc':\n return deprecateFunc;\n }\n };\n }\n /**\n @module @ember/debug\n */\n if (_env.DEBUG) {\n /**\n Verify that a certain expectation is met, or throw a exception otherwise.\n This is useful for communicating assumptions in the code to other human\n readers as well as catching bugs that accidentally violates these\n expectations.\n Assertions are removed from production builds, so they can be freely added\n for documentation and debugging purposes without worries of incuring any\n performance penalty. However, because of that, they should not be used for\n checks that could reasonably fail during normal usage. Furthermore, care\n should be taken to avoid accidentally relying on side-effects produced from\n evaluating the condition itself, since the code will not run in production.\n ```javascript\n import { assert } from '@ember/debug';\n // Test for truthiness\n assert('Must pass a string', typeof str === 'string');\n // Fail unconditionally\n assert('This code path should never be run');\n ```\n @method assert\n @static\n @for @ember/debug\n @param {String} description Describes the expectation. This will become the\n text of the Error thrown if the assertion fails.\n @param {Boolean} condition Must be truthy for the assertion to pass. If\n falsy, an exception will be thrown.\n @public\n @since 1.0.0\n */\n setDebugFunction('assert', function assert(desc, test) {\n if (!test) {\n throw new _error.default(`Assertion Failed: ${desc}`);\n }\n });\n /**\n Display a debug notice.\n Calls to this function are removed from production builds, so they can be\n freely added for documentation and debugging purposes without worries of\n incuring any performance penalty.\n ```javascript\n import { debug } from '@ember/debug';\n debug('I\\'m a debug notice!');\n ```\n @method debug\n @for @ember/debug\n @static\n @param {String} message A debug message to display.\n @public\n */\n setDebugFunction('debug', function debug(message) {\n /* eslint-disable no-console */\n if (console.debug) {\n console.debug(`DEBUG: ${message}`);\n } else {\n console.log(`DEBUG: ${message}`);\n }\n /* eslint-ensable no-console */\n });\n /**\n Display an info notice.\n Calls to this function are removed from production builds, so they can be\n freely added for documentation and debugging purposes without worries of\n incuring any performance penalty.\n @method info\n @private\n */\n setDebugFunction('info', function info() {\n console.info(...arguments); /* eslint-disable-line no-console */\n });\n /**\n @module @ember/application\n @public\n */\n /**\n Alias an old, deprecated method with its new counterpart.\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only) when the assigned method is called.\n Calls to this function are removed from production builds, so they can be\n freely added for documentation and debugging purposes without worries of\n incuring any performance penalty.\n ```javascript\n import { deprecateFunc } from '@ember/application/deprecations';\n Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);\n ```\n @method deprecateFunc\n @static\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Object} [options] The options object for `deprecate`.\n @param {Function} func The new function called to replace its deprecated counterpart.\n @return {Function} A new function that wraps the original function with a deprecation warning\n @private\n */\n setDebugFunction('deprecateFunc', function deprecateFunc(...args) {\n if (args.length === 3) {\n let [message, options, func] = args;\n return function () {\n deprecate(message, false, options);\n return func.apply(this, arguments);\n };\n } else {\n let [message, func] = args;\n return function () {\n deprecate(message);\n return func.apply(this, arguments);\n };\n }\n });\n /**\n @module @ember/debug\n @public\n */\n /**\n Run a function meant for debugging.\n Calls to this function are removed from production builds, so they can be\n freely added for documentation and debugging purposes without worries of\n incuring any performance penalty.\n ```javascript\n import Component from '@ember/component';\n import { runInDebug } from '@ember/debug';\n runInDebug(() => {\n Component.reopen({\n didInsertElement() {\n console.log(\"I'm happy\");\n }\n });\n });\n ```\n @method runInDebug\n @for @ember/debug\n @static\n @param {Function} func The function to be executed.\n @since 1.5.0\n @public\n */\n setDebugFunction('runInDebug', function runInDebug(func) {\n func();\n });\n setDebugFunction('debugSeal', function debugSeal(obj) {\n Object.seal(obj);\n });\n setDebugFunction('debugFreeze', function debugFreeze(obj) {\n Object.freeze(obj);\n });\n setDebugFunction('deprecate', _deprecate2.default);\n setDebugFunction('warn', _warn2.default);\n }\n let _warnIfUsingStrippedFeatureFlags;\n if (_env.DEBUG && !(0, _testing.isTesting)()) {\n if (typeof window !== 'undefined' && (_browserEnvironment.isFirefox || _browserEnvironment.isChrome) && window.addEventListener) {\n window.addEventListener('load', () => {\n if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {\n let downloadURL;\n if (_browserEnvironment.isChrome) {\n downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n } else if (_browserEnvironment.isFirefox) {\n downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n }\n debug(`For more advanced debugging, install the Ember Inspector from ${downloadURL}`);\n }\n }, false);\n }\n }\n exports.assert = assert;\n exports.info = info;\n exports.warn = warn;\n exports.debug = debug;\n exports.deprecate = deprecate;\n exports.debugSeal = debugSeal;\n exports.debugFreeze = debugFreeze;\n exports.runInDebug = runInDebug;\n exports.deprecateFunc = deprecateFunc;\n exports.setDebugFunction = setDebugFunction;\n exports.getDebugFunction = getDebugFunction;\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n});","enifed('@ember/debug/lib/deprecate', ['exports', '@ember/-internals/environment', '@glimmer/env', '@ember/debug/index', '@ember/debug/lib/handlers'], function (exports, _environment, _env, _index, _handlers) {\n 'use strict';\n\n exports.__esModule = true;\n exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Allows for runtime registration of handler functions that override the default deprecation behavior.\n Deprecations are invoked by calls to [@ember/application/deprecations/deprecate](https://emberjs.com/api/ember/release/classes/@ember%2Fapplication%2Fdeprecations/methods/deprecate?anchor=deprecate).\n The following example demonstrates its usage by registering a handler that throws an error if the\n message contains the word \"should\", otherwise defers to the default handler.\n \n ```javascript\n import { registerDeprecationHandler } from '@ember/debug';\n \n registerDeprecationHandler((message, options, next) => {\n if (message.indexOf('should') !== -1) {\n throw new Error(`Deprecation message with should: ${message}`);\n } else {\n // defer to whatever handler was registered before this one\n next(message, options);\n }\n });\n ```\n \n The handler function takes the following arguments:\n \n
      \n
    • message - The message received from the deprecation call.
    • \n
    • options - An object passed in with the deprecation call containing additional information including:
    • \n
        \n
      • id - An id of the deprecation in the form of package-name.specific-deprecation.
      • \n
      • until - The Ember version number the feature and deprecation will be removed in.
      • \n
      \n
    • next - A function that calls into the previously registered handler.
    • \n
    \n \n @public\n @static\n @method registerDeprecationHandler\n @for @ember/debug\n @param handler {Function} A function to handle deprecation calls.\n @since 2.1.0\n */\n let registerHandler = () => {};\n let missingOptionsDeprecation;\n let missingOptionsIdDeprecation;\n let missingOptionsUntilDeprecation;\n let deprecate = () => {};\n if (_env.DEBUG) {\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('deprecate', handler);\n };\n let formatMessage = function formatMessage(_message, options) {\n let message = _message;\n if (options && options.id) {\n message = message + ` [deprecation id: ${options.id}]`;\n }\n if (options && options.url) {\n message += ` See ${options.url} for more details.`;\n }\n return message;\n };\n registerHandler(function logDeprecationToConsole(message, options) {\n let updatedMessage = formatMessage(message, options);\n console.warn(`DEPRECATION: ${updatedMessage}`); // eslint-disable-line no-console\n });\n let captureErrorForStack;\n if (new Error().stack) {\n captureErrorForStack = () => new Error();\n } else {\n captureErrorForStack = () => {\n try {\n __fail__.fail();\n } catch (e) {\n return e;\n }\n };\n }\n registerHandler(function logDeprecationStackTrace(message, options, next) {\n if (_environment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {\n let stackStr = '';\n let error = captureErrorForStack();\n let stack;\n if (error.stack) {\n if (error['arguments']) {\n // Chrome\n stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n stack.shift();\n } else {\n // Firefox\n stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n }\n stackStr = `\\n ${stack.slice(2).join('\\n ')}`;\n }\n let updatedMessage = formatMessage(message, options);\n console.warn(`DEPRECATION: ${updatedMessage}${stackStr}`); // eslint-disable-line no-console\n } else {\n next(message, options);\n }\n });\n registerHandler(function raiseOnDeprecation(message, options, next) {\n if (_environment.ENV.RAISE_ON_DEPRECATION) {\n let updatedMessage = formatMessage(message);\n throw new Error(updatedMessage);\n } else {\n next(message, options);\n }\n });\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `deprecate` you must provide `until` in options.';\n /**\n @module @ember/application\n @public\n */\n /**\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only).\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method deprecate\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.\n @param {Object} options\n @param {String} options.id A unique id for this deprecation. The id can be\n used by Ember debugging tools to change the behavior (raise, log or silence)\n for that specific deprecation. The id should be namespaced by dots, e.g.\n \"view.helper.select\".\n @param {string} options.until The version of Ember when this deprecation\n warning will be removed.\n @param {String} [options.url] An optional url to the transition guide on the\n emberjs.com website.\n @static\n @public\n @since 1.0.0\n */\n deprecate = function deprecate(message, test, options) {\n (0, _index.assert)(missingOptionsDeprecation, !!(options && (options.id || options.until)));\n (0, _index.assert)(missingOptionsIdDeprecation, !!options.id);\n (0, _index.assert)(missingOptionsUntilDeprecation, !!options.until);\n (0, _handlers.invoke)('deprecate', message, test, options);\n };\n }\n exports.default = deprecate;\n exports.registerHandler = registerHandler;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;\n});","enifed('@ember/debug/lib/handlers', ['exports', '@glimmer/env'], function (exports, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.invoke = exports.registerHandler = exports.HANDLERS = undefined;\n let HANDLERS = exports.HANDLERS = {};\n let registerHandler = () => {};\n let invoke = () => {};\n if (_env.DEBUG) {\n exports.registerHandler = registerHandler = function registerHandler(type, callback) {\n let nextHandler = HANDLERS[type] || (() => {});\n HANDLERS[type] = (message, options) => {\n callback(message, options, nextHandler);\n };\n };\n exports.invoke = invoke = function invoke(type, message, test, options) {\n if (test) {\n return;\n }\n let handlerForType = HANDLERS[type];\n if (handlerForType) {\n handlerForType(message, options);\n }\n };\n }\n exports.registerHandler = registerHandler;\n exports.invoke = invoke;\n});","enifed(\"@ember/debug/lib/testing\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.isTesting = isTesting;\n exports.setTesting = setTesting;\n let testing = false;\n function isTesting() {\n return testing;\n }\n function setTesting(value) {\n testing = !!value;\n }\n});","enifed('@ember/debug/lib/warn', ['exports', '@glimmer/env', '@ember/debug/index', '@ember/debug/lib/handlers'], function (exports, _env, _index, _handlers) {\n 'use strict';\n\n exports.__esModule = true;\n exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;\n\n let registerHandler = () => {};\n let warn = () => {};\n let missingOptionsDeprecation;\n let missingOptionsIdDeprecation;\n /**\n @module @ember/debug\n */\n if (_env.DEBUG) {\n /**\n Allows for runtime registration of handler functions that override the default warning behavior.\n Warnings are invoked by calls made to [@ember/debug/warn](https://emberjs.com/api/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).\n The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n default warning behavior.\n ```javascript\n import { registerWarnHandler } from '@ember/debug';\n // next is not called, so no warnings get the default behavior\n registerWarnHandler(() => {});\n ```\n The handler function takes the following arguments:\n
      \n
    • message - The message received from the warn call.
    • \n
    • options - An object passed in with the warn call containing additional information including:
    • \n
        \n
      • id - An id of the warning in the form of package-name.specific-warning.
      • \n
      \n
    • next - A function that calls into the previously registered handler.
    • \n
    \n @public\n @static\n @method registerWarnHandler\n @for @ember/debug\n @param handler {Function} A function to handle warnings.\n @since 2.1.0\n */\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('warn', handler);\n };\n registerHandler(function logWarning(message) {\n /* eslint-disable no-console */\n console.warn(`WARNING: ${message}`);\n if (console.trace) {\n console.trace();\n }\n /* eslint-enable no-console */\n });\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';\n /**\n Display a warning with the provided message.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { warn } from '@ember/debug';\n import tomsterCount from './tomster-counter'; // a module in my project\n // Log a warning if we have more than 3 tomsters\n warn('Too many tomsters!', tomsterCount <= 3, {\n id: 'ember-debug.too-many-tomsters'\n });\n ```\n @method warn\n @for @ember/debug\n @static\n @param {String} message A warning to display.\n @param {Boolean} test An optional boolean. If falsy, the warning\n will be displayed.\n @param {Object} options An object that can be used to pass a unique\n `id` for this warning. The `id` can be used by Ember debugging tools\n to change the behavior (raise, log, or silence) for that specific warning.\n The `id` should be namespaced by dots, e.g. \"ember-debug.feature-flag-with-features-stripped\"\n @public\n @since 1.0.0\n */\n warn = function warn(message, test, options) {\n if (arguments.length === 2 && typeof test === 'object') {\n options = test;\n test = false;\n }\n (0, _index.assert)(missingOptionsDeprecation, !!options);\n (0, _index.assert)(missingOptionsIdDeprecation, !!(options && options.id));\n (0, _handlers.invoke)('warn', message, test, options);\n };\n }\n exports.default = warn;\n exports.registerHandler = registerHandler;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n});","enifed('@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\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\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\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\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\n next(message, options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test handlers are called in the proper order'](assert) {\n assert.expect(11);\n\n let expectedMessage = 'This is the message';\n let expectedOptions = { id: 'foo-bar' };\n let expected = ['first', 'second', 'third', 'fourth', 'fifth'];\n let 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\n actualCalls.push(item);\n\n next(message, options);\n };\n }\n\n expected.forEach(item => (0, _handlers.registerHandler)('blarz', generateHandler(item)));\n\n (0, _handlers.invoke)('blarz', expectedMessage, false, expectedOptions);\n\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\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\n let initialMessage = 'initial message';\n let initialOptions = { id: 'initial-options' };\n\n let handler2Message = 'Handler2 Message';\n let handler2Options = { id: 'handler-2' };\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\n next(handler2Message, handler2Options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n\n (0, _handlers.invoke)('blarz', initialMessage, false, initialOptions);\n }\n });\n});","enifed('@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 let originalEnvValue;\n let originalDeprecateHandler;\n let originalWarnHandler;\n\n const originalConsoleWarn = console.warn; // eslint-disable-line no-console\n const noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('ember-debug', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n originalEnvValue = _environment.ENV.RAISE_ON_DEPRECATION;\n originalDeprecateHandler = _handlers.HANDLERS.deprecate;\n originalWarnHandler = _handlers.HANDLERS.warn;\n\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n }\n\n teardown() {\n _handlers.HANDLERS.deprecate = originalDeprecateHandler;\n _handlers.HANDLERS.warn = originalWarnHandler;\n\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, { id: 'test', until: 'forever' });\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, { id: 'test', until: 'forever' });\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\n assert.throws(() => {\n (0, _index.deprecate)('Should throw', false, { id: 'test', until: 'forever' });\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\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 });\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 });\n }, /Should throw with no matching id/);\n\n assert.throws(() => {\n (0, _index.deprecate)('Should throw with non-matching id', false, {\n id: 'other-id',\n until: 'forever'\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\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', false, {\n id: 'test',\n until: 'forever'\n }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', '', { id: 'test', until: 'forever' }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', 0, { id: 'test', until: 'forever' }));\n }\n\n ['@test deprecate does not invoke a function as the second argument'](assert) {\n assert.expect(1);\n\n (0, _index.deprecate)('Deprecation is thrown', function () {\n assert.ok(false, 'this function should not be invoked');\n }, { id: 'test', until: 'forever' });\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\n (0, _index.deprecate)('Deprecation is thrown', true, {\n id: 'test',\n until: 'forever'\n });\n (0, _index.deprecate)('Deprecation is thrown', '1', { id: 'test', until: 'forever' });\n (0, _index.deprecate)('Deprecation is thrown', 1, { id: 'test', until: 'forever' });\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\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\n (0, _index.assert)('Assertion is thrown', () => true);\n\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\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\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 let Igor = _runtime.Object.extend();\n\n (0, _index.assert)('is truthy', Igor);\n (0, _index.assert)('is truthy', Igor.create());\n\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 let id = 'ABC';\n let until = 'forever';\n let shouldThrow = false;\n\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, { id, until });\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, { id, until });\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\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, { id, until });\n });\n\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, { id, until });\n });\n }\n\n ['@test deprecate without options triggers an assertion'](assert) {\n assert.expect(2);\n\n assert.throws(() => (0, _index.deprecate)('foo'), new RegExp(_deprecate.missingOptionsDeprecation), 'proper assertion is triggered when options is missing');\n\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\n assert.throws(() => (0, _index.deprecate)('foo', false, { until: 'forever' }), 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\n assert.throws(() => (0, _index.deprecate)('foo', false, { id: 'test' }), new RegExp(_deprecate.missingOptionsUntilDeprecation), 'proper assertion is triggered when options.until is missing');\n }\n\n ['@test warn without options triggers an assert'](assert) {\n assert.expect(1);\n\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\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\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\n (0, _warn.registerHandler)(function (message) {\n assert.equal(message, 'foo', 'warning was triggered');\n });\n\n (0, _index.warn)('foo', { id: 'ember-debug.do-not-raise' });\n }\n });\n});","enifed('@ember/deprecated-features/index', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n const SEND_ACTION = exports.SEND_ACTION = !!'3.4.0';\n const EMBER_EXTEND_PROTOTYPES = exports.EMBER_EXTEND_PROTOTYPES = !!'3.2.0-beta.5';\n const RUN_SYNC = exports.RUN_SYNC = !!'3.0.0-beta.4';\n const LOGGER = exports.LOGGER = !!'3.2.0-beta.1';\n const POSITIONAL_PARAM_CONFLICT = exports.POSITIONAL_PARAM_CONFLICT = !!'3.1.0-beta.1';\n const PROPERTY_WILL_CHANGE = exports.PROPERTY_WILL_CHANGE = !!'3.1.0-beta.1';\n const PROPERTY_DID_CHANGE = exports.PROPERTY_DID_CHANGE = !!'3.1.0-beta.1';\n const ROUTER_ROUTER = exports.ROUTER_ROUTER = !!'3.2.0-beta.1';\n const ARRAY_AT_EACH = exports.ARRAY_AT_EACH = !!'3.1.0-beta.1';\n const TARGET_OBJECT = exports.TARGET_OBJECT = !!'2.18.0-beta.1';\n const MAP = exports.MAP = !!'3.3.0-beta.1';\n const ORDERED_SET = exports.ORDERED_SET = !!'3.3.0-beta.1';\n const MERGE = exports.MERGE = !!'3.6.0-beta.1';\n const HANDLER_INFOS = exports.HANDLER_INFOS = !!'3.9.0';\n const ROUTER_EVENTS = exports.ROUTER_EVENTS = !!'3.9.0';\n const TRANSITION_STATE = exports.TRANSITION_STATE = !!'3.9.0';\n});","enifed('@ember/engine/index', ['exports', '@ember/engine/lib/engine-parent', '@ember/-internals/utils', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/container', 'dag-map', '@ember/debug', '@ember/-internals/metal', '@ember/application/globals-resolver', '@ember/engine/instance', '@ember/-internals/routing', '@ember/-internals/extension-support', '@ember/-internals/views', '@ember/-internals/glimmer'], function (exports, _engineParent, _utils, _controller, _runtime, _container, _dagMap, _debug, _metal, _globalsResolver, _instance, _routing, _extensionSupport, _views, _glimmer) {\n 'use strict';\n\n exports.__esModule = true;\n exports.setEngineParent = exports.getEngineParent = undefined;\n Object.defineProperty(exports, 'getEngineParent', {\n enumerable: true,\n get: function () {\n return _engineParent.getEngineParent;\n }\n });\n Object.defineProperty(exports, 'setEngineParent', {\n enumerable: true,\n get: function () {\n return _engineParent.setEngineParent;\n }\n });\n\n\n function props(obj) {\n let properties = [];\n\n for (let key in obj) {\n properties.push(key);\n }\n\n return properties;\n }\n\n /**\n The `Engine` class contains core functionality for both applications and\n engines.\n \n Each engine manages a registry that's used for dependency injection and\n exposed through `RegistryProxy`.\n \n Engines also manage initializers and instance initializers.\n \n Engines can spawn `EngineInstance` instances via `buildInstance()`.\n \n @class Engine\n @extends Ember.Namespace\n @uses RegistryProxy\n @public\n */\n const Engine = _runtime.Namespace.extend(_runtime.RegistryProxyMixin, {\n init() {\n this._super(...arguments);\n\n this.buildRegistry();\n },\n\n /**\n A private flag indicating whether an engine's initializers have run yet.\n @private\n @property _initializersRan\n */\n _initializersRan: false,\n\n /**\n Ensure that initializers are run once, and only once, per engine.\n @private\n @method ensureInitializers\n */\n ensureInitializers() {\n if (!this._initializersRan) {\n this.runInitializers();\n this._initializersRan = true;\n }\n },\n\n /**\n Create an EngineInstance for this engine.\n @public\n @method buildInstance\n @return {EngineInstance} the engine instance\n */\n buildInstance(options = {}) {\n this.ensureInitializers();\n options.base = this;\n return _instance.default.create(options);\n },\n\n /**\n Build and configure the registry for the current engine.\n @private\n @method buildRegistry\n @return {Ember.Registry} the configured registry\n */\n buildRegistry() {\n let registry = this.__registry__ = this.constructor.buildRegistry(this);\n\n return registry;\n },\n\n /**\n @private\n @method initializer\n */\n initializer(options) {\n this.constructor.initializer(options);\n },\n\n /**\n @private\n @method instanceInitializer\n */\n instanceInitializer(options) {\n this.constructor.instanceInitializer(options);\n },\n\n /**\n @private\n @method runInitializers\n */\n runInitializers() {\n this._runInitializer('initializers', (name, initializer) => {\n (0, _debug.assert)(`No application initializer named '${name}'`, !!initializer);\n initializer.initialize(this);\n });\n },\n\n /**\n @private\n @since 1.12.0\n @method runInstanceInitializers\n */\n runInstanceInitializers(instance) {\n this._runInitializer('instanceInitializers', (name, initializer) => {\n (0, _debug.assert)(`No instance initializer named '${name}'`, !!initializer);\n initializer.initialize(instance);\n });\n },\n\n _runInitializer(bucketName, cb) {\n let initializersByName = (0, _metal.get)(this.constructor, bucketName);\n let initializers = props(initializersByName);\n let graph = new _dagMap.default();\n let initializer;\n\n for (let i = 0; i < initializers.length; i++) {\n initializer = initializersByName[initializers[i]];\n graph.add(initializer.name, initializer, initializer.before, initializer.after);\n }\n\n graph.topsort(cb);\n }\n });\n\n Engine.reopenClass({\n initializers: Object.create(null),\n instanceInitializers: Object.create(null),\n\n /**\n The goal of initializers should be to register dependencies and injections.\n This phase runs once. Because these initializers may load code, they are\n allowed to defer application readiness and advance it. If you need to access\n the container or store you should use an InstanceInitializer that will be run\n after all initializers and therefore after all code is loaded and the app is\n ready.\n Initializer receives an object which has the following attributes:\n `name`, `before`, `after`, `initialize`. The only required attribute is\n `initialize`, all others are optional.\n * `name` allows you to specify under which name the initializer is registered.\n This must be a unique name, as trying to register two initializers with the\n same name will result in an error.\n ```app/initializer/named-initializer.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Running namedInitializer!');\n }\n export default {\n name: 'named-initializer',\n initialize\n };\n ```\n * `before` and `after` are used to ensure that this initializer is ran prior\n or after the one identified by the value. This value can be a single string\n or an array of strings, referencing the `name` of other initializers.\n An example of ordering initializers, we create an initializer named `first`:\n ```app/initializer/first.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('First initializer!');\n }\n export default {\n name: 'first',\n initialize\n };\n ```\n ```bash\n // DEBUG: First initializer!\n ```\n We add another initializer named `second`, specifying that it should run\n after the initializer named `first`:\n ```app/initializer/second.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Second initializer!');\n }\n export default {\n name: 'second',\n after: 'first',\n initialize\n };\n ```\n ```\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n ```\n Afterwards we add a further initializer named `pre`, this time specifying\n that it should run before the initializer named `first`:\n ```app/initializer/pre.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Pre initializer!');\n }\n export default {\n name: 'pre',\n before: 'first',\n initialize\n };\n ```\n ```bash\n // DEBUG: Pre initializer!\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n ```\n Finally we add an initializer named `post`, specifying it should run after\n both the `first` and the `second` initializers:\n ```app/initializer/post.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Post initializer!');\n }\n export default {\n name: 'post',\n after: ['first', 'second'],\n initialize\n };\n ```\n ```bash\n // DEBUG: Pre initializer!\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n // DEBUG: Post initializer!\n ```\n * `initialize` is a callback function that receives one argument,\n `application`, on which you can operate.\n Example of using `application` to register an adapter:\n ```app/initializer/api-adapter.js\n import ApiAdapter from '../utils/api-adapter';\n export function initialize(application) {\n application.register('api-adapter:main', ApiAdapter);\n }\n export default {\n name: 'post',\n after: ['first', 'second'],\n initialize\n };\n ```\n @method initializer\n @param initializer {Object}\n @public\n */\n\n initializer: buildInitializerMethod('initializers', 'initializer'),\n\n /**\n Instance initializers run after all initializers have run. Because\n instance initializers run after the app is fully set up. We have access\n to the store, container, and other items. However, these initializers run\n after code has loaded and are not allowed to defer readiness.\n Instance initializer receives an object which has the following attributes:\n `name`, `before`, `after`, `initialize`. The only required attribute is\n `initialize`, all others are optional.\n * `name` allows you to specify under which name the instanceInitializer is\n registered. This must be a unique name, as trying to register two\n instanceInitializer with the same name will result in an error.\n ```app/initializer/named-instance-initializer.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Running named-instance-initializer!');\n }\n export default {\n name: 'named-instance-initializer',\n initialize\n };\n ```\n * `before` and `after` are used to ensure that this initializer is ran prior\n or after the one identified by the value. This value can be a single string\n or an array of strings, referencing the `name` of other initializers.\n * See Application.initializer for discussion on the usage of before\n and after.\n Example instanceInitializer to preload data into the store.\n ```app/initializer/preload-data.js\n import $ from 'jquery';\n export function initialize(application) {\n var userConfig, userConfigEncoded, store;\n // We have a HTML escaped JSON representation of the user's basic\n // configuration generated server side and stored in the DOM of the main\n // index.html file. This allows the app to have access to a set of data\n // without making any additional remote calls. Good for basic data that is\n // needed for immediate rendering of the page. Keep in mind, this data,\n // like all local models and data can be manipulated by the user, so it\n // should not be relied upon for security or authorization.\n // Grab the encoded data from the meta tag\n userConfigEncoded = $('head meta[name=app-user-config]').attr('content');\n // Unescape the text, then parse the resulting JSON into a real object\n userConfig = JSON.parse(unescape(userConfigEncoded));\n // Lookup the store\n store = application.lookup('service:store');\n // Push the encoded JSON into the store\n store.pushPayload(userConfig);\n }\n export default {\n name: 'named-instance-initializer',\n initialize\n };\n ```\n @method instanceInitializer\n @param instanceInitializer\n @public\n */\n instanceInitializer: buildInitializerMethod('instanceInitializers', 'instance initializer'),\n\n /**\n This creates a registry with the default Ember naming conventions.\n It also configures the registry:\n * registered views are created every time they are looked up (they are\n not singletons)\n * registered templates are not factories; the registered value is\n returned directly.\n * the router receives the application as its `namespace` property\n * all controllers receive the router as their `target` and `controllers`\n properties\n * all controllers receive the application as their `namespace` property\n * the application view receives the application controller as its\n `controller` property\n * the application view receives the application template as its\n `defaultTemplate` property\n @method buildRegistry\n @static\n @param {Application} namespace the application for which to\n build the registry\n @return {Ember.Registry} the built registry\n @private\n */\n buildRegistry(namespace) {\n let registry = new _container.Registry({\n resolver: resolverFor(namespace)\n });\n\n registry.set = _metal.set;\n\n registry.register('application:main', namespace, { instantiate: false });\n\n commonSetupRegistry(registry);\n (0, _glimmer.setupEngineRegistry)(registry);\n\n return registry;\n },\n\n /**\n Set this to provide an alternate class to `DefaultResolver`\n @deprecated Use 'Resolver' instead\n @property resolver\n @public\n */\n resolver: null,\n\n /**\n Set this to provide an alternate class to `DefaultResolver`\n @property resolver\n @public\n */\n Resolver: null\n });\n\n /**\n This function defines the default lookup rules for container lookups:\n \n * templates are looked up on `Ember.TEMPLATES`\n * other names are looked up on the application after classifying the name.\n For example, `controller:post` looks up `App.PostController` by default.\n * if the default lookup fails, look for registered classes on the container\n \n This allows the application to register default injections in the container\n that could be overridden by the normal naming convention.\n \n @private\n @method resolverFor\n @param {Ember.Namespace} namespace the namespace to look for classes\n @return {*} the resolved value for a given lookup\n */\n function resolverFor(namespace) {\n let ResolverClass = (0, _metal.get)(namespace, 'Resolver') || _globalsResolver.default;\n let props = { namespace };\n return ResolverClass.create(props);\n }\n\n function buildInitializerMethod(bucketName, humanName) {\n return function (initializer) {\n // If this is the first initializer being added to a subclass, we are going to reopen the class\n // to make sure we have a new `initializers` object, which extends from the parent class' using\n // prototypal inheritance. Without this, attempting to add initializers to the subclass would\n // pollute the parent class as well as other subclasses.\n if (this.superclass[bucketName] !== undefined && this.superclass[bucketName] === this[bucketName]) {\n let attrs = {};\n attrs[bucketName] = Object.create(this[bucketName]);\n this.reopenClass(attrs);\n }\n\n (0, _debug.assert)(`The ${humanName} '${initializer.name}' has already been registered`, !this[bucketName][initializer.name]);\n (0, _debug.assert)(`An ${humanName} cannot be registered without an initialize function`, (0, _utils.canInvoke)(initializer, 'initialize'));\n (0, _debug.assert)(`An ${humanName} cannot be registered without a name property`, initializer.name !== undefined);\n\n this[bucketName][initializer.name] = initializer;\n };\n }\n\n function commonSetupRegistry(registry) {\n registry.optionsForType('component', { singleton: false });\n registry.optionsForType('view', { singleton: false });\n\n registry.register('controller:basic', _controller.default, { instantiate: false });\n\n registry.injection('view', '_viewRegistry', '-view-registry:main');\n registry.injection('renderer', '_viewRegistry', '-view-registry:main');\n registry.injection('event_dispatcher:main', '_viewRegistry', '-view-registry:main');\n\n registry.injection('route', '_topLevelViewTemplate', 'template:-outlet');\n\n registry.injection('view:-outlet', 'namespace', 'application:main');\n\n registry.injection('controller', 'target', 'router:main');\n registry.injection('controller', 'namespace', 'application:main');\n\n registry.injection('router', '_bucketCache', _container.privatize`-bucket-cache:main`);\n registry.injection('route', '_bucketCache', _container.privatize`-bucket-cache:main`);\n\n registry.injection('route', '_router', 'router:main');\n\n // Register the routing service...\n registry.register('service:-routing', _routing.RoutingService);\n // Then inject the app router into it\n registry.injection('service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n registry.register('resolver-for-debugging:main', registry.resolver, {\n instantiate: false\n });\n registry.injection('container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n registry.injection('data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n // Custom resolver authors may want to register their own ContainerDebugAdapter with this key\n\n registry.register('container-debug-adapter:main', _extensionSupport.ContainerDebugAdapter);\n\n registry.register('component-lookup:main', _views.ComponentLookup);\n }\n\n exports.default = Engine;\n});","enifed('@ember/engine/instance', ['exports', '@ember/-internals/utils', '@ember/-internals/runtime', '@ember/debug', '@ember/error', '@ember/-internals/container', '@ember/engine/lib/engine-parent'], function (exports, _utils, _runtime, _debug, _error, _container, _engineParent) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n The `EngineInstance` encapsulates all of the stateful aspects of a\n running `Engine`.\n \n @public\n @class EngineInstance\n @extends EmberObject\n @uses RegistryProxyMixin\n @uses ContainerProxyMixin\n */\n\n /**\n @module @ember/engine\n */\n\n const EngineInstance = _runtime.Object.extend(_runtime.RegistryProxyMixin, _runtime.ContainerProxyMixin, {\n /**\n The base `Engine` for which this is an instance.\n @property {Engine} engine\n @private\n */\n base: null,\n\n init() {\n this._super(...arguments);\n\n (0, _utils.guidFor)(this);\n\n let base = this.base;\n\n if (!base) {\n base = this.application;\n this.base = base;\n }\n\n // Create a per-instance registry that will use the application's registry\n // as a fallback for resolving registrations.\n let registry = this.__registry__ = new _container.Registry({\n fallback: base.__registry__\n });\n\n // Create a per-instance container from the instance's registry\n this.__container__ = registry.container({ owner: this });\n\n this._booted = false;\n },\n\n /**\n Initialize the `EngineInstance` and return a promise that resolves\n with the instance itself when the boot process is complete.\n The primary task here is to run any registered instance initializers.\n See the documentation on `BootOptions` for the options it takes.\n @public\n @method boot\n @param options {Object}\n @return {Promise}\n */\n boot(options) {\n if (this._bootPromise) {\n return this._bootPromise;\n }\n\n this._bootPromise = new _runtime.RSVP.Promise(resolve => resolve(this._bootSync(options)));\n\n return this._bootPromise;\n },\n\n /**\n Unfortunately, a lot of existing code assumes booting an instance is\n synchronous – specifically, a lot of tests assume the last call to\n `app.advanceReadiness()` or `app.reset()` will result in a new instance\n being fully-booted when the current runloop completes.\n We would like new code (like the `visit` API) to stop making this\n assumption, so we created the asynchronous version above that returns a\n promise. But until we have migrated all the code, we would have to expose\n this method for use *internally* in places where we need to boot an instance\n synchronously.\n @private\n */\n _bootSync(options) {\n if (this._booted) {\n return this;\n }\n\n (0, _debug.assert)(\"An engine instance's parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.\", (0, _engineParent.getEngineParent)(this));\n\n this.cloneParentDependencies();\n\n this.setupRegistry(options);\n\n this.base.runInstanceInitializers(this);\n\n this._booted = true;\n\n return this;\n },\n\n setupRegistry(options = this.__container__.lookup('-environment:main')) {\n this.constructor.setupRegistry(this.__registry__, options);\n },\n\n /**\n Unregister a factory.\n Overrides `RegistryProxy#unregister` in order to clear any cached instances\n of the unregistered factory.\n @public\n @method unregister\n @param {String} fullName\n */\n unregister(fullName) {\n this.__container__.reset(fullName);\n this._super(...arguments);\n },\n\n /**\n Build a new `EngineInstance` that's a child of this instance.\n Engines must be registered by name with their parent engine\n (or application).\n @private\n @method buildChildEngineInstance\n @param name {String} the registered name of the engine.\n @param options {Object} options provided to the engine instance.\n @return {EngineInstance,Error}\n */\n buildChildEngineInstance(name, options = {}) {\n let Engine = this.lookup(`engine:${name}`);\n\n if (!Engine) {\n throw new _error.default(`You attempted to mount the engine '${name}', but it is not registered with its parent.`);\n }\n\n let engineInstance = Engine.buildInstance(options);\n\n (0, _engineParent.setEngineParent)(engineInstance, this);\n\n return engineInstance;\n },\n\n /**\n Clone dependencies shared between an engine instance and its parent.\n @private\n @method cloneParentDependencies\n */\n cloneParentDependencies() {\n let parent = (0, _engineParent.getEngineParent)(this);\n\n let registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment'];\n\n registrations.forEach(key => this.register(key, parent.resolveRegistration(key)));\n\n let env = parent.lookup('-environment:main');\n this.register('-environment:main', env, { instantiate: false });\n\n let singletons = ['router:main', _container.privatize`-bucket-cache:main`, '-view-registry:main', `renderer:-${env.isInteractive ? 'dom' : 'inert'}`, 'service:-document', _container.privatize`template-compiler:main`];\n\n if (env.isInteractive) {\n singletons.push('event_dispatcher:main');\n }\n\n singletons.forEach(key => this.register(key, parent.lookup(key), { instantiate: false }));\n\n this.inject('view', '_environment', '-environment:main');\n this.inject('route', '_environment', '-environment:main');\n }\n });\n\n EngineInstance.reopenClass({\n /**\n @private\n @method setupRegistry\n @param {Registry} registry\n @param {BootOptions} options\n */\n setupRegistry(registry, options) {\n // when no options/environment is present, do nothing\n if (!options) {\n return;\n }\n\n registry.injection('view', '_environment', '-environment:main');\n registry.injection('route', '_environment', '-environment:main');\n\n if (options.isInteractive) {\n registry.injection('view', 'renderer', 'renderer:-dom');\n registry.injection('component', 'renderer', 'renderer:-dom');\n } else {\n registry.injection('view', 'renderer', 'renderer:-inert');\n registry.injection('component', 'renderer', 'renderer:-inert');\n }\n }\n });\n\n exports.default = EngineInstance;\n});","enifed('@ember/engine/lib/engine-parent', ['exports', '@ember/-internals/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports.getEngineParent = getEngineParent;\n exports.setEngineParent = setEngineParent;\n\n\n const ENGINE_PARENT = (0, _utils.symbol)('ENGINE_PARENT');\n\n /**\n `getEngineParent` retrieves an engine instance's parent instance.\n \n @method getEngineParent\n @param {EngineInstance} engine An engine instance.\n @return {EngineInstance} The parent engine instance.\n @for @ember/engine\n @static\n @private\n */\n /**\n @module @ember/engine\n */\n function getEngineParent(engine) {\n return engine[ENGINE_PARENT];\n }\n\n /**\n `setEngineParent` sets an engine instance's parent instance.\n \n @method setEngineParent\n @param {EngineInstance} engine An engine instance.\n @param {EngineInstance} parent The parent engine instance.\n @private\n */\n function setEngineParent(engine, parent) {\n engine[ENGINE_PARENT] = parent;\n }\n});","enifed('@ember/engine/tests/engine_initializers_test', ['@ember/runloop', '@ember/engine', 'internal-test-helpers'], function (_runloop, _engine, _internalTestHelpers) {\n 'use strict';\n\n let MyEngine, myEngine, myEngineInstance;\n\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\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({ name: 'initializer' });\n });\n });\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({ initialize() {} });\n });\n });\n }\n\n ['@test initializers are passed an Engine'](assert) {\n MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'initializer',\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 let order = [];\n\n MyEngine = _engine.default.extend();\n MyEngine.initializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.initializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\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 let order = [];\n\n MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.initializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n ['@test initializers can have multiple dependencies'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\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\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = _engine.default.extend();\n\n SecondEngine.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = firstEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n let secondEngine = SecondEngine.create();\n let secondEngineInstance = secondEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n\n (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = FirstEngine.extend();\n\n SecondEngine.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = firstEngine.buildInstance();\n\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\n let secondEngine = SecondEngine.create();\n let secondEngineInstance = secondEngine.buildInstance();\n\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 (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(function () {\n FirstEngine.initializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondEngine = _engine.default.extend();\n SecondEngine.instanceInitializer({\n name: 'abc',\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 MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\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});","enifed('@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 let MyEngine, myEngine, myEngineInstance;\n\n function buildEngineInstance(EngineClass) {\n let engineInstance = EngineClass.buildInstance();\n (0, _engine.setEngineParent)(engineInstance, {\n lookup() {\n return {};\n },\n resolveRegistration() {\n return {};\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\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({ name: 'initializer' });\n });\n });\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({ initialize() {} });\n });\n });\n }\n\n ['@test initializers are passed an engine instance'](assert) {\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'initializer',\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 let order = [];\n\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\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 let order = [];\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\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 let order = [];\n\n MyEngine = _engine.default.extend();\n\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\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\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\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 let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n let firstEngine, firstEngineInstance;\n\n FirstEngine.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = _engine.default.extend();\n let secondEngine, secondEngineInstance;\n\n SecondEngine.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n firstEngine = FirstEngine.create();\n firstEngineInstance = buildEngineInstance(firstEngine);\n\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\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\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = FirstEngine.extend();\n\n SecondEngine.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = buildEngineInstance(firstEngine);\n\n let secondEngine, secondEngineInstance;\n\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\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\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(() => {\n FirstEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondEngine = _engine.default.extend();\n SecondEngine.instanceInitializer({\n name: 'abc',\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 let MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\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\n return myEngineInstance.boot();\n }\n });\n});","enifed('@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 let engine, engineInstance;\n\n (0, _internalTestHelpers.moduleFor)('EngineInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n (0, _runloop.run)(() => {\n engine = _engine.default.create({ router: null });\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({ 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\n engineInstance = (0, _runloop.run)(() => _instance.default.create({ base: engine }));\n\n let PostComponent = (0, _internalTestHelpers.factory)();\n\n engineInstance.register('component:post', PostComponent);\n\n let postComponent1 = engineInstance.lookup('component:post');\n assert.ok(postComponent1, 'lookup creates instance');\n\n engineInstance.unregister('component:post');\n engineInstance.register('component:post', PostComponent);\n\n let postComponent2 = engineInstance.lookup('component:post');\n assert.ok(postComponent2, 'lookup creates instance');\n\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\n engineInstance = (0, _runloop.run)(() => _instance.default.create({ 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\n (0, _engine.setEngineParent)(engineInstance, {});\n\n // Stub `cloneParentDependencies`, the internals of which are tested along\n // with application instances.\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 let ChatEngine = _engine.default.extend();\n let chatEngineInstance;\n\n engine.register('engine:chat', ChatEngine);\n\n (0, _runloop.run)(() => {\n engineInstance = _instance.default.create({ base: engine });\n\n // Try to build an unregistered engine.\n assert.throws(() => {\n engineInstance.buildChildEngineInstance('fake');\n }, `You attempted to mount the engine 'fake', but it is not registered with its parent.`);\n\n // Build the `chat` engine, registered above.\n chatEngineInstance = engineInstance.buildChildEngineInstance('chat');\n });\n\n assert.ok(chatEngineInstance, 'child engine instance successfully created');\n\n assert.strictEqual((0, _engine.getEngineParent)(chatEngineInstance), engineInstance, 'child engine instance is assigned the correct parent');\n }\n });\n});","enifed('@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 let engine = {};\n let parent = {};\n\n assert.strictEqual((0, _engine.getEngineParent)(engine), undefined, 'parent has not been set');\n\n (0, _engine.setEngineParent)(engine, parent);\n\n assert.strictEqual((0, _engine.getEngineParent)(engine), parent, 'parent has been set');\n }\n });\n});","enifed('@ember/engine/tests/engine_test', ['@ember/-internals/environment', '@ember/runloop', '@ember/engine', '@ember/-internals/runtime', '@ember/-internals/container', 'internal-test-helpers'], function (_environment, _runloop, _engine, _runtime, _container, _internalTestHelpers) {\n 'use strict';\n\n let engine;\n let originalLookup = _environment.context.lookup;\n\n (0, _internalTestHelpers.moduleFor)('Engine', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n (0, _runloop.run)(() => {\n engine = _engine.default.create();\n _environment.context.lookup = { TestEngine: engine };\n });\n }\n\n teardown() {\n _environment.context.lookup = originalLookup;\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 assert.equal(engine.Foo.toString(), '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'), { singleton: false }, `optionsForType 'component'`);\n assert.deepEqual(engine.registeredOptionsForType('view'), { singleton: false }, `optionsForType 'view'`);\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'controller:basic');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view', '_viewRegistry', '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_topLevelViewTemplate', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view:-outlet', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'controller', 'target', 'router:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'controller', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'router', '_bucketCache', _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_bucketCache', _container.privatize`-bucket-cache:main`);\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_router', 'router:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-text-field');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-text-area');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-checkbox');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:link-to');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'service:-routing');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component-lookup:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-dom-changes', 'document', 'service:-document');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-dom-tree-construction', 'document', 'service:-document');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, _container.privatize`template:components/-default`);\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view:-outlet', 'template', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'template', 'compiler', _container.privatize`template-compiler:main`);\n assert.deepEqual(engine.registeredOptionsForType('helper'), { instantiate: false }, `optionsForType 'helper'`);\n }\n });\n});","enifed(\"@ember/error/index\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = EmberError;\n /**\n A subclass of the JavaScript Error object for use in Ember.\n \n @class Error\n @namespace Ember\n @extends Error\n @constructor\n @public\n */\n function EmberError(message) {\n if (!(this instanceof EmberError)) {\n return new EmberError(message);\n }\n\n let error = Error.call(this, message);\n\n this.stack = error.stack;\n this.description = error.description;\n this.fileName = error.fileName;\n this.lineNumber = error.lineNumber;\n this.message = error.message;\n this.name = error.name;\n this.number = error.number;\n this.code = error.code;\n }\n\n EmberError.prototype = Object.create(Error.prototype);\n EmberError.prototype.constructor = EmberError;\n});","enifed('@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});","enifed('@ember/instrumentation/index', ['exports', '@ember/-internals/environment', '@ember/canary-features'], function (exports, _environment, _canaryFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.flaggedInstrument = exports.subscribers = undefined;\n exports.instrument = instrument;\n exports._instrumentStart = _instrumentStart;\n exports.subscribe = subscribe;\n exports.unsubscribe = unsubscribe;\n exports.reset = reset;\n\n /**\n @module @ember/instrumentation\n @private\n */\n /**\n The purpose of the Ember Instrumentation module is\n to provide efficient, general-purpose instrumentation\n for Ember.\n \n Subscribe to a listener by using `subscribe`:\n \n ```javascript\n import { subscribe } from '@ember/instrumentation';\n \n subscribe(\"render\", {\n before(name, timestamp, payload) {\n \n },\n \n after(name, timestamp, payload) {\n \n }\n });\n ```\n \n If you return a value from the `before` callback, that same\n value will be passed as a fourth parameter to the `after`\n callback.\n \n Instrument a block of code by using `instrument`:\n \n ```javascript\n import { instrument } from '@ember/instrumentation';\n \n instrument(\"render.handlebars\", payload, function() {\n // rendering logic\n }, binding);\n ```\n \n Event names passed to `instrument` are namespaced\n by periods, from more general to more specific. Subscribers\n can listen for events by whatever level of granularity they\n are interested in.\n \n In the above example, the event is `render.handlebars`,\n and the subscriber listened for all events beginning with\n `render`. It would receive callbacks for events named\n `render`, `render.handlebars`, `render.container`, or\n even `render.handlebars.layout`.\n \n @class Instrumentation\n @static\n @private\n */\n /* eslint no-console:off */\n /* global console */\n let subscribers = exports.subscribers = [];\n let cache = {};\n function populateListeners(name) {\n let listeners = [];\n let subscriber;\n for (let i = 0; i < subscribers.length; i++) {\n subscriber = subscribers[i];\n if (subscriber.regex.test(name)) {\n listeners.push(subscriber.object);\n }\n }\n cache[name] = listeners;\n return listeners;\n }\n const time = (() => {\n let perf = 'undefined' !== typeof window ? window.performance || {} : {};\n let fn = perf.now || perf.mozNow || perf.webkitNow || perf.msNow || perf.oNow;\n // fn.bind will be available in all the browsers that support the advanced window.performance... ;-)\n return fn ? fn.bind(perf) : () => {\n return +new Date();\n };\n })();\n function instrument(name, p1, p2, p3) {\n let payload;\n let callback;\n let binding;\n if (arguments.length <= 3 && typeof p1 === 'function') {\n payload = {};\n callback = p1;\n binding = p2;\n } else {\n payload = p1 || {};\n callback = p2;\n binding = p3;\n }\n if (subscribers.length === 0) {\n return callback.call(binding);\n }\n let finalizer = _instrumentStart(name, () => payload);\n if (finalizer) {\n return withFinalizer(callback, finalizer, payload, binding);\n } else {\n return callback.call(binding);\n }\n }\n let flaggedInstrument;\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n exports.flaggedInstrument = flaggedInstrument = instrument;\n } else {\n exports.flaggedInstrument = flaggedInstrument = (_name, _payload, callback) => callback();\n }\n exports.flaggedInstrument = flaggedInstrument;\n\n function withFinalizer(callback, finalizer, payload, binding) {\n let result;\n try {\n result = callback.call(binding);\n } catch (e) {\n payload.exception = e;\n result = payload;\n } finally {\n finalizer();\n }\n return result;\n }\n function NOOP() {}\n function _instrumentStart(name, _payload, _payloadParam) {\n if (subscribers.length === 0) {\n return NOOP;\n }\n let listeners = cache[name];\n if (!listeners) {\n listeners = populateListeners(name);\n }\n if (listeners.length === 0) {\n return NOOP;\n }\n let payload = _payload(_payloadParam);\n let STRUCTURED_PROFILE = _environment.ENV.STRUCTURED_PROFILE;\n let timeName;\n if (STRUCTURED_PROFILE) {\n timeName = `${name}: ${payload.object}`;\n console.time(timeName);\n }\n let beforeValues = new Array(listeners.length);\n let i;\n let listener;\n let timestamp = time();\n for (i = 0; i < listeners.length; i++) {\n listener = listeners[i];\n beforeValues[i] = listener.before(name, timestamp, payload);\n }\n return function _instrumentEnd() {\n let i;\n let listener;\n let timestamp = time();\n for (i = 0; i < listeners.length; i++) {\n listener = listeners[i];\n if (typeof listener.after === 'function') {\n listener.after(name, timestamp, payload, beforeValues[i]);\n }\n }\n if (STRUCTURED_PROFILE) {\n console.timeEnd(timeName);\n }\n };\n }\n /**\n Subscribes to a particular event or instrumented block of code.\n \n @method subscribe\n @for @ember/instrumentation\n @static\n \n @param {String} [pattern] Namespaced event name.\n @param {Object} [object] Before and After hooks.\n \n @return {Subscriber}\n @private\n */\n function subscribe(pattern, object) {\n let paths = pattern.split('.');\n let path;\n let regexes = [];\n for (let i = 0; i < paths.length; i++) {\n path = paths[i];\n if (path === '*') {\n regexes.push('[^\\\\.]*');\n } else {\n regexes.push(path);\n }\n }\n let regex = regexes.join('\\\\.');\n regex = `${regex}(\\\\..*)?`;\n let subscriber = {\n pattern,\n regex: new RegExp(`^${regex}$`),\n object\n };\n subscribers.push(subscriber);\n cache = {};\n return subscriber;\n }\n /**\n Unsubscribes from a particular event or instrumented block of code.\n \n @method unsubscribe\n @for @ember/instrumentation\n @static\n \n @param {Object} [subscriber]\n @private\n */\n function unsubscribe(subscriber) {\n let index = 0;\n for (let i = 0; i < subscribers.length; i++) {\n if (subscribers[i] === subscriber) {\n index = i;\n }\n }\n subscribers.splice(index, 1);\n cache = {};\n }\n /**\n Resets `Instrumentation` by flushing list of subscribers.\n \n @method reset\n @for @ember/instrumentation\n @static\n @private\n */\n function reset() {\n subscribers.length = 0;\n cache = {};\n }\n});","enifed('@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 let 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\n let sentPayload = {};\n let count = 0;\n\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\n count++;\n }\n });\n\n (0, _instrumentation.instrument)('render', sentPayload, function () {});\n\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\n let passthru1 = {};\n let passthru2 = {};\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n return passthru1;\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 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\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\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\n let binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\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\n let expectedPayload = { hi: 1 };\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\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\n let expectedPayload = { hi: 1 };\n let binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\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(2);\n\n let error = new Error('Instrumentation');\n\n (0, _instrumentation.subscribe)('render', {\n before() {},\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n });\n\n (0, _instrumentation.subscribe)('render', {\n before() {},\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n });\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {\n throw error;\n });\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\n (0, _instrumentation.subscribe)('render', {\n before() {\n assert.ok(true, 'Before callback was called');\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\n let count = 0;\n\n let subscriber = (0, _instrumentation.subscribe)('render', {\n before() {\n assert.equal(count, 0);\n assert.ok(true, 'Before callback was called');\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\n (0, _instrumentation.unsubscribe)(subscriber);\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n }\n });\n});","enifed('@ember/map/index', ['exports', '@ember/debug', '@ember/-internals/utils', '@ember/map/lib/ordered-set', '@ember/map/lib/utils', '@ember/deprecated-features'], function (exports, _debug, _utils, _orderedSet, _utils2, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n /**\n @module @ember/map\n @private\n */\n\n let Map;\n\n if (_deprecatedFeatures.MAP) {\n /*\n JavaScript (before ES6) does not have a Map implementation. Objects,\n which are often used as dictionaries, may only have Strings as keys.\n Because Ember has a way to get a unique identifier for every object\n via `guidFor`, we can implement a performant Map with arbitrary\n keys. Because it is commonly used in low-level bookkeeping, Map is\n implemented as a pure JavaScript object for performance.\n This implementation follows the current iteration of the ES6 proposal for\n maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),\n with one exception: as we do not have the luxury of in-VM iteration, we implement a\n forEach method for iteration.\n Map is mocked out to look like an Ember object, so you can do\n `EmberMap.create()` for symmetry with other Ember classes.\n */\n\n /**\n A Map stores values indexed by keys. Unlike JavaScript's\n default Objects, the keys of a Map can be any JavaScript\n object.\n Internally, a Map has two data structures:\n 1. `keys`: an OrderedSet of all of the existing keys\n 2. `values`: a JavaScript Object indexed by the `guidFor(key)`\n When a key/value pair is added for the first time, we\n add the key to the `keys` OrderedSet, and create or\n replace an entry in `values`. When an entry is deleted,\n we delete its entry in `keys` and `values`.\n @class Map\n @private\n @constructor\n @deprecated use native `Map` instead.\n */\n Map = class Map {\n constructor() {\n (0, _debug.deprecate)('Use of @ember/Map is deprecated. Please use native `Map` instead', false, {\n id: 'ember-map-deprecation',\n until: '3.5.0'\n });\n\n this._keys = new _orderedSet.default();\n this._values = Object.create(null);\n this.size = 0;\n }\n\n /**\n @method create\n @static\n @private\n */\n static create() {\n let Constructor = this;\n return new Constructor();\n }\n\n /**\n Retrieve the value associated with a given key.\n @method get\n @param {*} key\n @return {*} the value associated with the key, or `undefined`\n @private\n */\n get(key) {\n if (this.size === 0) {\n return;\n }\n\n let values = this._values;\n let guid = (0, _utils.guidFor)(key);\n\n return values[guid];\n }\n\n /**\n Adds a value to the map. If a value for the given key has already been\n provided, the new value will replace the old value.\n @method set\n @param {*} key\n @param {*} value\n @return {Map}\n @private\n */\n set(key, value) {\n let keys = this._keys;\n let values = this._values;\n let guid = (0, _utils.guidFor)(key);\n\n // ensure we don't store -0\n let k = key === -0 ? 0 : key; // eslint-disable-line no-compare-neg-zero\n\n keys.add(k, guid);\n\n values[guid] = value;\n\n this.size = keys.size;\n\n return this;\n }\n\n /**\n Removes a value from the map for an associated key.\n @since 1.8.0\n @method delete\n @param {*} key\n @return {Boolean} true if an item was removed, false otherwise\n @private\n */\n delete(key) {\n if (this.size === 0) {\n return false;\n }\n // don't use ES6 \"delete\" because it will be annoying\n // to use in browsers that are not ES6 friendly;\n let keys = this._keys;\n let values = this._values;\n let guid = (0, _utils.guidFor)(key);\n\n if (keys.delete(key, guid)) {\n delete values[guid];\n this.size = keys.size;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n Check whether a key is present.\n @method has\n @param {*} key\n @return {Boolean} true if the item was present, false otherwise\n @private\n */\n has(key) {\n return this._keys.has(key);\n }\n\n /**\n Iterate over all the keys and values. Calls the function once\n for each key, passing in value, key, and the map being iterated over,\n in that order.\n The keys are guaranteed to be iterated over in insertion order.\n @method forEach\n @param {Function} callback\n @param {*} self if passed, the `this` value inside the\n callback. By default, `this` is the map.\n @private\n */\n forEach(callback /*, ...thisArg*/) {\n (0, _debug.assert)(`${Object.prototype.toString.call(callback)} is not a function`, typeof callback === 'function');\n\n if (this.size === 0) {\n return;\n }\n\n let map = this;\n let cb, thisArg;\n\n if (arguments.length === 2) {\n thisArg = arguments[1];\n cb = key => callback.call(thisArg, map.get(key), key, map);\n } else {\n cb = key => callback(map.get(key), key, map);\n }\n\n this._keys.forEach(cb);\n }\n\n /**\n @method clear\n @private\n */\n clear() {\n this._keys.clear();\n this._values = Object.create(null);\n this.size = 0;\n }\n\n /**\n @method copy\n @return {Map}\n @private\n */\n copy() {\n return (0, _utils2.copyMap)(this, new Map());\n }\n };\n }\n\n exports.default = Map;\n});","enifed('@ember/map/lib/ordered-set', ['exports', '@ember/debug', '@ember/-internals/utils', '@ember/map/lib/utils', '@ember/deprecated-features'], function (exports, _debug, _utils, _utils2, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.__OrderedSet__ = undefined;\n\n\n /**\n This class is used internally by Ember and Ember Data.\n Please do not use it at this time. We plan to clean it up\n and add many tests soon.\n \n @class OrderedSet\n @namespace Ember\n @constructor\n @private\n @deprecated\n */\n let __OrderedSet__, OrderedSet;\n /**\n * This is exported so it can be used by the OrderedSet library.\n * This is private do not use it.\n @private\n */\n\n if (_deprecatedFeatures.ORDERED_SET) {\n exports.__OrderedSet__ = __OrderedSet__ = class __OrderedSet__ {\n constructor() {\n this.clear();\n }\n /**\n @method create\n @static\n @return {Ember.OrderedSet}\n @private\n */\n static create() {\n let Constructor = this;\n return new Constructor();\n }\n\n /**\n @method clear\n @private\n */\n clear() {\n this.presenceSet = Object.create(null);\n this.list = [];\n this.size = 0;\n }\n\n /**\n @method add\n @param obj\n @param guid (optional, and for internal use)\n @return {Ember.OrderedSet}\n @private\n */\n add(obj, _guid) {\n let guid = _guid || (0, _utils.guidFor)(obj);\n let presenceSet = this.presenceSet;\n let list = this.list;\n\n if (presenceSet[guid] !== true) {\n presenceSet[guid] = true;\n this.size = list.push(obj);\n }\n\n return this;\n }\n\n /**\n @since 1.8.0\n @method delete\n @param obj\n @param _guid (optional and for internal use only)\n @return {Boolean}\n @private\n */\n delete(obj, _guid) {\n let guid = _guid || (0, _utils.guidFor)(obj);\n let presenceSet = this.presenceSet;\n let list = this.list;\n\n if (presenceSet[guid] === true) {\n delete presenceSet[guid];\n let index = list.indexOf(obj);\n if (index > -1) {\n list.splice(index, 1);\n }\n this.size = list.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n @method isEmpty\n @return {Boolean}\n @private\n */\n isEmpty() {\n return this.size === 0;\n }\n\n /**\n @method has\n @param obj\n @return {Boolean}\n @private\n */\n has(obj) {\n if (this.size === 0) {\n return false;\n }\n\n let guid = (0, _utils.guidFor)(obj);\n let presenceSet = this.presenceSet;\n\n return presenceSet[guid] === true;\n }\n\n /**\n @method forEach\n @param {Function} fn\n @param self\n @private\n */\n forEach(fn /*, ...thisArg*/) {\n (0, _debug.assert)(`${Object.prototype.toString.call(fn)} is not a function`, typeof fn === 'function');\n\n if (this.size === 0) {\n return;\n }\n\n let list = this.list;\n\n if (arguments.length === 2) {\n for (let i = 0; i < list.length; i++) {\n fn.call(arguments[1], list[i]);\n }\n } else {\n for (let i = 0; i < list.length; i++) {\n fn(list[i]);\n }\n }\n }\n\n /**\n @method toArray\n @return {Array}\n @private\n */\n toArray() {\n return this.list.slice();\n }\n\n /**\n @method copy\n @return {Ember.OrderedSet}\n @private\n */\n copy() {\n let Constructor = this.constructor;\n let set = new Constructor();\n\n set.presenceSet = (0, _utils2.copyNull)(this.presenceSet);\n set.list = this.toArray();\n set.size = this.size;\n\n return set;\n }\n };\n\n OrderedSet = class OrderedSet extends __OrderedSet__ {\n constructor() {\n super();\n (0, _debug.deprecate)('Use of @ember/OrderedSet is deprecated. Please use native `Map` instead', false, {\n id: 'ember-map-deprecation',\n until: '3.5.0'\n });\n }\n };\n }\n\n exports.__OrderedSet__ = __OrderedSet__;\n exports.default = OrderedSet;\n});","enifed('@ember/map/lib/utils', ['exports', '@ember/deprecated-features'], function (exports, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.copyNull = exports.copyMap = undefined;\n\n\n let copyNull, copyMap;\n\n if (_deprecatedFeatures.MAP || _deprecatedFeatures.ORDERED_SET) {\n exports.copyNull = copyNull = function copyNull(obj) {\n let output = Object.create(null);\n\n for (let prop in obj) {\n // hasOwnPropery is not needed because obj is Object.create(null);\n output[prop] = obj[prop];\n }\n\n return output;\n };\n\n exports.copyMap = copyMap = function copyMap(original, newObject) {\n let keys = original._keys.copy();\n let values = copyNull(original._values);\n\n newObject._keys = keys;\n newObject._values = values;\n newObject.size = original.size;\n\n return newObject;\n };\n }\n\n exports.copyMap = copyMap;\n exports.copyNull = copyNull;\n});","enifed('@ember/map/tests/map_test', ['@ember/map', '@ember/map/with-default', '@ember/map/lib/ordered-set', 'internal-test-helpers'], function (_map, _withDefault, _orderedSet, _internalTestHelpers) {\n 'use strict';\n\n let object, number, string, map, variety;\n const varieties = [['Map', _map.default], ['MapWithDefault', _withDefault.default]];\n\n function testMap(nameAndFunc) {\n variety = nameAndFunc[0];\n\n (0, _internalTestHelpers.moduleFor)('Ember.' + variety + ' (forEach and get are implicitly tested)', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = {};\n number = 42;\n string = 'foo';\n\n expectDeprecation(() => {\n map = nameAndFunc[1].create();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test set'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n map.set(object, 'losing');\n map.set(number, 'losing');\n map.set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']]);\n\n assert.equal(map.has('nope'), false, 'expected the key `nope` to not be present');\n assert.equal(map.has({}), false, 'expected they key `{}` to not be present');\n }\n\n ['@test set chaining'](assert) {\n map.set(object, 'winning').set(number, 'winning').set(string, 'winning');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n map.set(object, 'losing').set(number, 'losing').set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']]);\n\n assert.equal(map.has('nope'), false, 'expected the key `nope` to not be present');\n assert.equal(map.has({}), false, 'expected they key `{}` to not be present');\n }\n\n ['@test with key with undefined value'](assert) {\n map.set('foo', undefined);\n\n map.forEach(function (value, key) {\n assert.equal(value, undefined);\n assert.equal(key, 'foo');\n });\n\n assert.ok(map.has('foo'), 'has key foo, even with undefined value');\n\n assert.equal(map.size, 1);\n }\n\n ['@test arity of forEach is 1 – es6 23.1.3.5'](assert) {\n assert.equal(map.forEach.length, 1, 'expected arity for map.forEach is 1');\n }\n\n ['@test forEach throws without a callback as the first argument'](assert) {\n assert.equal(map.forEach.length, 1, 'expected arity for map.forEach is 1');\n }\n\n ['@test has empty collection'](assert) {\n assert.equal(map.has('foo'), false);\n assert.equal(map.has(), false);\n }\n\n ['@test delete'](assert) {\n expectNoDeprecation();\n\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n map.delete(object);\n map.delete(number);\n map.delete(string);\n\n // doesn't explode\n map.delete({});\n\n mapHasEntries(assert, []);\n }\n\n ['@test copy and then update'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map2.set(object, 'losing');\n map2.set(number, 'losing');\n map2.set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']], map2);\n }\n\n ['@test copy and then delete'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map2.delete(object);\n map2.delete(number);\n map2.delete(string);\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n mapHasEntries(assert, [], map2);\n }\n\n ['@test size'](assert) {\n //Add a key twice\n assert.equal(map.size, 0);\n map.set(string, 'a string');\n assert.equal(map.size, 1);\n map.set(string, 'the same string');\n assert.equal(map.size, 1);\n\n //Add another\n map.set(number, 'a number');\n assert.equal(map.size, 2);\n\n //Remove one that doesn't exist\n map.delete('does not exist');\n assert.equal(map.size, 2);\n\n //Check copy\n expectDeprecation(() => {\n let copy = map.copy();\n assert.equal(copy.size, 2);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n //Remove a key twice\n map.delete(number);\n assert.equal(map.size, 1);\n map.delete(number);\n assert.equal(map.size, 1);\n\n //Remove the last key\n map.delete(string);\n assert.equal(map.size, 0);\n map.delete(string);\n assert.equal(map.size, 0);\n }\n\n ['@test forEach without proper callback'](assert) {\n expectAssertion(function () {\n map.forEach();\n }, '[object Undefined] is not a function');\n\n expectAssertion(function () {\n map.forEach(undefined);\n }, '[object Undefined] is not a function');\n\n expectAssertion(function () {\n map.forEach(1);\n }, '[object Number] is not a function');\n\n expectAssertion(function () {\n map.forEach({});\n }, '[object Object] is not a function');\n\n map.forEach(function (value, key) {\n map.delete(key);\n });\n // ensure the error happens even if no data is present\n assert.equal(map.size, 0);\n expectAssertion(function () {\n map.forEach({});\n }, '[object Object] is not a function');\n }\n\n ['@test forEach basic'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }, { value: 3, key: 'c', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 3, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w context'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n let context = {};\n let expectations = [{ value: 1, key: 'a', context: context }, { value: 2, key: 'b', context: context }, { value: 3, key: 'c', context: context }];\n\n map.forEach(function (value, key, theMap) {\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n }, context);\n\n assert.equal(iteration, 3, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w deletion while enumerating'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n if (iteration === 0) {\n map.delete('c');\n }\n\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 2, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w addition while enumerating'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }, { value: 3, key: 'c', context: unboundThis }, { value: 4, key: 'd', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n if (iteration === 0) {\n map.set('d', 4);\n }\n\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 4, 'expected 3 iterations');\n }\n\n ['@test clear'](assert) {\n let iterations = 0;\n\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n map.set('d', 4);\n\n assert.equal(map.size, 4);\n\n map.forEach(function () {\n iterations++;\n });\n assert.equal(iterations, 4);\n\n map.clear();\n assert.equal(map.size, 0);\n iterations = 0;\n map.forEach(function () {\n iterations++;\n });\n assert.equal(iterations, 0);\n }\n\n ['@skip -0'](assert) {\n assert.equal(map.has(-0), false);\n assert.equal(map.has(0), false);\n\n map.set(-0, 'zero');\n\n assert.equal(map.has(-0), true);\n assert.equal(map.has(0), true);\n\n assert.equal(map.get(0), 'zero');\n assert.equal(map.get(-0), 'zero');\n\n map.forEach(function (value, key) {\n assert.equal(1 / key, Infinity, 'spec says key should be positive zero');\n });\n }\n\n ['@test NaN'](assert) {\n assert.equal(map.has(NaN), false);\n\n map.set(NaN, 'not-a-number');\n\n assert.equal(map.has(NaN), true);\n\n assert.equal(map.get(NaN), 'not-a-number');\n }\n\n ['@test NaN Boxed'](assert) {\n //jshint -W053\n let boxed = new Number(NaN);\n assert.equal(map.has(boxed), false);\n\n map.set(boxed, 'not-a-number');\n\n assert.equal(map.has(boxed), true);\n assert.equal(map.has(NaN), false);\n\n assert.equal(map.get(NaN), undefined);\n assert.equal(map.get(boxed), 'not-a-number');\n }\n\n ['@test 0 value'](assert) {\n let obj = {};\n assert.equal(map.has(obj), false);\n\n assert.equal(map.size, 0);\n map.set(obj, 0);\n assert.equal(map.size, 1);\n\n assert.equal(map.has(obj), true);\n assert.equal(map.get(obj), 0);\n\n map.delete(obj);\n assert.equal(map.has(obj), false);\n assert.equal(map.get(obj), undefined);\n assert.equal(map.size, 0);\n }\n });\n\n let mapHasLength = function (assert, expected, theMap) {\n theMap = theMap || map;\n\n let length = 0;\n theMap.forEach(function () {\n length++;\n });\n\n assert.equal(length, expected, 'map should contain ' + expected + ' items');\n };\n\n let mapHasEntries = function (assert, entries, theMap) {\n theMap = theMap || map;\n\n for (let i = 0; i < entries.length; i++) {\n assert.equal(theMap.get(entries[i][0]), entries[i][1]);\n assert.equal(theMap.has(entries[i][0]), true);\n }\n\n mapHasLength(assert, entries.length, theMap);\n };\n\n let unboundThis;\n\n (function () {\n unboundThis = this;\n })();\n }\n\n for (let i = 0; i < varieties.length; i++) {\n testMap(varieties[i]);\n }\n\n (0, _internalTestHelpers.moduleFor)('MapWithDefault - default values', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Retrieving a value that has not been set returns and sets a default value'](assert) {\n let map;\n expectDeprecation(() => {\n map = _withDefault.default.create({\n defaultValue(key) {\n return [key];\n }\n });\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n let value = map.get('ohai');\n assert.deepEqual(value, ['ohai']);\n\n assert.strictEqual(value, map.get('ohai'));\n }\n\n ['@test Map.prototype.constructor'](assert) {\n expectDeprecation(() => {\n let map = new _map.default();\n assert.equal(map.constructor, _map.default);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test MapWithDefault.prototype.constructor'](assert) {\n expectDeprecation(() => {\n let map = new _withDefault.default({\n defaultValue(key) {\n return key;\n }\n });\n assert.equal(map.constructor, _withDefault.default);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test Copying a MapWithDefault copies the default value'](assert) {\n let map;\n expectDeprecation(() => {\n map = _withDefault.default.create({\n defaultValue(key) {\n return [key];\n }\n });\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map.set('ohai', 1);\n map.get('bai');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n assert.equal(map2.get('ohai'), 1);\n assert.deepEqual(map2.get('bai'), ['bai']);\n\n map2.set('kthx', 3);\n\n assert.deepEqual(map.get('kthx'), ['kthx']);\n assert.equal(map2.get('kthx'), 3);\n\n assert.deepEqual(map2.get('default'), ['default']);\n\n map2.defaultValue = key => ['tom is on', key];\n\n assert.deepEqual(map2.get('drugs'), ['tom is on', 'drugs']);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('OrderedSet', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = {};\n number = 42;\n string = 'foo';\n\n expectDeprecation(() => {\n map = _orderedSet.default.create();\n }, 'Use of @ember/OrderedSet is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test add returns the set'](assert) {\n let obj = {};\n assert.equal(map.add(obj), map);\n assert.equal(map.add(obj), map, 'when it is already in the set');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('__OrderedSet__', class extends _internalTestHelpers.AbstractTestCase {\n ['@test private __OrderedSet__ can be created without deprecation']() {\n expectNoDeprecation();\n _orderedSet.__OrderedSet__.create();\n }\n });\n});","enifed('@ember/map/with-default', ['exports', '@ember/debug', '@ember/map/index', '@ember/map/lib/utils', '@ember/deprecated-features'], function (exports, _debug, _index, _utils, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n let MapWithDefault;\n\n if (_deprecatedFeatures.MAP) {\n /**\n @class MapWithDefault\n @extends Map\n @private\n @constructor\n @param [options]\n @param {*} [options.defaultValue]\n */\n MapWithDefault = class MapWithDefault extends _index.default {\n constructor(options) {\n (0, _debug.deprecate)('Use of @ember/MapWithDefault is deprecated. Please use native `Map` instead', false, {\n id: 'ember-map-deprecation',\n until: '3.5.0'\n });\n\n super();\n this.defaultValue = options.defaultValue;\n }\n\n /**\n @method create\n @static\n @param [options]\n @param {*} [options.defaultValue]\n @return {MapWithDefault|Map} If options are passed, returns\n `MapWithDefault` otherwise returns `EmberMap`\n @private\n @deprecated use native `Map` instead\n */\n static create(options) {\n if (options) {\n return new MapWithDefault(options);\n } else {\n return new _index.default();\n }\n }\n\n /**\n Retrieve the value associated with a given key.\n @method get\n @param {*} key\n @return {*} the value associated with the key, or the default value\n @private\n */\n get(key) {\n let hasValue = this.has(key);\n\n if (hasValue) {\n return super.get(key);\n } else {\n let defaultValue = this.defaultValue(key);\n this.set(key, defaultValue);\n return defaultValue;\n }\n }\n\n /**\n @method copy\n @return {MapWithDefault}\n @private\n */\n copy() {\n let Constructor = this.constructor;\n return (0, _utils.copyMap)(this, new Constructor({\n defaultValue: this.defaultValue\n }));\n }\n };\n }\n\n exports.default = MapWithDefault;\n});","enifed('@ember/object/computed', ['exports', '@ember/object/lib/computed/computed_macros', '@ember/object/lib/computed/reduce_computed_macros'], function (exports, _computed_macros, _reduce_computed_macros) {\n 'use strict';\n\n exports.__esModule = true;\n Object.defineProperty(exports, 'empty', {\n enumerable: true,\n get: function () {\n return _computed_macros.empty;\n }\n });\n Object.defineProperty(exports, 'notEmpty', {\n enumerable: true,\n get: function () {\n return _computed_macros.notEmpty;\n }\n });\n Object.defineProperty(exports, 'none', {\n enumerable: true,\n get: function () {\n return _computed_macros.none;\n }\n });\n Object.defineProperty(exports, 'not', {\n enumerable: true,\n get: function () {\n return _computed_macros.not;\n }\n });\n Object.defineProperty(exports, 'bool', {\n enumerable: true,\n get: function () {\n return _computed_macros.bool;\n }\n });\n Object.defineProperty(exports, 'match', {\n enumerable: true,\n get: function () {\n return _computed_macros.match;\n }\n });\n Object.defineProperty(exports, 'equal', {\n enumerable: true,\n get: function () {\n return _computed_macros.equal;\n }\n });\n Object.defineProperty(exports, 'gt', {\n enumerable: true,\n get: function () {\n return _computed_macros.gt;\n }\n });\n Object.defineProperty(exports, 'gte', {\n enumerable: true,\n get: function () {\n return _computed_macros.gte;\n }\n });\n Object.defineProperty(exports, 'lt', {\n enumerable: true,\n get: function () {\n return _computed_macros.lt;\n }\n });\n Object.defineProperty(exports, 'lte', {\n enumerable: true,\n get: function () {\n return _computed_macros.lte;\n }\n });\n Object.defineProperty(exports, 'oneWay', {\n enumerable: true,\n get: function () {\n return _computed_macros.oneWay;\n }\n });\n Object.defineProperty(exports, 'readOnly', {\n enumerable: true,\n get: function () {\n return _computed_macros.readOnly;\n }\n });\n Object.defineProperty(exports, 'deprecatingAlias', {\n enumerable: true,\n get: function () {\n return _computed_macros.deprecatingAlias;\n }\n });\n Object.defineProperty(exports, 'and', {\n enumerable: true,\n get: function () {\n return _computed_macros.and;\n }\n });\n Object.defineProperty(exports, 'or', {\n enumerable: true,\n get: function () {\n return _computed_macros.or;\n }\n });\n Object.defineProperty(exports, 'sum', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.sum;\n }\n });\n Object.defineProperty(exports, 'min', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.min;\n }\n });\n Object.defineProperty(exports, 'max', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.max;\n }\n });\n Object.defineProperty(exports, 'map', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.map;\n }\n });\n Object.defineProperty(exports, 'sort', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.sort;\n }\n });\n Object.defineProperty(exports, 'setDiff', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.setDiff;\n }\n });\n Object.defineProperty(exports, 'mapBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.mapBy;\n }\n });\n Object.defineProperty(exports, 'filter', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.filter;\n }\n });\n Object.defineProperty(exports, 'filterBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.filterBy;\n }\n });\n Object.defineProperty(exports, 'uniq', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.uniq;\n }\n });\n Object.defineProperty(exports, 'uniqBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.uniqBy;\n }\n });\n Object.defineProperty(exports, 'union', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.union;\n }\n });\n Object.defineProperty(exports, 'intersect', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.intersect;\n }\n });\n Object.defineProperty(exports, 'collect', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.collect;\n }\n });\n});","enifed('@ember/object/lib/computed/computed_macros', ['exports', '@ember/-internals/metal', '@ember/debug'], function (exports, _metal, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.or = exports.and = undefined;\n exports.empty = empty;\n exports.notEmpty = notEmpty;\n exports.none = none;\n exports.not = not;\n exports.bool = bool;\n exports.match = match;\n exports.equal = equal;\n exports.gt = gt;\n exports.gte = gte;\n exports.lt = lt;\n exports.lte = lte;\n exports.oneWay = oneWay;\n exports.readOnly = readOnly;\n exports.deprecatingAlias = deprecatingAlias;\n\n\n /**\n @module @ember/object\n */\n\n function expandPropertiesToArray(predicateName, properties) {\n let expandedProperties = [];\n\n function extractProperty(entry) {\n expandedProperties.push(entry);\n }\n\n for (let i = 0; i < properties.length; i++) {\n let property = properties[i];\n (0, _debug.assert)(`Dependent keys passed to computed.${predicateName}() can\\'t have spaces.`, property.indexOf(' ') < 0);\n\n (0, _metal.expandProperties)(property, extractProperty);\n }\n\n return expandedProperties;\n }\n\n function generateComputedWithPredicate(name, predicate) {\n return (...properties) => {\n let dependentKeys = expandPropertiesToArray(name, properties);\n\n let computedFunc = new _metal.ComputedProperty(function () {\n let lastIdx = dependentKeys.length - 1;\n\n for (let i = 0; i < lastIdx; i++) {\n let value = (0, _metal.get)(this, dependentKeys[i]);\n if (!predicate(value)) {\n return value;\n }\n }\n\n return (0, _metal.get)(this, dependentKeys[lastIdx]);\n }, { dependentKeys });\n\n return computedFunc;\n };\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is null, an empty string, empty array, or empty function.\n \n Example\n \n ```javascript\n import { empty } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let ToDoList = EmberObject.extend({\n isDone: empty('todos')\n });\n \n let todoList = ToDoList.create({\n todos: ['Unit Test', 'Documentation', 'Release']\n });\n \n todoList.get('isDone'); // false\n todoList.get('todos').clear();\n todoList.get('isDone'); // true\n ```\n \n @since 1.6.0\n @method empty\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns true if\n the value of the dependent property is null, an empty string, empty array,\n or empty function and false if the underlying value is not empty.\n \n @public\n */\n function empty(dependentKey) {\n return (0, _metal.computed)(`${dependentKey}.length`, function () {\n return (0, _metal.isEmpty)((0, _metal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is NOT null, an empty string, empty array, or empty function.\n \n Example\n \n ```javascript\n import { notEmpty } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasStuff: notEmpty('backpack')\n });\n \n let hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });\n \n hamster.get('hasStuff'); // true\n hamster.get('backpack').clear(); // []\n hamster.get('hasStuff'); // false\n ```\n \n @method notEmpty\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns true if\n original value for property is not empty.\n @public\n */\n function notEmpty(dependentKey) {\n return (0, _metal.computed)(`${dependentKey}.length`, function () {\n return !(0, _metal.isEmpty)((0, _metal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is null or undefined. This avoids errors from JSLint complaining\n about use of ==, which can be technically confusing.\n \n Example\n \n ```javascript\n import { none } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n isHungry: none('food')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('isHungry'); // true\n hamster.set('food', 'Banana');\n hamster.get('isHungry'); // false\n hamster.set('food', null);\n hamster.get('isHungry'); // true\n ```\n \n @method none\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which\n returns true if original value for property is null or undefined.\n @public\n */\n function none(dependentKey) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.isNone)((0, _metal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns the inverse boolean value\n of the original value for the dependent property.\n \n Example\n \n ```javascript\n import { not } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n isAnonymous: not('loggedIn')\n });\n \n let user = User.create({loggedIn: false});\n \n user.get('isAnonymous'); // true\n user.set('loggedIn', true);\n user.get('isAnonymous'); // false\n ```\n \n @method not\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns\n inverse of the original value for property\n @public\n */\n function not(dependentKey) {\n return (0, _metal.computed)(dependentKey, function () {\n return !(0, _metal.get)(this, dependentKey);\n });\n }\n\n /**\n A computed property that converts the provided dependent property\n into a boolean value.\n \n ```javascript\n import { bool } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasBananas: bool('numBananas')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasBananas'); // false\n hamster.set('numBananas', 0);\n hamster.get('hasBananas'); // false\n hamster.set('numBananas', 1);\n hamster.get('hasBananas'); // true\n hamster.set('numBananas', null);\n hamster.get('hasBananas'); // false\n ```\n \n @method bool\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which converts\n to boolean the original value for property\n @public\n */\n function bool(dependentKey) {\n return (0, _metal.computed)(dependentKey, function () {\n return !!(0, _metal.get)(this, dependentKey);\n });\n }\n\n /**\n A computed property which matches the original value for the\n dependent property against a given RegExp, returning `true`\n if the value matches the RegExp and `false` if it does not.\n \n Example\n \n ```javascript\n import { match } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n hasValidEmail: match('email', /^.+@.+\\..+$/)\n });\n \n let user = User.create({loggedIn: false});\n \n user.get('hasValidEmail'); // false\n user.set('email', '');\n user.get('hasValidEmail'); // false\n user.set('email', 'ember_hamster@example.com');\n user.get('hasValidEmail'); // true\n ```\n \n @method match\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {RegExp} regexp\n @return {ComputedProperty} computed property which match\n the original value for property against a given RegExp\n @public\n */\n function match(dependentKey, regexp) {\n return (0, _metal.computed)(dependentKey, function () {\n let value = (0, _metal.get)(this, dependentKey);\n return regexp.test(value);\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is equal to the given value.\n \n Example\n \n ```javascript\n import { equal } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n satisfied: equal('percentCarrotsEaten', 100)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('satisfied'); // false\n hamster.set('percentCarrotsEaten', 100);\n hamster.get('satisfied'); // true\n hamster.set('percentCarrotsEaten', 50);\n hamster.get('satisfied'); // false\n ```\n \n @method equal\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {String|Number|Object} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is equal to the given value.\n @public\n */\n function equal(dependentKey, value) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.get)(this, dependentKey) === value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is greater than the provided value.\n \n Example\n \n ```javascript\n import { gt } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasTooManyBananas: gt('numBananas', 10)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 11);\n hamster.get('hasTooManyBananas'); // true\n ```\n \n @method gt\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is greater than given value.\n @public\n */\n function gt(dependentKey, value) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.get)(this, dependentKey) > value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is greater than or equal to the provided value.\n \n Example\n \n ```javascript\n import { gte } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasTooManyBananas: gte('numBananas', 10)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 10);\n hamster.get('hasTooManyBananas'); // true\n ```\n \n @method gte\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is greater or equal then given value.\n @public\n */\n function gte(dependentKey, value) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.get)(this, dependentKey) >= value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is less than the provided value.\n \n Example\n \n ```javascript\n import { lt } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n needsMoreBananas: lt('numBananas', 3)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('needsMoreBananas'); // true\n hamster.set('numBananas', 3);\n hamster.get('needsMoreBananas'); // false\n hamster.set('numBananas', 2);\n hamster.get('needsMoreBananas'); // true\n ```\n \n @method lt\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is less then given value.\n @public\n */\n function lt(dependentKey, value) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.get)(this, dependentKey) < value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is less than or equal to the provided value.\n \n Example\n \n ```javascript\n import { lte } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n needsMoreBananas: lte('numBananas', 3)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('needsMoreBananas'); // true\n hamster.set('numBananas', 5);\n hamster.get('needsMoreBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('needsMoreBananas'); // true\n ```\n \n @method lte\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is less or equal than given value.\n @public\n */\n function lte(dependentKey, value) {\n return (0, _metal.computed)(dependentKey, function () {\n return (0, _metal.get)(this, dependentKey) <= value;\n });\n }\n\n /**\n A computed property that performs a logical `and` on the\n original values for the provided dependent properties.\n \n You may pass in more than two properties and even use\n property brace expansion. The computed property will\n return the first falsy value or last truthy value\n just like JavaScript's `&&` operator.\n \n Example\n \n ```javascript\n import { and } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n readyForCamp: and('hasTent', 'hasBackpack'),\n readyForHike: and('hasWalkingStick', 'hasBackpack')\n });\n \n let tomster = Hamster.create();\n \n tomster.get('readyForCamp'); // false\n tomster.set('hasTent', true);\n tomster.get('readyForCamp'); // false\n tomster.set('hasBackpack', true);\n tomster.get('readyForCamp'); // true\n tomster.set('hasBackpack', 'Yes');\n tomster.get('readyForCamp'); // 'Yes'\n tomster.set('hasWalkingStick', null);\n tomster.get('readyForHike'); // null\n ```\n \n @method and\n @static\n @for @ember/object/computed\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which performs\n a logical `and` on the values of all the original values for properties.\n @public\n */\n const and = exports.and = generateComputedWithPredicate('and', value => value);\n\n /**\n A computed property which performs a logical `or` on the\n original values for the provided dependent properties.\n \n You may pass in more than two properties and even use\n property brace expansion. The computed property will\n return the first truthy value or last falsy value just\n like JavaScript's `||` operator.\n \n Example\n \n ```javascript\n import { or } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n readyForRain: or('hasJacket', 'hasUmbrella'),\n readyForBeach: or('{hasSunscreen,hasUmbrella}')\n });\n \n let tomster = Hamster.create();\n \n tomster.get('readyForRain'); // undefined\n tomster.set('hasUmbrella', true);\n tomster.get('readyForRain'); // true\n tomster.set('hasJacket', 'Yes');\n tomster.get('readyForRain'); // 'Yes'\n tomster.set('hasSunscreen', 'Check');\n tomster.get('readyForBeach'); // 'Check'\n ```\n \n @method or\n @static\n @for @ember/object/computed\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which performs\n a logical `or` on the values of all the original values for properties.\n @public\n */\n const or = exports.or = generateComputedWithPredicate('or', value => !value);\n\n /**\n Creates a new property that is an alias for another property\n on an object. Calls to `get` or `set` this property behave as\n though they were called on the original property.\n \n ```javascript\n import { alias } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n name: 'Alex Matchneer',\n nomen: alias('name')\n });\n \n let alex = Person.create();\n \n alex.get('nomen'); // 'Alex Matchneer'\n alex.get('name'); // 'Alex Matchneer'\n \n alex.set('nomen', '@machty');\n alex.get('name'); // '@machty'\n ```\n \n @method alias\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates an\n alias to the original value for property.\n @public\n */\n\n /**\n Where `computed.alias` aliases `get` and `set`, and allows for bidirectional\n data flow, `computed.oneWay` only provides an aliased `get`. The `set` will\n not mutate the upstream property, rather causes the current property to\n become the value set. This causes the downstream property to permanently\n diverge from the upstream property.\n \n Example\n \n ```javascript\n import { oneWay } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n firstName: null,\n lastName: null,\n nickName: oneWay('firstName')\n });\n \n let teddy = User.create({\n firstName: 'Teddy',\n lastName: 'Zeenny'\n });\n \n teddy.get('nickName'); // 'Teddy'\n teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'\n teddy.get('firstName'); // 'Teddy'\n ```\n \n @method oneWay\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @public\n */\n function oneWay(dependentKey) {\n return (0, _metal.alias)(dependentKey).oneWay();\n }\n\n /**\n This is a more semantically meaningful alias of `computed.oneWay`,\n whose name is somewhat ambiguous as to which direction the data flows.\n \n @method reads\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @public\n */\n\n /**\n Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides\n a readOnly one way binding. Very often when using `computed.oneWay` one does\n not also want changes to propagate back up, as they will replace the value.\n \n This prevents the reverse flow, and also throws an exception when it occurs.\n \n Example\n \n ```javascript\n import { readOnly } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n firstName: null,\n lastName: null,\n nickName: readOnly('firstName')\n });\n \n let teddy = User.create({\n firstName: 'Teddy',\n lastName: 'Zeenny'\n });\n \n teddy.get('nickName'); // 'Teddy'\n teddy.set('nickName', 'TeddyBear'); // throws Exception\n // throw new EmberError('Cannot Set: nickName on: ' );`\n teddy.get('firstName'); // 'Teddy'\n ```\n \n @method readOnly\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @since 1.5.0\n @public\n */\n function readOnly(dependentKey) {\n return (0, _metal.alias)(dependentKey).readOnly();\n }\n\n /**\n Creates a new property that is an alias for another property\n on an object. Calls to `get` or `set` this property behave as\n though they were called on the original property, but also\n print a deprecation warning.\n \n ```javascript\n import { deprecatingAlias } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n bananaCount: deprecatingAlias('cavendishCount', {\n id: 'hamster.deprecate-banana',\n until: '3.0.0'\n })\n });\n \n let hamster = Hamster.create();\n \n hamster.set('bananaCount', 5); // Prints a deprecation warning.\n hamster.get('cavendishCount'); // 5\n ```\n \n @method deprecatingAlias\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Object} options Options for `deprecate`.\n @return {ComputedProperty} computed property which creates an\n alias with a deprecation to the original value for property.\n @since 1.7.0\n @public\n */\n function deprecatingAlias(dependentKey, options) {\n return (0, _metal.computed)(dependentKey, {\n get(key) {\n (0, _debug.deprecate)(`Usage of \\`${key}\\` is deprecated, use \\`${dependentKey}\\` instead.`, false, options);\n return (0, _metal.get)(this, dependentKey);\n },\n set(key, value) {\n (0, _debug.deprecate)(`Usage of \\`${key}\\` is deprecated, use \\`${dependentKey}\\` instead.`, false, options);\n (0, _metal.set)(this, dependentKey, value);\n return value;\n }\n });\n }\n});","enifed('@ember/object/lib/computed/reduce_computed_macros', ['exports', '@ember/debug', '@ember/-internals/metal', '@ember/-internals/runtime'], function (exports, _debug, _metal, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.union = undefined;\n exports.sum = sum;\n exports.max = max;\n exports.min = min;\n exports.map = map;\n exports.mapBy = mapBy;\n exports.filter = filter;\n exports.filterBy = filterBy;\n exports.uniq = uniq;\n exports.uniqBy = uniqBy;\n exports.intersect = intersect;\n exports.setDiff = setDiff;\n exports.collect = collect;\n exports.sort = sort;\n\n\n function reduceMacro(dependentKey, callback, initialValue, name) {\n (0, _debug.assert)(`Dependent key passed to \\`computed.${name}\\` shouldn't contain brace expanding pattern.`, !/[\\[\\]\\{\\}]/g.test(dependentKey));\n\n let cp = new _metal.ComputedProperty(function () {\n let arr = (0, _metal.get)(this, dependentKey);\n if (arr === null || typeof arr !== 'object') {\n return initialValue;\n }\n return arr.reduce(callback, initialValue, this);\n }, { dependentKeys: [`${dependentKey}.[]`], readOnly: true });\n\n return cp;\n } /**\n @module @ember/object\n */\n\n\n function arrayMacro(dependentKey, callback) {\n // This is a bit ugly\n let propertyName;\n if (/@each/.test(dependentKey)) {\n propertyName = dependentKey.replace(/\\.@each.*$/, '');\n } else {\n propertyName = dependentKey;\n dependentKey += '.[]';\n }\n\n let cp = new _metal.ComputedProperty(function () {\n let value = (0, _metal.get)(this, propertyName);\n if ((0, _runtime.isArray)(value)) {\n return (0, _runtime.A)(callback.call(this, value));\n } else {\n return (0, _runtime.A)();\n }\n }, { readOnly: true });\n\n cp.property(dependentKey); // this forces to expand properties GH #15855\n\n return cp;\n }\n\n function multiArrayMacro(_dependentKeys, callback, name) {\n (0, _debug.assert)(`Dependent keys passed to \\`computed.${name}\\` shouldn't contain brace expanding pattern.`, _dependentKeys.every(dependentKey => !/[\\[\\]\\{\\}]/g.test(dependentKey)));\n let dependentKeys = _dependentKeys.map(key => `${key}.[]`);\n\n let cp = new _metal.ComputedProperty(function () {\n return (0, _runtime.A)(callback.call(this, _dependentKeys));\n }, { dependentKeys, readOnly: true });\n\n return cp;\n }\n\n /**\n A computed property that returns the sum of the values\n in the dependent array.\n \n @method sum\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the sum of all values in the dependentKey's array\n @since 1.4.0\n @public\n */\n function sum(dependentKey) {\n return reduceMacro(dependentKey, (sum, item) => sum + item, 0, 'sum');\n }\n\n /**\n A computed property that calculates the maximum value in the\n dependent array. This will return `-Infinity` when the dependent\n array is empty.\n \n ```javascript\n import { mapBy, max } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age'),\n maxChildAge: max('childAges')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('maxChildAge'); // -Infinity\n lordByron.get('children').pushObject({\n name: 'Augusta Ada Byron', age: 7\n });\n lordByron.get('maxChildAge'); // 7\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('maxChildAge'); // 8\n ```\n \n If the types of the arguments are not numbers,\n they will be converted to numbers and the type\n of the return value will always be `Number`.\n For example, the max of a list of Date objects will be\n the highest timestamp as a `Number`.\n This behavior is consistent with `Math.max`.\n \n @method max\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the largest value in the dependentKey's array\n @public\n */\n function max(dependentKey) {\n return reduceMacro(dependentKey, (max, item) => Math.max(max, item), -Infinity, 'max');\n }\n\n /**\n A computed property that calculates the minimum value in the\n dependent array. This will return `Infinity` when the dependent\n array is empty.\n \n ```javascript\n import { mapBy, min } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age'),\n minChildAge: min('childAges')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('minChildAge'); // Infinity\n lordByron.get('children').pushObject({\n name: 'Augusta Ada Byron', age: 7\n });\n lordByron.get('minChildAge'); // 7\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('minChildAge'); // 5\n ```\n \n If the types of the arguments are not numbers,\n they will be converted to numbers and the type\n of the return value will always be `Number`.\n For example, the min of a list of Date objects will be\n the lowest timestamp as a `Number`.\n This behavior is consistent with `Math.min`.\n \n @method min\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the smallest value in the dependentKey's array\n @public\n */\n function min(dependentKey) {\n return reduceMacro(dependentKey, (min, item) => Math.min(min, item), Infinity, 'min');\n }\n\n /**\n Returns an array mapped via the callback\n \n The callback method you provide should have the following signature.\n `item` is the current item in the iteration.\n `index` is the integer index of the current item in the iteration.\n \n ```javascript\n function(item, index);\n ```\n \n Example\n \n ```javascript\n import { map } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n excitingChores: map('chores', function(chore, index) {\n return chore.toUpperCase() + '!';\n })\n });\n \n let hamster = Hamster.create({\n chores: ['clean', 'write more unit tests']\n });\n \n hamster.get('excitingChores'); // ['CLEAN!', 'WRITE MORE UNIT TESTS!']\n ```\n \n @method map\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {Function} callback\n @return {ComputedProperty} an array mapped via the callback\n @public\n */\n function map(dependentKey, callback) {\n return arrayMacro(dependentKey, function (value) {\n return value.map(callback, this);\n });\n }\n\n /**\n Returns an array mapped to the specified key.\n \n ```javascript\n import { mapBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('childAges'); // []\n lordByron.get('children').pushObject({ name: 'Augusta Ada Byron', age: 7 });\n lordByron.get('childAges'); // [7]\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('childAges'); // [7, 5, 8]\n ```\n \n @method mapBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @return {ComputedProperty} an array mapped to the specified key\n @public\n */\n function mapBy(dependentKey, propertyKey) {\n (0, _debug.assert)('`computed.mapBy` expects a property string for its second argument, ' + 'perhaps you meant to use \"map\"', typeof propertyKey === 'string');\n (0, _debug.assert)(`Dependent key passed to \\`computed.mapBy\\` shouldn't contain brace expanding pattern.`, !/[\\[\\]\\{\\}]/g.test(dependentKey));\n\n return map(`${dependentKey}.@each.${propertyKey}`, item => (0, _metal.get)(item, propertyKey));\n }\n\n /**\n Filters the array by the callback.\n \n The callback method you provide should have the following signature.\n `item` is the current item in the iteration.\n `index` is the integer index of the current item in the iteration.\n `array` is the dependant array itself.\n \n ```javascript\n function(item, index, array);\n ```\n \n ```javascript\n import { filter } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filter('chores', function(chore, index, array) {\n return !chore.done;\n })\n });\n \n let hamster = Hamster.create({\n chores: [\n { name: 'cook', done: true },\n { name: 'clean', done: true },\n { name: 'write more unit tests', done: false }\n ]\n });\n \n hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]\n ```\n \n You can also use `@each.property` in your dependent key, the callback will still use the underlying array:\n \n ```javascript\n import { A } from '@ember/array';\n import { filter } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filter('chores.@each.done', function(chore, index, array) {\n return !chore.get('done');\n })\n });\n \n let hamster = Hamster.create({\n chores: A([\n EmberObject.create({ name: 'cook', done: true }),\n EmberObject.create({ name: 'clean', done: true }),\n EmberObject.create({ name: 'write more unit tests', done: false })\n ])\n });\n hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]\n hamster.get('chores').objectAt(2).set('done', true);\n hamster.get('remainingChores'); // []\n ```\n \n \n @method filter\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {Function} callback\n @return {ComputedProperty} the filtered array\n @public\n */\n function filter(dependentKey, callback) {\n return arrayMacro(dependentKey, function (value) {\n return value.filter(callback, this);\n });\n }\n\n /**\n Filters the array by the property and value\n \n ```javascript\n import { filterBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filterBy('chores', 'done', false)\n });\n \n let hamster = Hamster.create({\n chores: [\n { name: 'cook', done: true },\n { name: 'clean', done: true },\n { name: 'write more unit tests', done: false }\n ]\n });\n \n hamster.get('remainingChores'); // [{ name: 'write more unit tests', done: false }]\n ```\n \n @method filterBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @param {*} value\n @return {ComputedProperty} the filtered array\n @public\n */\n function filterBy(dependentKey, propertyKey, value) {\n (0, _debug.assert)(`Dependent key passed to \\`computed.filterBy\\` shouldn't contain brace expanding pattern.`, !/[\\[\\]\\{\\}]/g.test(dependentKey));\n\n let callback;\n if (arguments.length === 2) {\n callback = item => (0, _metal.get)(item, propertyKey);\n } else {\n callback = item => (0, _metal.get)(item, propertyKey) === value;\n }\n\n return filter(`${dependentKey}.@each.${propertyKey}`, callback);\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from one or more dependent arrays.\n \n Example\n \n ```javascript\n import { uniq } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: uniq('fruits')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'banana',\n 'grape',\n 'kale',\n 'banana'\n ]\n });\n \n hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale']\n ```\n \n @method uniq\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n function uniq(...args) {\n return multiArrayMacro(args, function (dependentKeys) {\n let uniq = (0, _runtime.A)();\n let seen = new Set();\n\n dependentKeys.forEach(dependentKey => {\n let value = (0, _metal.get)(this, dependentKey);\n if ((0, _runtime.isArray)(value)) {\n value.forEach(item => {\n if (!seen.has(item)) {\n seen.add(item);\n uniq.push(item);\n }\n });\n }\n });\n\n return uniq;\n }, 'uniq');\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from an array, with uniqueness determined by specific key.\n \n Example\n \n ```javascript\n import { uniqBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: uniqBy('fruits', 'id')\n });\n let hamster = Hamster.create({\n fruits: [\n { id: 1, 'banana' },\n { id: 2, 'grape' },\n { id: 3, 'peach' },\n { id: 1, 'banana' }\n ]\n });\n hamster.get('uniqueFruits'); // [ { id: 1, 'banana' }, { id: 2, 'grape' }, { id: 3, 'peach' }]\n ```\n \n @method uniqBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n function uniqBy(dependentKey, propertyKey) {\n (0, _debug.assert)(`Dependent key passed to \\`computed.uniqBy\\` shouldn't contain brace expanding pattern.`, !/[\\[\\]\\{\\}]/g.test(dependentKey));\n\n let cp = new _metal.ComputedProperty(function () {\n let list = (0, _metal.get)(this, dependentKey);\n return (0, _runtime.isArray)(list) ? (0, _runtime.uniqBy)(list, propertyKey) : (0, _runtime.A)();\n }, { dependentKeys: [`${dependentKey}.[]`], readOnly: true });\n\n return cp;\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from one or more dependent arrays.\n \n Example\n \n ```javascript\n import { union } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: union('fruits', 'vegetables')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'banana',\n 'grape',\n 'kale',\n 'banana',\n 'tomato'\n ],\n vegetables: [\n 'tomato',\n 'carrot',\n 'lettuce'\n ]\n });\n \n hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale', 'tomato', 'carrot', 'lettuce']\n ```\n \n @method union\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n let union = exports.union = uniq;\n\n /**\n A computed property which returns a new array with all the elements\n two or more dependent arrays have in common.\n \n Example\n \n ```javascript\n import { intersect } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let obj = EmberObject.extend({\n friendsInCommon: intersect('adaFriends', 'charlesFriends')\n }).create({\n adaFriends: ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],\n charlesFriends: ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock']\n });\n \n obj.get('friendsInCommon'); // ['William King', 'Mary Somerville']\n ```\n \n @method intersect\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n duplicated elements from the dependent arrays\n @public\n */\n function intersect(...args) {\n return multiArrayMacro(args, function (dependentKeys) {\n let arrays = dependentKeys.map(dependentKey => {\n let array = (0, _metal.get)(this, dependentKey);\n return (0, _runtime.isArray)(array) ? array : [];\n });\n\n let results = arrays.pop().filter(candidate => {\n for (let i = 0; i < arrays.length; i++) {\n let found = false;\n let array = arrays[i];\n for (let j = 0; j < array.length; j++) {\n if (array[j] === candidate) {\n found = true;\n break;\n }\n }\n\n if (found === false) {\n return false;\n }\n }\n\n return true;\n }, 'intersect');\n\n return (0, _runtime.A)(results);\n });\n }\n\n /**\n A computed property which returns a new array with all the\n properties from the first dependent array that are not in the second\n dependent array.\n \n Example\n \n ```javascript\n import { setDiff } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n likes: ['banana', 'grape', 'kale'],\n wants: setDiff('likes', 'fruits')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'grape',\n 'kale',\n ]\n });\n \n hamster.get('wants'); // ['banana']\n ```\n \n @method setDiff\n @for @ember/object/computed\n @static\n @param {String} setAProperty\n @param {String} setBProperty\n @return {ComputedProperty} computes a new array with all the\n items from the first dependent array that are not in the second\n dependent array\n @public\n */\n function setDiff(setAProperty, setBProperty) {\n (0, _debug.assert)('`computed.setDiff` requires exactly two dependent arrays.', arguments.length === 2);\n (0, _debug.assert)(`Dependent keys passed to \\`computed.setDiff\\` shouldn't contain brace expanding pattern.`, !/[\\[\\]\\{\\}]/g.test(setAProperty) && !/[\\[\\]\\{\\}]/g.test(setBProperty));\n\n let cp = new _metal.ComputedProperty(function () {\n let setA = this.get(setAProperty);\n let setB = this.get(setBProperty);\n\n if (!(0, _runtime.isArray)(setA)) {\n return (0, _runtime.A)();\n }\n if (!(0, _runtime.isArray)(setB)) {\n return (0, _runtime.A)(setA);\n }\n\n return setA.filter(x => setB.indexOf(x) === -1);\n }, {\n dependentKeys: [`${setAProperty}.[]`, `${setBProperty}.[]`],\n readOnly: true\n });\n\n return cp;\n }\n\n /**\n A computed property that returns the array of values\n for the provided dependent properties.\n \n Example\n \n ```javascript\n import { collect } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n clothes: collect('hat', 'shirt')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('clothes'); // [null, null]\n hamster.set('hat', 'Camp Hat');\n hamster.set('shirt', 'Camp Shirt');\n hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']\n ```\n \n @method collect\n @for @ember/object/computed\n @static\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which maps\n values of all passed in properties to an array.\n @public\n */\n function collect(...dependentKeys) {\n return multiArrayMacro(dependentKeys, function () {\n let properties = (0, _metal.getProperties)(this, dependentKeys);\n let res = (0, _runtime.A)();\n for (let key in properties) {\n if (properties.hasOwnProperty(key)) {\n if (properties[key] === undefined) {\n res.push(null);\n } else {\n res.push(properties[key]);\n }\n }\n }\n return res;\n }, 'collect');\n }\n\n /**\n A computed property which returns a new array with all the\n properties from the first dependent array sorted based on a property\n or sort function.\n \n The callback method you provide should have the following signature:\n \n ```javascript\n function(itemA, itemB);\n ```\n \n - `itemA` the first item to compare.\n - `itemB` the second item to compare.\n \n This function should return negative number (e.g. `-1`) when `itemA` should come before\n `itemB`. It should return positive number (e.g. `1`) when `itemA` should come after\n `itemB`. If the `itemA` and `itemB` are equal this function should return `0`.\n \n Therefore, if this function is comparing some numeric values, simple `itemA - itemB` or\n `itemA.get( 'foo' ) - itemB.get( 'foo' )` can be used instead of series of `if`.\n \n Example\n \n ```javascript\n import { sort } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let ToDoList = EmberObject.extend({\n // using standard ascending sort\n todosSorting: Object.freeze(['name']),\n sortedTodos: sort('todos', 'todosSorting'),\n \n // using descending sort\n todosSortingDesc: Object.freeze(['name:desc']),\n sortedTodosDesc: sort('todos', 'todosSortingDesc'),\n \n // using a custom sort function\n priorityTodos: sort('todos', function(a, b){\n if (a.priority > b.priority) {\n return 1;\n } else if (a.priority < b.priority) {\n return -1;\n }\n \n return 0;\n })\n });\n \n let todoList = ToDoList.create({todos: [\n { name: 'Unit Test', priority: 2 },\n { name: 'Documentation', priority: 3 },\n { name: 'Release', priority: 1 }\n ]});\n \n todoList.get('sortedTodos'); // [{ name:'Documentation', priority:3 }, { name:'Release', priority:1 }, { name:'Unit Test', priority:2 }]\n todoList.get('sortedTodosDesc'); // [{ name:'Unit Test', priority:2 }, { name:'Release', priority:1 }, { name:'Documentation', priority:3 }]\n todoList.get('priorityTodos'); // [{ name:'Release', priority:1 }, { name:'Unit Test', priority:2 }, { name:'Documentation', priority:3 }]\n ```\n \n @method sort\n @for @ember/object/computed\n @static\n @param {String} itemsKey\n @param {String or Function} sortDefinition a dependent key to an\n array of sort properties (add `:desc` to the arrays sort properties to sort descending) or a function to use when sorting\n @return {ComputedProperty} computes a new sorted array based\n on the sort property array or callback function\n @public\n */\n function sort(itemsKey, sortDefinition) {\n (0, _debug.assert)('`computed.sort` requires two arguments: an array key to sort and ' + 'either a sort properties key or sort function', arguments.length === 2);\n\n if (typeof sortDefinition === 'function') {\n return customSort(itemsKey, sortDefinition);\n } else {\n return propertySort(itemsKey, sortDefinition);\n }\n }\n\n function customSort(itemsKey, comparator) {\n return arrayMacro(itemsKey, function (value) {\n return value.slice().sort((x, y) => comparator.call(this, x, y));\n });\n }\n\n // This one needs to dynamically set up and tear down observers on the itemsKey\n // depending on the sortProperties\n function propertySort(itemsKey, sortPropertiesKey) {\n let cp = new _metal.ComputedProperty(function (key) {\n let sortProperties = (0, _metal.get)(this, sortPropertiesKey);\n\n (0, _debug.assert)(`The sort definition for '${key}' on ${this} must be a function or an array of strings`, (0, _runtime.isArray)(sortProperties) && sortProperties.every(s => typeof s === 'string'));\n\n // Add/remove property observers as required.\n let activeObserversMap = cp._activeObserverMap || (cp._activeObserverMap = new WeakMap());\n let activeObservers = activeObserversMap.get(this);\n\n let sortPropertyDidChangeMap = cp._sortPropertyDidChangeMap || (cp._sortPropertyDidChangeMap = new WeakMap());\n\n if (!sortPropertyDidChangeMap.has(this)) {\n sortPropertyDidChangeMap.set(this, function () {\n this.notifyPropertyChange(key);\n });\n }\n\n let sortPropertyDidChange = sortPropertyDidChangeMap.get(this);\n\n if (activeObservers !== undefined) {\n activeObservers.forEach(path => (0, _metal.removeObserver)(this, path, sortPropertyDidChange));\n }\n\n let itemsKeyIsAtThis = itemsKey === '@this';\n let normalizedSortProperties = normalizeSortProperties(sortProperties);\n if (normalizedSortProperties.length === 0) {\n let path = itemsKeyIsAtThis ? `[]` : `${itemsKey}.[]`;\n (0, _metal.addObserver)(this, path, sortPropertyDidChange);\n activeObservers = [path];\n } else {\n activeObservers = normalizedSortProperties.map(([prop]) => {\n let path = itemsKeyIsAtThis ? `@each.${prop}` : `${itemsKey}.@each.${prop}`;\n (0, _metal.addObserver)(this, path, sortPropertyDidChange);\n return path;\n });\n }\n\n activeObserversMap.set(this, activeObservers);\n\n let items = itemsKeyIsAtThis ? this : (0, _metal.get)(this, itemsKey);\n if (!(0, _runtime.isArray)(items)) {\n return (0, _runtime.A)();\n }\n\n if (normalizedSortProperties.length === 0) {\n return (0, _runtime.A)(items.slice());\n } else {\n return sortByNormalizedSortProperties(items, normalizedSortProperties);\n }\n }, { dependentKeys: [`${sortPropertiesKey}.[]`], readOnly: true });\n\n cp._activeObserverMap = undefined;\n cp._sortPropertyDidChangeMap = undefined;\n\n return cp;\n }\n\n function normalizeSortProperties(sortProperties) {\n return sortProperties.map(p => {\n let [prop, direction] = p.split(':');\n direction = direction || 'asc';\n\n return [prop, direction];\n });\n }\n\n function sortByNormalizedSortProperties(items, normalizedSortProperties) {\n return (0, _runtime.A)(items.slice().sort((itemA, itemB) => {\n for (let i = 0; i < normalizedSortProperties.length; i++) {\n let [prop, direction] = normalizedSortProperties[i];\n let result = (0, _runtime.compare)((0, _metal.get)(itemA, prop), (0, _metal.get)(itemB, prop));\n if (result !== 0) {\n return direction === 'desc' ? -1 * result : result;\n }\n }\n return 0;\n }));\n }\n});","enifed('@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 Ember.computed.empty'](assert) {\n let obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n\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\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n\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 Ember.computed.notEmpty'](assert) {\n let obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n\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\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n\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 computed.not'](assert) {\n let obj = { foo: true };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n\n obj = { foo: { bar: true } };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo.bar'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n }\n\n ['@test computed.empty'](assert) {\n let obj = { foo: [], bar: undefined, baz: null, quz: '' };\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\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 computed.bool'](assert) {\n let obj = { foo() {}, bar: 'asdf', baz: null, quz: false };\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 computed.alias'](assert) {\n let obj = { bar: 'asdf', baz: null, quz: false };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\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\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\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n (0, _metal.set)(obj, 'quzAlias', null);\n\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\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 computed.alias set'](assert) {\n let obj = {};\n let constantValue = 'always `a`';\n\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\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n\n (0, _metal.set)(obj, 'aliased', 'should not set to this value');\n\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n }\n\n ['@test computed.match'](assert) {\n let obj = { name: 'Paul' };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.match)('name', /Paul/));\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n\n (0, _metal.set)(obj, 'name', 'Pierre');\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test computed.notEmpty'](assert) {\n let obj = { items: [1] };\n (0, _metal.defineProperty)(obj, 'hasItems', (0, _computed.notEmpty)('items'));\n\n assert.equal((0, _metal.get)(obj, 'hasItems'), true, 'is not empty');\n\n (0, _metal.set)(obj, 'items', []);\n\n assert.equal((0, _metal.get)(obj, 'hasItems'), false, 'is empty');\n }\n\n ['@test computed.equal'](assert) {\n let obj = { name: 'Paul' };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.equal)('name', 'Paul'));\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n\n (0, _metal.set)(obj, 'name', 'Pierre');\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test computed.gt'](assert) {\n let obj = { number: 2 };\n (0, _metal.defineProperty)(obj, 'isGreaterThenOne', (0, _computed.gt)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), true, 'is gt');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n\n (0, _metal.set)(obj, 'number', 0);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n }\n\n ['@test computed.gte'](assert) {\n let obj = { number: 2 };\n (0, _metal.defineProperty)(obj, 'isGreaterOrEqualThenOne', (0, _computed.gte)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n\n (0, _metal.set)(obj, 'number', 0);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), false, 'is not gte');\n }\n\n ['@test computed.lt'](assert) {\n let obj = { number: 0 };\n (0, _metal.defineProperty)(obj, 'isLesserThenOne', (0, _computed.lt)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), true, 'is lt');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n\n (0, _metal.set)(obj, 'number', 2);\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n }\n\n ['@test computed.lte'](assert) {\n let obj = { number: 0 };\n (0, _metal.defineProperty)(obj, 'isLesserOrEqualThenOne', (0, _computed.lte)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n\n (0, _metal.set)(obj, 'number', 2);\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), false, 'is not lte');\n }\n\n ['@test computed.and two properties'](assert) {\n let obj = { one: true, two: true };\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two'));\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), true, 'one and two');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), false, 'one and not two');\n\n (0, _metal.set)(obj, 'one', null);\n (0, _metal.set)(obj, 'two', 'Yes');\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), null, 'returns falsy value as in &&');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), 2, 'returns truthy value as in &&');\n }\n\n ['@test computed.and three properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('one', 'two', 'three'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test computed.and expand properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('{one,two,three}'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test computed.or two properties'](assert) {\n let obj = { one: true, two: true };\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two'));\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), false, 'nor one nor two');\n\n (0, _metal.set)(obj, 'two', null);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or three properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('one', 'two', 'three'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', null);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or expand properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('{one,two,three}'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', null);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or and computed.and warn about dependent keys with spaces']() {\n let obj = { one: true, two: true };\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two three'));\n }, /Dependent keys passed to computed\\.or\\(\\) can't have spaces\\./);\n\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two three'));\n }, /Dependent keys passed to computed\\.and\\(\\) can't have spaces\\./);\n }\n\n ['@test computed.oneWay'](assert) {\n let obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.oneWay)('firstName'));\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\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\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n }\n\n ['@test computed.readOnly'](assert) {\n let obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.readOnly)('firstName'));\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\n assert.throws(function () {\n (0, _metal.set)(obj, 'nickName', 'TeddyBear');\n }, / /);\n\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TEDDDDDDDDYYY');\n }\n\n ['@test computed.deprecatingAlias'](assert) {\n let obj = { bar: 'asdf', baz: null, quz: false };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\n\n (0, _metal.defineProperty)(obj, 'barAlias', (0, _computed.deprecatingAlias)('bar', { id: 'bar-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'bazAlias', (0, _computed.deprecatingAlias)('baz', { id: 'baz-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'quzAlias', (0, _computed.deprecatingAlias)('quz', { id: 'quz-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'bayAlias', (0, _computed.deprecatingAlias)('bay', { id: 'bay-deprecation', 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\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bazAlias'), null);\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'quzAlias'), false);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bayAlias'), 'apple');\n }, 'Usage of `bayAlias` is deprecated, use `bay` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n }, 'Usage of `barAlias` is deprecated, use `bar` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'quzAlias', null);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n\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\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});","enifed('@ember/object/tests/computed/reduce_computed_macros_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/object/computed', '@ember/canary-features', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _computed, _canaryFeatures, _internalTestHelpers) {\n 'use strict';\n\n let 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)([{ v: { name: 'Robert' } }, { v: { name: 'Leanna' } }]),\n\n array: (0, _runtime.A)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\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\n obj.get('array').pushObject({ v: 5 });\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n\n (0, _runtime.removeAt)(obj.get('array'), 3);\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n ['@test it maps simple unshifted properties'](assert) {\n let array = (0, _runtime.A)();\n\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', item => item.toUpperCase())\n }).create({\n array\n });\n\n array.unshiftObject('c');\n array.unshiftObject('b');\n array.unshiftObject('a');\n\n array.popObject();\n\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 upperCase(string) {\n return string.toUpperCase();\n }\n }).create({\n array: ['a', 'b', 'c']\n });\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 let array = ['a', 'b', 'c'];\n\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', (item, index) => index)\n }).create({\n array\n });\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'), [{ name: 'Robert' }, { name: 'Leanna' }]);\n\n obj.get('arrayObjects').pushObject({\n v: { name: 'Eddard' }\n });\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Robert' }, { name: 'Leanna' }, { name: 'Eddard' }]);\n\n (0, _runtime.removeAt)(obj.get('arrayObjects'), 1);\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Robert' }, { name: 'Eddard' }]);\n\n (0, _metal.set)(obj.get('arrayObjects')[0], 'v', { name: 'Stannis' });\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Stannis' }, { name: 'Eddard' }]);\n }\n\n ['@test it maps unshifted objects with property observers'](assert) {\n let array = (0, _runtime.A)();\n let cObj = { 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\n array.unshiftObject(cObj);\n array.unshiftObject({ v: 'b' });\n array.unshiftObject({ v: 'a' });\n\n (0, _metal.set)(cObj, 'v', 'd');\n\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\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)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\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\n obj.get('array').pushObject({ v: 5 });\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n\n (0, _runtime.removeAt)(obj.get('array'), 3);\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n ['@test it is observable'](assert) {\n let calls = 0;\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n\n (0, _metal.addObserver)(obj, 'mapped.@each', () => calls++);\n\n obj.get('array').pushObject({ v: 5 });\n\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\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 isOne(value) {\n return value === 1;\n }\n }).create({\n array: ['a', 'b', 'c']\n });\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\n assert.deepEqual(obj.get('filtered'), ['b'], 'array is passed to callback correctly');\n }\n\n ['@test it caches properly'](assert) {\n let array = obj.get('array');\n\n let filtered = obj.get('filtered');\n assert.ok(filtered === obj.get('filtered'));\n\n array.addObject(11);\n let newFiltered = obj.get('filtered');\n\n assert.ok(filtered !== newFiltered);\n\n assert.ok(obj.get('filtered') === newFiltered);\n }\n\n ['@test it updates as the array is modified'](assert) {\n let array = obj.get('array');\n\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n array.addObject(11);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'objects not passing the filter are not added');\n\n array.addObject(12);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8, 12], 'objects passing the filter are added');\n\n array.removeObject(3);\n array.removeObject(4);\n\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 let array = (0, _metal.get)(obj, 'array');\n\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n // clear 1-8 but in a random order\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\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\n obj.get('array').clear();\n\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\n obj.set('array', [20, 21, 22, 23, 24]);\n\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 let item = _runtime.Object.create({ prop: true });\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\n assert.deepEqual(obj.get('filtered'), [item]);\n\n item.set('prop', false);\n\n assert.deepEqual(obj.get('filtered'), []);\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)([{ name: 'one', a: 1, b: false }, { name: 'two', a: 2, b: false }, { name: 'three', a: 1, b: true }, { name: 'four', b: true }])\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\n (0, _metal.set)(obj.get('array')[0], 'a', undefined);\n (0, _metal.set)(obj.get('array')[3], 'a', true);\n\n (0, _metal.set)(obj.get('array')[0], 'b', true);\n (0, _metal.set)(obj.get('array')[3], 'b', false);\n\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\n obj.get('array').pushObject({ name: 'five', a: 6, 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\n obj.get('array').popObject();\n\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\n obj.set('array', [{ name: 'six', a: 12, 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\n obj.get('array').pushObject({ name: 'five', a: 1 });\n\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three', 'five'], 'arrays computed by matching value respond to added objects');\n\n obj.get('array').popObject();\n\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three'], 'arrays computed by matching value respond to removed objects');\n\n (0, _metal.set)(obj.get('array')[1], 'a', 1);\n (0, _metal.set)(obj.get('array')[2], 'a', 2);\n\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\n assert.deepEqual(obj.get('a1bs').mapBy('name'), [], 'properties can be filtered by matching value');\n\n (0, _metal.set)(obj, 'array', [{ name: 'item1', a: 1, 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 let [name, macro] = tuple;\n\n (0, _internalTestHelpers.moduleFor)(`computed.${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 let array = obj.get('array');\n let array2 = obj.get('array2');\n\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\n array.pushObject(8);\n\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\n array.pushObject(11);\n\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\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\n array2.removeObject(7);\n\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 let array = obj.get('array');\n\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\n array.removeObject(6);\n\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\n array.clear();\n\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)('computed.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)([{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 1, value: 'one' }])\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 ['@test does not include duplicates'](assert) {\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }]);\n }\n\n ['@test it does not share state among instances'](assert) {\n let MyObject = _runtime.Object.extend({\n list: [],\n uniqueByName: (0, _computed.uniqBy)('list', 'name')\n });\n let a = MyObject.create({\n list: [{ name: 'bob' }, { name: 'mitch' }, { name: 'mitch' }]\n });\n let b = MyObject.create({\n list: [{ name: 'warren' }, { name: 'mitch' }]\n });\n\n assert.deepEqual(a.get('uniqueByName'), [{ name: 'bob' }, { name: 'mitch' }]);\n // Making sure that 'mitch' appears\n assert.deepEqual(b.get('uniqueByName'), [{ name: 'warren' }, { name: 'mitch' }]);\n }\n\n ['@test it handles changes to the dependent array'](assert) {\n obj.get('list').pushObject({ id: 3, value: 'three' });\n\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 3, value: 'three' }], 'The list includes three');\n\n obj.get('list').pushObject({ id: 3, value: 'three' });\n\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 3, value: 'three' }], '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 let MyObject = _runtime.Object.extend({\n list: null,\n uniq: (0, _computed.uniqBy)('list', 'name')\n });\n let a = MyObject.create({ list: 'not an array' });\n\n assert.deepEqual(a.get('uniq'), []);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed.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 let array2 = obj.get('array2');\n let array3 = obj.get('array3');\n\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'intersection is initially correct');\n\n array2.shiftObject();\n\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\n array2.shiftObject();\n\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\n array2.shiftObject();\n\n assert.deepEqual(obj.get('intersection'), [5], 'objects are removed once they are gone from all dependent arrays');\n\n array2.pushObject(1);\n\n assert.deepEqual(obj.get('intersection'), [5], 'objects are not added as long as they are missing from any dependent array');\n\n array3.pushObject(1);\n\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 }, /\\`computed\\.setDiff\\` requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n\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 }, /\\`computed\\.setDiff\\` requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n }\n\n ['@test it has set-diff semantics'](assert) {\n let array1 = obj.get('array');\n let array2 = obj.get('array2');\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'set-diff is initially correct');\n\n array2.popObject();\n\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\n array2.shiftObject();\n\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\n array1.removeObject(3);\n\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\n array1.pushObject(5);\n\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\n array1.pushObject(22);\n\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 (0, _internalTestHelpers.moduleFor)('sort - sortProperties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)(['lname', 'fname']),\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sort 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\n obj.set('items', [{ fname: 'Roose', lname: 'Bolton' }, { fname: 'Theon', lname: 'Greyjoy' }, { fname: 'Ramsey', lname: 'Bolton' }, { fname: 'Stannis', 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 let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\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\n obj.get('items').popObject();\n\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 let jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n\n let jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n\n let items = obj.get('items');\n\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n\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 let tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n let tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n let items = obj.get('items');\n\n items.pushObject(tyrion);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n\n items.pushObject(tyrionInDisguise);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Yollo', 'Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n }\n\n ['@test updating sort properties detaches observers for old sort properties'](assert) {\n let objectToRemove = obj.get('items')[3];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname:desc']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei', 'Bran'], 'after updating sort properties array is updated');\n\n obj.get('items').removeObject(objectToRemove);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei'], 'after removing item array is updated');\n\n (0, _metal.set)(objectToRemove, 'lname', 'Updated-Stark');\n\n assert.deepEqual(obj.get('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 obj.set('items', null);\n assert.deepEqual(obj.get('sortedItems'), []);\n obj.set('items', (0, _runtime.A)([{ fname: 'Cersei', lname: 'Lanister' }]));\n assert.deepEqual(obj.get('sortedItems'), [{ fname: 'Cersei', lname: 'Lanister' }]);\n }\n\n ['@test updating sort properties updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname:desc']));\n\n assert.deepEqual(obj.get('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 let sortProps = obj.get('itemSorting');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n sortProps.clear();\n sortProps.pushObject('fname');\n\n assert.deepEqual(obj.get('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(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['age:desc', 'fname:asc']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Robb', 'Bran'], 'precond - array is correct after item sorting is changed');\n\n (0, _metal.set)(obj.get('items')[1], 'age', 29);\n\n assert.deepEqual(obj.get('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(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb']);\n }\n\n ['@test sort direction defaults to ascending (with sort property change)'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname']));\n\n assert.deepEqual(obj.get('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 let tyrionInDisguise = obj.get('items')[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n\n assert.deepEqual(obj.get('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 let sansaInDisguise = obj.get('items')[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.setProperties)(sansaInDisguise, {\n fname: 'Sansa',\n lname: 'Stark'\n });\n\n assert.deepEqual(obj.get('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 let jaime = {\n name: 'Jaime',\n status: 1\n };\n\n let cersei = {\n name: 'Cersei',\n status: 2\n };\n\n let obj = _runtime.Object.extend({\n sortProps: ['status'],\n sortedPeople: (0, _computed.sort)('people', 'sortProps')\n }).create({\n people: [jaime, cersei]\n });\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'status', 3);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'array is sorted correctly');\n\n (0, _metal.set)(cersei, 'status', 2);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'array is sorted correctly');\n }\n\n ['@test array should not be sorted if sort properties array is empty'](assert) {\n var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n // 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 items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('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 var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n\n (0, _metal.set)(o, 'items', (0, _runtime.A)([5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4]));\n\n assert.deepEqual(o.get('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 var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n\n o.get('items').pushObject(12);\n\n assert.deepEqual(o.get('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 let daria = { name: 'Daria' };\n let jane = { name: 'Jane' };\n\n let sisters = [jane, daria];\n\n let sortProps = (0, _runtime.A)(['name']);\n let jaime = _runtime.Object.extend({\n sortedPeople: (0, _computed.sort)('sisters', 'sortProps'),\n sortProps\n }).create({\n sisters\n });\n\n jaime.get('sortedPeople');\n (0, _runloop.run)(jaime, 'destroy');\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 let jaime = {\n relatedObj: { status: 1, firstName: 'Jaime', lastName: 'Lannister' }\n };\n\n let cersei = {\n relatedObj: { status: 2, firstName: 'Cersei', lastName: 'Lannister' }\n };\n\n let sansa = _runtime.Object.create({\n relatedObj: { status: 3, firstName: 'Sansa', lastName: 'Stark' }\n });\n\n let obj = _runtime.Object.extend({\n sortProps: ['relatedObj.status'],\n sortedPeople: (0, _computed.sort)('people', 'sortProps')\n }).create({\n people: [jaime, cersei, sansa]\n });\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'status', 3);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n (0, _metal.set)(cersei, 'status', 1);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n sansa.set('status', 1);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n obj.set('sortProps', ['relatedObj.firstName']);\n\n assert.deepEqual(obj.get('sortedPeople'), [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)(obj, 'items', null);\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n\n (0, _metal.set)(obj, 'array', undefined);\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n\n (0, _metal.set)(obj, 'array', 'not an array');\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n }\n });\n\n function sortByLnameFname(a, b) {\n let lna = (0, _metal.get)(a, 'lname');\n let 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 let fna = (0, _metal.get)(a, 'fname');\n let fnb = (0, _metal.get)(b, 'fname');\n\n if (fna === fnb) {\n return 0;\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)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sort has correct `this`'](assert) {\n let 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 sortByLastName(a, b) {\n return sortByFnameAsc(a, b);\n }\n }).create({\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\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\n obj.set('items', [{ fname: 'Roose', lname: 'Bolton' }, { fname: 'Theon', lname: 'Greyjoy' }, { fname: 'Ramsey', lname: 'Bolton' }, { fname: 'Stannis', 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 let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\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\n obj.get('items').popObject();\n\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 let jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n\n let jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n\n let items = obj.get('items');\n\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n\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 let tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n let tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n let items = obj.get('items');\n\n items.pushObject(tyrion);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n\n items.pushObject(tyrionInDisguise);\n\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 let items = (0, _metal.get)(obj, 'items');\n\n let tyrionInDisguise = items[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n\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 changing item properties not specified via @each does not trigger a resort'](assert) {\n if (!_canaryFeatures.EMBER_METAL_TRACKED_PROPERTIES) {\n let items = obj.get('items');\n let cersei = items[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'lname', 'Stark'); // plot twist! (possibly not canon)\n\n // The array has become unsorted. If your sort function is sensitive to\n // properties, they *must* be specified as dependent item property keys or\n // we'll be doing binary searches on unsorted arrays.\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'updating an unspecified property on an item does not resort it');\n } else {\n assert.expect(0);\n }\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: [{ name: 'A', count: 1, thing: 4 }, { name: 'B', count: 1, thing: 3 }, { name: 'C', count: 1, thing: 2 }, { name: 'D', count: 1, thing: 4 }]\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\n (0, _metal.set)(obj.get('items')[3], 'count', 2);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'final');\n }\n });\n\n let 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)([{ name: 'A', count: 1, thing: 4, id: 1 }, { name: 'B', count: 2, thing: 3, id: 2 }, { name: 'C', count: 3, thing: 2, id: 3 }, { name: 'D', count: 4, thing: 1, id: 4 }])\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 let sorted = obj.get('sortedItems');\n assert.deepEqual(sorted.mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\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\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\n assert.deepEqual(obj.get('customSortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n\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 let obj2 = klass.create({\n items: (0, _runtime.A)([{ name: 'W', count: 23, thing: 4 }, { name: 'X', count: 24, thing: 3 }, { name: 'Y', count: 25, thing: 2 }, { name: 'Z', count: 26, 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\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\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\n obj.set('sortProps', ['thing']);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'final');\n\n obj2.notifyPropertyChange('sortedItems'); // invalidate to flush, to get DK refreshed\n obj2.get('sortedItems'); // flush to get updated DK\n\n obj2.set('items.firstObject.count', 9999);\n\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 let 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 ┌───────────┐ ┌────────────┐\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\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\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\n obj.set('sortProps', ['thing']);\n obj2.set('sortProps', ['id']);\n\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 }\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\n let items = obj.get('items');\n\n items.pushObject(5);\n\n assert.equal(obj.get('max'), 5, 'max updates when a larger number is added');\n\n items.pushObject(2);\n\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\n obj.get('items').removeObject(2);\n\n assert.equal(obj.get('max'), 3, 'max is unchanged when a non-max item is removed');\n\n obj.get('items').removeObject(3);\n\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\n obj.get('items').pushObject(-2);\n\n assert.equal(obj.get('min'), -2, 'min updates when a smaller number is added');\n\n obj.get('items').pushObject(2);\n\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 let items = obj.get('items');\n\n assert.equal(obj.get('min'), 1, 'precond - min is initially correct');\n\n items.removeObject(2);\n\n assert.equal(obj.get('min'), 1, 'min is unchanged when a non-min item is removed');\n\n items.removeObject(1);\n\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\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)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filtering and sorting can be combined'](assert) {\n let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedLannisters').mapBy('fname'), ['Cersei', 'Jaime'], 'precond - array is initially filtered and sorted');\n\n items.pushObject({ fname: 'Tywin', lname: 'Lannister' });\n items.pushObject({ fname: 'Lyanna', lname: 'Stark' });\n items.pushObject({ fname: 'Gerion', 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 let items = obj.get('items');\n\n assert.equal(16, obj.get('oldestStarkAge'), 'precond - end of chain is initially correct');\n\n items.pushObject({ fname: 'Rickon', lname: 'Stark', age: 5 });\n\n assert.equal(16, obj.get('oldestStarkAge'), 'chain is updated correctly');\n\n items.pushObject({ fname: 'Eddard', lname: 'Stark', age: 35 });\n\n assert.equal(35, obj.get('oldestStarkAge'), 'chain is updated correctly');\n }\n });\n\n function todo(name, priority) {\n return _runtime.Object.create({ name: name, priority: priority });\n }\n\n function priorityComparator(todoA, todoB) {\n let pa = parseInt((0, _metal.get)(todoA, 'priority'), 10);\n let pb = parseInt((0, _metal.get)(todoB, 'priority'), 10);\n\n return pa - pb;\n }\n\n function evenPriorities(todo) {\n let p = parseInt((0, _metal.get)(todo, 'priority'), 10);\n\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\n (0, _metal.set)(obj.get('todos')[1], 'priority', 6);\n\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 let 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)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test it computes interdependent array computed properties'](assert) {\n assert.equal(obj.get('max'), 3, 'sanity - it properly computes the maximum value');\n\n let calls = 0;\n\n (0, _metal.addObserver)(obj, 'max', () => calls++);\n\n obj.get('array').pushObject({ v: 5 });\n\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\n (0, _metal.set)(obj, 'array', undefined);\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n\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\n assert.equal(obj.get('total'), 7, 'recomputed when elements are added');\n\n obj.get('array').popObject();\n\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 let obj = { one: 'foo', two: 'bar', three: null };\n (0, _metal.defineProperty)(obj, 'all', (0, _computed.collect)('one', 'two', 'three', 'four'));\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, null], 'have all of them');\n\n (0, _metal.set)(obj, 'four', true);\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, true], 'have all of them');\n\n let a = [];\n (0, _metal.set)(obj, 'one', 0);\n (0, _metal.set)(obj, 'three', a);\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), [0, 'bar', a, true], 'have all of them');\n }\n });\n});","enifed('@ember/polyfills/index', ['exports', '@ember/polyfills/lib/assign', '@ember/polyfills/lib/weak_set', '@ember/deprecated-features', '@ember/polyfills/lib/merge'], function (exports, _assign, _weak_set, _deprecatedFeatures, _merge) {\n 'use strict';\n\n exports.__esModule = true;\n exports.merge = exports._WeakSet = exports.assignPolyfill = exports.assign = undefined;\n Object.defineProperty(exports, 'assign', {\n enumerable: true,\n get: function () {\n return _assign.default;\n }\n });\n Object.defineProperty(exports, 'assignPolyfill', {\n enumerable: true,\n get: function () {\n return _assign.assign;\n }\n });\n Object.defineProperty(exports, '_WeakSet', {\n enumerable: true,\n get: function () {\n return _weak_set.default;\n }\n });\n\n let merge = _deprecatedFeatures.MERGE ? _merge.default : undefined;\n // Export `assignPolyfill` for testing\n exports.merge = merge;\n});","enifed(\"@ember/polyfills/lib/assign\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.assign = assign;\n /**\n @module @ember/polyfills\n */\n /**\n Copy properties from a source object to a target object.\n \n ```javascript\n import { assign } from '@ember/polyfills';\n \n var a = { first: 'Yehuda' };\n var b = { last: 'Katz' };\n var c = { company: 'Tilde Inc.' };\n assign(a, b, c); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' }, b === { last: 'Katz' }, c === { company: 'Tilde Inc.' }\n ```\n \n @method assign\n @for @ember/polyfills\n @param {Object} target The object to assign into\n @param {Object} ...args The objects to copy properties from\n @return {Object}\n @public\n @static\n */\n function assign(target) {\n for (let i = 1; i < arguments.length; i++) {\n let arg = arguments[i];\n if (!arg) {\n continue;\n }\n let updates = Object.keys(arg);\n for (let i = 0; i < updates.length; i++) {\n let prop = updates[i];\n target[prop] = arg[prop];\n }\n }\n return target;\n }\n // Note: We use the bracket notation so\n // that the babel plugin does not\n // transform it.\n // https://www.npmjs.com/package/babel-plugin-transform-object-assign\n const { assign: _assign } = Object;\n exports.default = _assign || assign;\n});","enifed('@ember/polyfills/lib/merge', ['exports', '@ember/debug'], function (exports, _debug) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = merge;\n\n /**\n Merge the contents of two objects together into the first object.\n \n ```javascript\n import { merge } from '@ember/polyfills';\n \n merge({ first: 'Tom' }, { last: 'Dale' }); // { first: 'Tom', last: 'Dale' }\n var a = { first: 'Yehuda' };\n var b = { last: 'Katz' };\n merge(a, b); // a == { first: 'Yehuda', last: 'Katz' }, b == { last: 'Katz' }\n ```\n \n @method merge\n @static\n @for @ember/polyfills\n @param {Object} original The object to merge into\n @param {Object} updates The object to copy properties from\n @return {Object}\n @public\n */\n function merge(original, updates) {\n (0, _debug.deprecate)('Use of `merge` has been deprecated. Please use `assign` instead.', false, {\n id: 'ember-polyfills.deprecate-merge',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x/#toc_ember-polyfills-deprecate-merge'\n });\n if (updates === null || typeof updates !== 'object') {\n return original;\n }\n let props = Object.keys(updates);\n let prop;\n for (let i = 0; i < props.length; i++) {\n prop = props[i];\n original[prop] = updates[prop];\n }\n return original;\n }\n});","enifed('@ember/polyfills/lib/weak_set', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = typeof WeakSet === 'function' ? WeakSet : class WeakSetPolyFill {\n constructor() {\n this._map = new WeakMap();\n }\n add(val) {\n this._map.set(val, true);\n return this;\n }\n delete(val) {\n return this._map.delete(val);\n }\n has(val) {\n return this._map.has(val);\n }\n };\n});","enifed('@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 let trgt = { a: 1 };\n let src1 = { b: 2 };\n let src2 = { c: 3 };\n this.assign(trgt, src1, src2);\n\n assert.deepEqual(trgt, { a: 1, b: 2, c: 3 }, 'assign copies values from one or more source objects to a target object');\n assert.deepEqual(src1, { b: 2 }, 'assign does not change source object 1');\n assert.deepEqual(src2, { c: 3 }, 'assign does not change source object 2');\n }\n\n ['@test merging objects with same property'](assert) {\n let trgt = { a: 1, b: 1 };\n let src1 = { a: 2, b: 2 };\n let src2 = { a: 3 };\n this.assign(trgt, src1, src2);\n\n assert.deepEqual(trgt, { a: 3, b: 2 }, 'properties are overwritten by other objects that have the same properties later in the parameters order');\n }\n\n ['@test null'](assert) {\n let trgt = { a: 1 };\n this.assign(trgt, null);\n\n assert.deepEqual(trgt, { a: 1 }, 'null as a source parameter is ignored');\n }\n\n ['@test undefined'](assert) {\n let trgt = { a: 1 };\n this.assign(trgt, null);\n\n assert.deepEqual(trgt, { a: 1 }, 'undefined as a source parameter is ignored');\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.assign (polyfill)', class extends AssignTests {\n assign() {\n return (0, _polyfills.assignPolyfill)(...arguments);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.assign (maybe not-polyfill ;) )', class extends AssignTests {\n assign() {\n return (0, _polyfills.assign)(...arguments);\n }\n });\n});","enifed('@ember/polyfills/tests/merge_test', ['@ember/polyfills', 'internal-test-helpers'], function (_polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.merge', class extends _internalTestHelpers.AbstractTestCase {\n ['@test merging objects'](assert) {\n let src1 = { a: 1 };\n let src2 = { b: 2 };\n expectDeprecation(() => {\n (0, _polyfills.merge)(src1, src2);\n }, 'Use of `merge` has been deprecated. Please use `assign` instead.');\n\n assert.deepEqual(src1, { a: 1, b: 2 }, 'merge copies values from second source object to first object');\n }\n });\n});","enifed('@ember/runloop/index', ['exports', '@ember/debug', '@ember/-internals/error-handling', '@ember/-internals/metal', 'backburner', '@ember/deprecated-features'], function (exports, _debug, _errorHandling, _metal, _backburner, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n exports.bind = exports._globalsRun = exports.backburner = exports.queues = exports._rsvpErrorQueue = undefined;\n exports.getCurrentRunLoop = getCurrentRunLoop;\n exports.run = run;\n exports.join = join;\n exports.begin = begin;\n exports.end = end;\n exports.schedule = schedule;\n exports.hasScheduledTimers = hasScheduledTimers;\n exports.cancelTimers = cancelTimers;\n exports.later = later;\n exports.once = once;\n exports.scheduleOnce = scheduleOnce;\n exports.next = next;\n exports.cancel = cancel;\n exports.debounce = debounce;\n exports.throttle = throttle;\n\n\n let currentRunLoop = null;\n function getCurrentRunLoop() {\n return currentRunLoop;\n }\n\n function onBegin(current) {\n currentRunLoop = current;\n }\n\n function onEnd(current, next) {\n currentRunLoop = next;\n }\n\n const _rsvpErrorQueue = exports._rsvpErrorQueue = `${Math.random()}${Date.now()}`.replace('.', '');\n\n /**\n Array of named queues. This array determines the order in which queues\n are flushed at the end of the RunLoop. You can define your own queues by\n simply adding the queue name to this array. Normally you should not need\n to inspect or modify this property.\n \n @property queues\n @type Array\n @default ['actions', 'destroy']\n @private\n */\n const queues = exports.queues = ['actions',\n\n // used in router transitions to prevent unnecessary loading state entry\n // if all context promises resolve on the 'actions' queue first\n 'routerTransitions', 'render', 'afterRender', 'destroy',\n\n // used to re-throw unhandled RSVP rejection errors specifically in this\n // position to avoid breaking anything rendered in the other sections\n _rsvpErrorQueue];\n\n let backburnerOptions = {\n defaultQueue: 'actions',\n onBegin,\n onEnd,\n onErrorTarget: _errorHandling.onErrorTarget,\n onErrorMethod: 'onerror'\n };\n\n if (_deprecatedFeatures.RUN_SYNC) {\n queues.unshift('sync');\n\n backburnerOptions.sync = {\n before: _metal.beginPropertyChanges,\n after: _metal.endPropertyChanges\n };\n }\n\n const backburner = exports.backburner = new _backburner.default(queues, backburnerOptions);\n\n /**\n @module @ember/runloop\n */\n // ..........................................................\n // run - this is ideally the only public API the dev sees\n //\n\n /**\n Runs the passed target and method inside of a RunLoop, ensuring any\n deferred actions including bindings and views updates are flushed at the\n end.\n \n Normally you should not need to invoke this method yourself. However if\n you are implementing raw event handlers when interfacing with other\n libraries or plugins, you should probably wrap all of your code inside this\n call.\n \n ```javascript\n import { run } from '@ember/runloop';\n \n run(function() {\n // code to be executed within a RunLoop\n });\n ```\n @method run\n @for @ember/runloop\n @static\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Object} return value from invoking the passed function.\n @public\n */\n function run() {\n return backburner.run(...arguments);\n }\n\n // used for the Ember.run global only\n const _globalsRun = exports._globalsRun = run.bind(null);\n\n /**\n If no run-loop is present, it creates a new one. If a run loop is\n present it will queue itself to run on the existing run-loops action\n queue.\n \n Please note: This is not for normal usage, and should be used sparingly.\n \n If invoked when not within a run loop:\n \n ```javascript\n import { join } from '@ember/runloop';\n \n join(function() {\n // creates a new run-loop\n });\n ```\n \n Alternatively, if called within an existing run loop:\n \n ```javascript\n import { run, join } from '@ember/runloop';\n \n run(function() {\n // creates a new run-loop\n \n join(function() {\n // joins with the existing run-loop, and queues for invocation on\n // the existing run-loops action queue.\n });\n });\n ```\n \n @method join\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Object} Return value from invoking the passed function. Please note,\n when called within an existing loop, no return value is possible.\n @public\n */\n function join() {\n return backburner.join(...arguments);\n }\n\n /**\n Allows you to specify which context to call the specified function in while\n adding the execution of that function to the Ember run loop. This ability\n makes this method a great way to asynchronously integrate third-party libraries\n into your Ember application.\n \n `bind` takes two main arguments, the desired context and the function to\n invoke in that context. Any additional arguments will be supplied as arguments\n to the function that is passed in.\n \n Let's use the creation of a TinyMCE component as an example. Currently,\n TinyMCE provides a setup configuration option we can use to do some processing\n after the TinyMCE instance is initialized but before it is actually rendered.\n We can use that setup option to do some additional setup for our component.\n The component itself could look something like the following:\n \n ```app/components/rich-text-editor.js\n import Component from '@ember/component';\n import { on } from '@ember/object/evented';\n import { bind } from '@ember/runloop';\n \n export default Component.extend({\n initializeTinyMCE: on('didInsertElement', function() {\n tinymce.init({\n selector: '#' + this.$().prop('id'),\n setup: bind(this, this.setupEditor)\n });\n }),\n \n didInsertElement() {\n tinymce.init({\n selector: '#' + this.$().prop('id'),\n setup: bind(this, this.setupEditor)\n });\n }\n \n setupEditor(editor) {\n this.set('editor', editor);\n \n editor.on('change', function() {\n console.log('content changed!');\n });\n }\n });\n ```\n \n In this example, we use `bind` to bind the setupEditor method to the\n context of the RichTextEditor component and to have the invocation of that\n method be safely handled and executed by the Ember run loop.\n \n @method bind\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Function} returns a new function that will always have a particular context\n @since 1.4.0\n @public\n */\n const bind = exports.bind = (...curried) => {\n (0, _debug.assert)('could not find a suitable method to bind', function (methodOrTarget, methodOrArg) {\n // Applies the same logic as backburner parseArgs for detecting if a method\n // is actually being passed.\n let length = arguments.length;\n\n if (length === 0) {\n return false;\n } else if (length === 1) {\n return typeof methodOrTarget === 'function';\n } else {\n let type = typeof methodOrArg;\n return type === 'function' || // second argument is a function\n methodOrTarget !== null && type === 'string' && methodOrArg in methodOrTarget || // second argument is the name of a method in first argument\n typeof methodOrTarget === 'function' //first argument is a function\n ;\n }\n }(...curried));\n return (...args) => join(...curried.concat(args));\n };\n\n /**\n Begins a new RunLoop. Any deferred actions invoked after the begin will\n be buffered until you invoke a matching call to `end()`. This is\n a lower-level way to use a RunLoop instead of using `run()`.\n \n ```javascript\n import { begin, end } from '@ember/runloop';\n \n begin();\n // code to be executed within a RunLoop\n end();\n ```\n \n @method begin\n @static\n @for @ember/runloop\n @return {void}\n @public\n */\n function begin() {\n backburner.begin();\n }\n\n /**\n Ends a RunLoop. This must be called sometime after you call\n `begin()` to flush any deferred actions. This is a lower-level way\n to use a RunLoop instead of using `run()`.\n \n ```javascript\n import { begin, end } from '@ember/runloop';\n \n begin();\n // code to be executed within a RunLoop\n end();\n ```\n \n @method end\n @static\n @for @ember/runloop\n @return {void}\n @public\n */\n function end() {\n backburner.end();\n }\n\n /**\n Adds the passed target/method and any optional arguments to the named\n queue to be executed at the end of the RunLoop. If you have not already\n started a RunLoop when calling this method one will be started for you\n automatically.\n \n At the end of a RunLoop, any methods scheduled in this way will be invoked.\n Methods will be invoked in an order matching the named queues defined in\n the `queues` property.\n \n ```javascript\n import { schedule } from '@ember/runloop';\n \n schedule('actions', this, function() {\n // this will be executed in the 'actions' queue, after bindings have synced.\n console.log('scheduled on actions queue');\n });\n \n // Note the functions will be run in order based on the run queues order.\n // Output would be:\n // scheduled on sync queue\n // scheduled on actions queue\n ```\n \n @method schedule\n @static\n @for @ember/runloop\n @param {String} queue The name of the queue to schedule against. Default queues is 'actions'\n @param {Object} [target] target object to use as the context when invoking a method.\n @param {String|Function} method The method to invoke. If you pass a string it\n will be resolved on the target object at the time the scheduled item is\n invoked allowing you to change the target function.\n @param {Object} [arguments*] Optional arguments to be passed to the queued method.\n @return {*} Timer information for use in canceling, see `cancel`.\n @public\n */\n function schedule(queue /*, target, method */) {\n (0, _debug.deprecate)(`Scheduling into the '${queue}' run loop queue is deprecated.`, queue !== 'sync', {\n id: 'ember-metal.run.sync',\n until: '3.5.0'\n });\n\n return backburner.schedule(...arguments);\n }\n\n // Used by global test teardown\n function hasScheduledTimers() {\n return backburner.hasTimers();\n }\n\n // Used by global test teardown\n function cancelTimers() {\n backburner.cancelTimers();\n }\n\n /**\n Invokes the passed target/method and optional arguments after a specified\n period of time. The last parameter of this method must always be a number\n of milliseconds.\n \n You should use this method whenever you need to run some action after a\n period of time instead of using `setTimeout()`. This method will ensure that\n items that expire during the same script execution cycle all execute\n together, which is often more efficient than using a real setTimeout.\n \n ```javascript\n import { later } from '@ember/runloop';\n \n later(myContext, function() {\n // code here will execute within a RunLoop in about 500ms with this == myContext\n }, 500);\n ```\n \n @method later\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} wait Number of milliseconds to wait.\n @return {*} Timer information for use in canceling, see `cancel`.\n @public\n */\n function later() /*target, method*/{\n return backburner.later(...arguments);\n }\n\n /**\n Schedule a function to run one time during the current RunLoop. This is equivalent\n to calling `scheduleOnce` with the \"actions\" queue.\n \n @method once\n @static\n @for @ember/runloop\n @param {Object} [target] The target of the method to invoke.\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `cancel`.\n @public\n */\n function once(...args) {\n args.unshift('actions');\n return backburner.scheduleOnce(...args);\n }\n\n /**\n Schedules a function to run one time in a given queue of the current RunLoop.\n Calling this method with the same queue/target/method combination will have\n no effect (past the initial call).\n \n Note that although you can pass optional arguments these will not be\n considered when looking for duplicates. New arguments will replace previous\n calls.\n \n ```javascript\n import { run, scheduleOnce } from '@ember/runloop';\n \n function sayHi() {\n console.log('hi');\n }\n \n run(function() {\n scheduleOnce('afterRender', myContext, sayHi);\n scheduleOnce('afterRender', myContext, sayHi);\n // sayHi will only be executed once, in the afterRender queue of the RunLoop\n });\n ```\n \n Also note that for `scheduleOnce` to prevent additional calls, you need to\n pass the same function instance. The following case works as expected:\n \n ```javascript\n function log() {\n console.log('Logging only once');\n }\n \n function scheduleIt() {\n scheduleOnce('actions', myContext, log);\n }\n \n scheduleIt();\n scheduleIt();\n ```\n \n But this other case will schedule the function multiple times:\n \n ```javascript\n import { scheduleOnce } from '@ember/runloop';\n \n function scheduleIt() {\n scheduleOnce('actions', myContext, function() {\n console.log('Closure');\n });\n }\n \n scheduleIt();\n scheduleIt();\n \n // \"Closure\" will print twice, even though we're using `scheduleOnce`,\n // because the function we pass to it won't match the\n // previously scheduled operation.\n ```\n \n Available queues, and their order, can be found at `queues`\n \n @method scheduleOnce\n @static\n @for @ember/runloop\n @param {String} [queue] The name of the queue to schedule against. Default queues is 'actions'.\n @param {Object} [target] The target of the method to invoke.\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `cancel`.\n @public\n */\n function scheduleOnce(queue /*, target, method*/) {\n (0, _debug.deprecate)(`Scheduling into the '${queue}' run loop queue is deprecated.`, queue !== 'sync', {\n id: 'ember-metal.run.sync',\n until: '3.5.0'\n });\n return backburner.scheduleOnce(...arguments);\n }\n\n /**\n Schedules an item to run from within a separate run loop, after\n control has been returned to the system. This is equivalent to calling\n `later` with a wait time of 1ms.\n \n ```javascript\n import { next } from '@ember/runloop';\n \n next(myContext, function() {\n // code to be executed in the next run loop,\n // which will be scheduled after the current one\n });\n ```\n \n Multiple operations scheduled with `next` will coalesce\n into the same later run loop, along with any other operations\n scheduled by `later` that expire right around the same\n time that `next` operations will fire.\n \n Note that there are often alternatives to using `next`.\n For instance, if you'd like to schedule an operation to happen\n after all DOM element operations have completed within the current\n run loop, you can make use of the `afterRender` run loop queue (added\n by the `ember-views` package, along with the preceding `render` queue\n where all the DOM element operations happen).\n \n Example:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n import { scheduleOnce } from '@ember/runloop';\n \n export Component.extend({\n didInsertElement() {\n this._super(...arguments);\n scheduleOnce('afterRender', this, 'processChildElements');\n },\n \n processChildElements() {\n // ... do something with component's child component\n // elements after they've finished rendering, which\n // can't be done within this component's\n // `didInsertElement` hook because that gets run\n // before the child elements have been added to the DOM.\n }\n });\n ```\n \n One benefit of the above approach compared to using `next` is\n that you will be able to perform DOM/CSS operations before unprocessed\n elements are rendered to the screen, which may prevent flickering or\n other artifacts caused by delaying processing until after rendering.\n \n The other major benefit to the above approach is that `next`\n introduces an element of non-determinism, which can make things much\n harder to test, due to its reliance on `setTimeout`; it's much harder\n to guarantee the order of scheduled operations when they are scheduled\n outside of the current run loop, i.e. with `next`.\n \n @method next\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `cancel`.\n @public\n */\n function next(...args) {\n args.push(1);\n return backburner.later(...args);\n }\n\n /**\n Cancels a scheduled item. Must be a value returned by `later()`,\n `once()`, `scheduleOnce()`, `next()`, `debounce()`, or\n `throttle()`.\n \n ```javascript\n import {\n next,\n cancel,\n later,\n scheduleOnce,\n once,\n throttle,\n debounce\n } from '@ember/runloop';\n \n let runNext = next(myContext, function() {\n // will not be executed\n });\n \n cancel(runNext);\n \n let runLater = later(myContext, function() {\n // will not be executed\n }, 500);\n \n cancel(runLater);\n \n let runScheduleOnce = scheduleOnce('afterRender', myContext, function() {\n // will not be executed\n });\n \n cancel(runScheduleOnce);\n \n let runOnce = once(myContext, function() {\n // will not be executed\n });\n \n cancel(runOnce);\n \n let throttle = throttle(myContext, function() {\n // will not be executed\n }, 1, false);\n \n cancel(throttle);\n \n let debounce = debounce(myContext, function() {\n // will not be executed\n }, 1);\n \n cancel(debounce);\n \n let debounceImmediate = debounce(myContext, function() {\n // will be executed since we passed in true (immediate)\n }, 100, true);\n \n // the 100ms delay until this method can be called again will be canceled\n cancel(debounceImmediate);\n ```\n \n @method cancel\n @static\n @for @ember/runloop\n @param {Object} timer Timer object to cancel\n @return {Boolean} true if canceled or false/undefined if it wasn't found\n @public\n */\n function cancel(timer) {\n return backburner.cancel(timer);\n }\n\n /**\n Delay calling the target method until the debounce period has elapsed\n with no additional debounce calls. If `debounce` is called again before\n the specified time has elapsed, the timer is reset and the entire period\n must pass again before the target method is called.\n \n This method should be used when an event may be called multiple times\n but the action should only be called once when the event is done firing.\n A common example is for scroll events where you only want updates to\n happen once scrolling has ceased.\n \n ```javascript\n import { debounce } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'debounce' };\n \n debounce(myContext, whoRan, 150);\n \n // less than 150ms passes\n debounce(myContext, whoRan, 150);\n \n // 150ms passes\n // whoRan is invoked with context myContext\n // console logs 'debounce ran.' one time.\n ```\n \n Immediate allows you to run the function immediately, but debounce\n other calls for this function until the wait time has elapsed. If\n `debounce` is called again before the specified time has elapsed,\n the timer is reset and the entire period must pass again before\n the method can be called again.\n \n ```javascript\n import { debounce } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'debounce' };\n \n debounce(myContext, whoRan, 150, true);\n \n // console logs 'debounce ran.' one time immediately.\n // 100ms passes\n debounce(myContext, whoRan, 150, true);\n \n // 150ms passes and nothing else is logged to the console and\n // the debouncee is no longer being watched\n debounce(myContext, whoRan, 150, true);\n \n // console logs 'debounce ran.' one time immediately.\n // 150ms passes and nothing else is logged to the console and\n // the debouncee is no longer being watched\n ```\n \n @method debounce\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} wait Number of milliseconds to wait.\n @param {Boolean} immediate Trigger the function on the leading instead\n of the trailing edge of the wait interval. Defaults to false.\n @return {Array} Timer information for use in canceling, see `cancel`.\n @public\n */\n function debounce() {\n return backburner.debounce(...arguments);\n }\n\n /**\n Ensure that the target method is never called more frequently than\n the specified spacing period. The target method is called immediately.\n \n ```javascript\n import { throttle } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'throttle' };\n \n throttle(myContext, whoRan, 150);\n // whoRan is invoked with context myContext\n // console logs 'throttle ran.'\n \n // 50ms passes\n throttle(myContext, whoRan, 150);\n \n // 50ms passes\n throttle(myContext, whoRan, 150);\n \n // 150ms passes\n throttle(myContext, whoRan, 150);\n // whoRan is invoked with context myContext\n // console logs 'throttle ran.'\n ```\n \n @method throttle\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} spacing Number of milliseconds to space out requests.\n @param {Boolean} immediate Trigger the function on the leading instead\n of the trailing edge of the wait interval. Defaults to true.\n @return {Array} Timer information for use in canceling, see `cancel`.\n @public\n */\n function throttle() {\n return backburner.throttle(...arguments);\n }\n});","enifed('@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 let done = assert.async();\n\n let calledWith = [];\n let 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\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 let done = assert.async();\n\n let calledWith = [];\n let 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\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 let done = assert.async();\n\n let calledWith = [];\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\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 let done = assert.async();\n\n let calledWith = [];\n function someFunc(...args) {\n calledWith.push(args);\n }\n\n (0, _runloop.debounce)(someFunc, { isFoo: true }, 10);\n (0, _runloop.debounce)(someFunc, { isBar: true }, 10);\n (0, _runloop.debounce)(someFunc, { isBaz: true }, 10);\n\n setTimeout(() => {\n assert.deepEqual(calledWith, [[{ isBaz: true }]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n });\n});","enifed('@ember/runloop/tests/later_test', ['internal-test-helpers', '@ember/polyfills', '@ember/runloop'], function (_internalTestHelpers, _polyfills, _runloop) {\n 'use strict';\n\n const originalSetTimeout = window.setTimeout;\n const originalDateValueOf = Date.prototype.valueOf;\n const 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\n return;\n }\n\n callback();\n }, 10);\n }\n\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 function pauseUntil(time) {\n while (+new Date() < time) {\n /* do nothing - sleeping */\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('run.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 let done = assert.async();\n let invoked = false;\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => invoked = true, 100);\n });\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 let done = assert.async();\n let obj = { invoked: false };\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function () {\n this.invoked = true;\n }, 100);\n });\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 let done = assert.async();\n let obj = { invoked: 0 };\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n }, 10, 100);\n });\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 let done = assert.async();\n let obj = { invoked: 0 };\n let firstRunLoop, secondRunLoop;\n\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop.getCurrentRunLoop)();\n\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n secondRunLoop = (0, _runloop.getCurrentRunLoop)();\n }, 10, 1);\n\n pauseUntil(+new Date() + 100);\n });\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\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 }\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\n // asyncTest('callback order', function() {\n // let array = [];\n // function fn(val) { array.push(val); }\n\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\n // deepEqual(array, []);\n\n // wait(function() {\n // QUnit.start();\n // deepEqual(array, [1,2,3,4,5], 'callbacks were called in expected order');\n // });\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\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\n // run(function() {\n\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\n // later(this, fn, 10);\n // later(this, fn, 200);\n // later(this, fn, 200);\n\n // Date.prototype.valueOf = originalDateValueOf;\n // });\n\n // deepEqual(array, []);\n\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 ['@test inception calls to later should run callbacks in separate run loops'](assert) {\n let done = assert.async();\n let runLoop, finished;\n\n (0, _runloop.run)(() => {\n runLoop = (0, _runloop.getCurrentRunLoop)();\n assert.ok(runLoop);\n\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\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\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 let done = assert.async();\n // 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 let newSetTimeoutUsed;\n _runloop.backburner._platform = (0, _polyfills.assign)({}, originalPlatform, {\n setTimeout() {\n let wait = arguments[arguments.length - 1];\n newSetTimeoutUsed = true;\n assert.ok(!isNaN(wait) && wait >= 0, 'wait is a non-negative number');\n\n return originalPlatform.setTimeout.apply(originalPlatform, arguments);\n }\n });\n\n let count = 0;\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => {\n count++;\n\n // 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 pauseUntil(+new Date() + 60);\n }, 1);\n\n (0, _runloop.later)(() => {\n assert.equal(count, 1, 'callbacks called in order');\n }, 50);\n });\n\n wait(() => {\n assert.ok(newSetTimeoutUsed, 'stub setTimeout was used');\n done();\n });\n }\n });\n});","enifed('@ember/runloop/tests/next_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('run.next', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should invoke immediately on next timeout'](assert) {\n let done = assert.async();\n let invoked = false;\n\n (0, _runloop.run)(() => (0, _runloop.next)(() => invoked = true));\n\n assert.equal(invoked, false, 'should not have invoked yet');\n\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 let done = assert.async();\n let firstRunLoop, secondRunLoop;\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop.getCurrentRunLoop)();\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop.getCurrentRunLoop)());\n });\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 let done = assert.async();\n let secondRunLoop, thirdRunLoop;\n (0, _runloop.run)(() => {\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop.getCurrentRunLoop)());\n (0, _runloop.next)(() => thirdRunLoop = (0, _runloop.getCurrentRunLoop)());\n });\n\n setTimeout(() => {\n assert.ok(secondRunLoop && secondRunLoop === thirdRunLoop, 'callbacks coalesced into same run loop');\n done();\n }, 20);\n }\n });\n});","enifed('@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 let count = 0;\n (0, _runloop.run)(() => {\n function F() {\n count++;\n }\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n });\n\n assert.equal(count, 1, 'should have invoked once');\n }\n\n ['@test should differentiate based on target'](assert) {\n let A = { count: 0 };\n let B = { count: 0 };\n (0, _runloop.run)(() => {\n function F() {\n this.count++;\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\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 let A = { count: 0 };\n let B = { count: 0 };\n\n (0, _runloop.run)(() => {\n function F(amt) {\n this.count += amt;\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\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(!!(0, _runloop.getCurrentRunLoop)(), 'should have a runloop'));\n });\n }\n });\n});","enifed('@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 let thrown = new Error('Boom!');\n let original = (0, _errorHandling.getOnerror)();\n\n let caught;\n (0, _errorHandling.setOnerror)(undefined);\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 let thrown = new Error('Boom!');\n let original = (0, _errorHandling.getOnerror)();\n let originalDispatchOverride = (0, _errorHandling.getDispatchOverride)();\n let originalIsTesting = (0, _debug.isTesting)();\n\n let 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});","enifed('@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\n let obj = {\n value: 0,\n increment(increment) {\n assert.ok((0, _runloop.getCurrentRunLoop)(), 'expected a run-loop');\n return this.value += increment;\n }\n };\n\n let 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 let assertBindThrows = (msg, ...args) => {\n expectAssertion(function () {\n (0, _runloop.bind)(...args);\n }, /could not find a suitable method to bind/, msg);\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});","enifed('@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 let obj = {\n foo() {\n return [this.bar, 'FOO'];\n },\n bar: 'BAR',\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});","enifed('@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 let cnt = 0;\n\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\n assert.equal(cnt, 2, 'should flush actions now');\n }\n\n ['@test a scheduled item can be canceled'](assert) {\n let hasRan = false;\n\n (0, _runloop.run)(() => {\n let cancelId = (0, _runloop.schedule)('actions', () => hasRan = true);\n (0, _runloop.cancel)(cancelId);\n });\n\n assert.notOk(hasRan, 'should not have ran callback run');\n }\n\n ['@test nested runs should queue each phase independently'](assert) {\n let cnt = 0;\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n assert.equal(cnt, 0, 'should not run action yet');\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n });\n assert.equal(cnt, 1, 'should not run action yet');\n });\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 let order = [];\n\n (0, _runloop.run)(() => {\n let runLoop = (0, _runloop.getCurrentRunLoop)();\n assert.ok(runLoop, 'run loop present');\n\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', () => {\n order.push('sync');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\n\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)('actions', () => {\n order.push('actions');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', () => {\n order.push('sync');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\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\n assert.deepEqual(order, ['sync', 'actions', 'sync', 'actions', 'destroy']);\n }\n });\n});","enifed('@ember/runloop/tests/sync_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/sync_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sync() will immediately flush the sync queue only'](assert) {\n let cnt = 0;\n\n (0, _runloop.run)(() => {\n function cntup() {\n cnt++;\n }\n\n function syncfunc() {\n if (++cnt < 5) {\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', syncfunc);\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\n }\n (0, _runloop.schedule)('actions', cntup);\n }\n\n syncfunc();\n\n assert.equal(cnt, 1, 'should not run action yet');\n });\n\n assert.equal(cnt, 10, 'should flush actions now too');\n }\n });\n});","enifed('@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 let initialRunLoop = (0, _runloop.getCurrentRunLoop)();\n\n assert.throws(() => {\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', function () {\n throw new _error.default('boom!');\n });\n });\n }, Error, 'boom!');\n\n // 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 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\n assert.throws(() => {\n (0, _runloop.run)(function () {\n throw new _error.default('boom!');\n });\n }, _error.default, 'boom!');\n\n assert.equal((0, _runloop.getCurrentRunLoop)(), initialRunLoop, 'Previous run loop should be cleaned up despite exception');\n }\n });\n});","enifed('@ember/service/index', ['exports', '@ember/-internals/runtime', '@ember/-internals/metal'], function (exports, _runtime, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n exports.inject = inject;\n\n\n /**\n @module @ember/service\n @public\n */\n\n /**\n Creates a property that lazily looks up a service in the container. There\n are no restrictions as to what objects a service can be injected into.\n \n Example:\n \n ```app/routes/application.js\n import Route from '@ember/routing/route';\n import { inject as service } from '@ember/service';\n \n export default Route.extend({\n authManager: service('auth'),\n \n model() {\n return this.get('authManager').findCurrentUser();\n }\n });\n ```\n \n This example will create an `authManager` property on the application route\n that looks up the `auth` service in the container, making it easily\n accessible in the `model` hook.\n \n @method inject\n @static\n @since 1.10.0\n @for @ember/service\n @param {String} name (optional) name of the service to inject, defaults to\n the property's name\n @return {Ember.InjectedProperty} injection descriptor instance\n @public\n */\n function inject(name, options) {\n return new _metal.InjectedProperty('service', name, options);\n }\n\n /**\n @class Service\n @extends EmberObject\n @since 1.10.0\n @public\n */\n const Service = _runtime.Object.extend();\n\n Service.reopenClass({\n isServiceFactory: true\n });\n\n exports.default = Service;\n});","enifed('@ember/string/index', ['exports', '@ember/string/lib/string_registry', '@ember/-internals/environment', '@ember/-internals/utils'], function (exports, _string_registry, _environment, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n exports._setStrings = exports._getStrings = undefined;\n Object.defineProperty(exports, '_getStrings', {\n enumerable: true,\n get: function () {\n return _string_registry.getStrings;\n }\n });\n Object.defineProperty(exports, '_setStrings', {\n enumerable: true,\n get: function () {\n return _string_registry.setStrings;\n }\n });\n exports.loc = loc;\n exports.w = w;\n exports.decamelize = decamelize;\n exports.dasherize = dasherize;\n exports.camelize = camelize;\n exports.classify = classify;\n exports.underscore = underscore;\n exports.capitalize = capitalize;\n\n const STRING_DASHERIZE_REGEXP = /[ _]/g;\n const STRING_DASHERIZE_CACHE = new _utils.Cache(1000, key => decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-'));\n const STRING_CAMELIZE_REGEXP_1 = /(\\-|\\_|\\.|\\s)+(.)?/g;\n const STRING_CAMELIZE_REGEXP_2 = /(^|\\/)([A-Z])/g;\n const CAMELIZE_CACHE = new _utils.Cache(1000, key => key.replace(STRING_CAMELIZE_REGEXP_1, (_match, _separator, chr) => chr ? chr.toUpperCase() : '').replace(STRING_CAMELIZE_REGEXP_2, (match /*, separator, chr */) => match.toLowerCase()));\n const STRING_CLASSIFY_REGEXP_1 = /^(\\-|_)+(.)?/;\n const STRING_CLASSIFY_REGEXP_2 = /(.)(\\-|\\_|\\.|\\s)+(.)?/g;\n const STRING_CLASSIFY_REGEXP_3 = /(^|\\/|\\.)([a-z])/g;\n const CLASSIFY_CACHE = new _utils.Cache(1000, str => {\n let replace1 = (_match, _separator, chr) => chr ? `_${chr.toUpperCase()}` : '';\n let replace2 = (_match, initialChar, _separator, chr) => initialChar + (chr ? chr.toUpperCase() : '');\n let parts = str.split('/');\n for (let i = 0; i < parts.length; i++) {\n parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);\n }\n return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, (match /*, separator, chr */) => match.toUpperCase());\n });\n const STRING_UNDERSCORE_REGEXP_1 = /([a-z\\d])([A-Z]+)/g;\n const STRING_UNDERSCORE_REGEXP_2 = /\\-|\\s+/g;\n const UNDERSCORE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase());\n const STRING_CAPITALIZE_REGEXP = /(^|\\/)([a-z\\u00C0-\\u024F])/g;\n const CAPITALIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_CAPITALIZE_REGEXP, (match /*, separator, chr */) => match.toUpperCase()));\n const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\n const DECAMELIZE_CACHE = new _utils.Cache(1000, str => str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase());\n /**\n Defines string helper methods including string formatting and localization.\n Unless `EmberENV.EXTEND_PROTOTYPES.String` is `false` these methods will also be\n added to the `String.prototype` as well.\n \n @class String\n @public\n */\n function _fmt(str, formats) {\n // first, replace any ORDERED replacements.\n let idx = 0; // the current index for non-numerical replacements\n return str.replace(/%@([0-9]+)?/g, (_s, argIndex) => {\n let i = argIndex ? parseInt(argIndex, 10) - 1 : idx++;\n let r = i < formats.length ? formats[i] : undefined;\n return typeof r === 'string' ? r : r === null ? '(null)' : r === undefined ? '' : '' + r;\n });\n }\n /**\n Formats the passed string, but first looks up the string in the localized\n strings hash. This is a convenient way to localize text.\n \n Note that it is traditional but not required to prefix localized string\n keys with an underscore or other character so you can easily identify\n localized strings.\n \n ```javascript\n import { loc } from '@ember/string';\n \n Ember.STRINGS = {\n '_Hello World': 'Bonjour le monde',\n '_Hello %@ %@': 'Bonjour %@ %@'\n };\n \n loc(\"_Hello World\"); // 'Bonjour le monde';\n loc(\"_Hello %@ %@\", [\"John\", \"Smith\"]); // \"Bonjour John Smith\";\n ```\n \n @method loc\n @param {String} str The string to format\n @param {Array} formats Optional array of parameters to interpolate into string.\n @return {String} formatted string\n @public\n */\n function loc(str, formats) {\n if (!Array.isArray(formats) || arguments.length > 2) {\n formats = Array.prototype.slice.call(arguments, 1);\n }\n str = (0, _string_registry.getString)(str) || str;\n return _fmt(str, formats);\n }\n /**\n Splits a string into separate units separated by spaces, eliminating any\n empty strings in the process. This is a convenience method for split that\n is mostly useful when applied to the `String.prototype`.\n \n ```javascript\n import { w } from '@ember/string';\n \n w(\"alpha beta gamma\").forEach(function(key) {\n console.log(key);\n });\n \n // > alpha\n // > beta\n // > gamma\n ```\n \n @method w\n @param {String} str The string to split\n @return {Array} array containing the split strings\n @public\n */\n function w(str) {\n return str.split(/\\s+/);\n }\n /**\n Converts a camelized string into all lower case separated by underscores.\n \n ```javascript\n 'innerHTML'.decamelize(); // 'inner_html'\n 'action_name'.decamelize(); // 'action_name'\n 'css-class-name'.decamelize(); // 'css-class-name'\n 'my favorite items'.decamelize(); // 'my favorite items'\n ```\n \n @method decamelize\n @param {String} str The string to decamelize.\n @return {String} the decamelized string.\n @public\n */\n function decamelize(str) {\n return DECAMELIZE_CACHE.get(str);\n }\n /**\n Replaces underscores, spaces, or camelCase with dashes.\n \n ```javascript\n 'innerHTML'.dasherize(); // 'inner-html'\n 'action_name'.dasherize(); // 'action-name'\n 'css-class-name'.dasherize(); // 'css-class-name'\n 'my favorite items'.dasherize(); // 'my-favorite-items'\n 'privateDocs/ownerInvoice'.dasherize(); // 'private-docs/owner-invoice'\n ```\n \n @method dasherize\n @param {String} str The string to dasherize.\n @return {String} the dasherized string.\n @public\n */\n function dasherize(str) {\n return STRING_DASHERIZE_CACHE.get(str);\n }\n /**\n Returns the lowerCamelCase form of a string.\n \n ```javascript\n 'innerHTML'.camelize(); // 'innerHTML'\n 'action_name'.camelize(); // 'actionName'\n 'css-class-name'.camelize(); // 'cssClassName'\n 'my favorite items'.camelize(); // 'myFavoriteItems'\n 'My Favorite Items'.camelize(); // 'myFavoriteItems'\n 'private-docs/owner-invoice'.camelize(); // 'privateDocs/ownerInvoice'\n ```\n \n @method camelize\n @param {String} str The string to camelize.\n @return {String} the camelized string.\n @public\n */\n function camelize(str) {\n return CAMELIZE_CACHE.get(str);\n }\n /**\n Returns the UpperCamelCase form of a string.\n \n ```javascript\n 'innerHTML'.classify(); // 'InnerHTML'\n 'action_name'.classify(); // 'ActionName'\n 'css-class-name'.classify(); // 'CssClassName'\n 'my favorite items'.classify(); // 'MyFavoriteItems'\n 'private-docs/owner-invoice'.classify(); // 'PrivateDocs/OwnerInvoice'\n ```\n \n @method classify\n @param {String} str the string to classify\n @return {String} the classified string\n @public\n */\n function classify(str) {\n return CLASSIFY_CACHE.get(str);\n }\n /**\n More general than decamelize. Returns the lower\\_case\\_and\\_underscored\n form of a string.\n \n ```javascript\n 'innerHTML'.underscore(); // 'inner_html'\n 'action_name'.underscore(); // 'action_name'\n 'css-class-name'.underscore(); // 'css_class_name'\n 'my favorite items'.underscore(); // 'my_favorite_items'\n 'privateDocs/ownerInvoice'.underscore(); // 'private_docs/owner_invoice'\n ```\n \n @method underscore\n @param {String} str The string to underscore.\n @return {String} the underscored string.\n @public\n */\n function underscore(str) {\n return UNDERSCORE_CACHE.get(str);\n }\n /**\n Returns the Capitalized form of a string\n \n ```javascript\n 'innerHTML'.capitalize() // 'InnerHTML'\n 'action_name'.capitalize() // 'Action_name'\n 'css-class-name'.capitalize() // 'Css-class-name'\n 'my favorite items'.capitalize() // 'My favorite items'\n 'privateDocs/ownerInvoice'.capitalize(); // 'PrivateDocs/ownerInvoice'\n ```\n \n @method capitalize\n @param {String} str The string to capitalize.\n @return {String} The capitalized string.\n @public\n */\n function capitalize(str) {\n return CAPITALIZE_CACHE.get(str);\n }\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n Object.defineProperties(String.prototype, {\n /**\n See [String.w](/api/ember/release/classes/String/methods/w?anchor=w).\n @method w\n @for @ember/string\n @static\n @private\n */\n w: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return w(this);\n }\n },\n /**\n See [String.loc](/api/ember/release/classes/String/methods/loc?anchor=loc).\n @method loc\n @for @ember/string\n @static\n @private\n */\n loc: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function (...args) {\n return loc(this, args);\n }\n },\n /**\n See [String.camelize](/api/ember/release/classes/String/methods/camelize?anchor=camelize).\n @method camelize\n @for @ember/string\n @static\n @private\n */\n camelize: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return camelize(this);\n }\n },\n /**\n See [String.decamelize](/api/ember/release/classes/String/methods/decamelize?anchor=decamelize).\n @method decamelize\n @for @ember/string\n @static\n @private\n */\n decamelize: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return decamelize(this);\n }\n },\n /**\n See [String.dasherize](/api/ember/release/classes/String/methods/dasherize?anchor=dasherize).\n @method dasherize\n @for @ember/string\n @static\n @private\n */\n dasherize: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return dasherize(this);\n }\n },\n /**\n See [String.underscore](/api/ember/release/classes/String/methods/underscore?anchor=underscore).\n @method underscore\n @for @ember/string\n @static\n @private\n */\n underscore: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return underscore(this);\n }\n },\n /**\n See [String.classify](/api/ember/release/classes/String/methods/classify?anchor=classify).\n @method classify\n @for @ember/string\n @static\n @private\n */\n classify: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return classify(this);\n }\n },\n /**\n See [String.capitalize](/api/ember/release/classes/String/methods/capitalize?anchor=capitalize).\n @method capitalize\n @for @ember/string\n @static\n @private\n */\n capitalize: {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return capitalize(this);\n }\n }\n });\n }\n});","enifed(\"@ember/string/lib/string_registry\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.setStrings = setStrings;\n exports.getStrings = getStrings;\n exports.getString = getString;\n // STATE within a module is frowned upon, this exists\n // to support Ember.STRINGS but shield ember internals from this legacy global\n // API.\n let STRINGS = {};\n function setStrings(strings) {\n STRINGS = strings;\n }\n function getStrings() {\n return STRINGS;\n }\n function getString(name) {\n return STRINGS[name];\n }\n});","enifed('@ember/string/tests/camelize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.camelize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.camelize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.camelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.camelize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.camelize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/capitalize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.capitalize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.capitalize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.capitalize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.capitalize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.capitalize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/classify_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.classify)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.classify(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.classify', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.classify is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.classify, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/dasherize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.dasherize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.dasherize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.dasherize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.dasherize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.dasherize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/decamelize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.decamelize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.decamelize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.decamelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.decamelize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.decamelize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/loc_test', ['@ember/-internals/environment', '@ember/string', '@ember/string/lib/string_registry', 'internal-test-helpers'], function (_environment, _string, _string_registry, _internalTestHelpers) {\n 'use strict';\n\n let oldString;\n\n function test(assert, given, args, expected, description) {\n assert.equal((0, _string.loc)(given, args), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.loc(...args), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.loc', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n oldString = (0, _string_registry.getStrings)();\n (0, _string_registry.setStrings)({\n '_Hello World': 'Bonjour le monde',\n '_Hello %@': 'Bonjour %@',\n '_Hello %@ %@': 'Bonjour %@ %@',\n '_Hello %@# %@#': 'Bonjour %@2 %@1'\n });\n }\n\n afterEach() {\n (0, _string_registry.setStrings)(oldString);\n }\n\n ['@test String.prototype.loc is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.loc, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String loc tests'](assert) {\n test(assert, '_Hello World', [], 'Bonjour le monde', `loc('_Hello World') => 'Bonjour le monde'`);\n test(assert, '_Hello %@ %@', ['John', 'Doe'], 'Bonjour John Doe', `loc('_Hello %@ %@', ['John', 'Doe']) => 'Bonjour John Doe'`);\n test(assert, '_Hello %@# %@#', ['John', 'Doe'], 'Bonjour Doe John', `loc('_Hello %@# %@#', ['John', 'Doe']) => 'Bonjour Doe John'`);\n test(assert, '_Not In Strings', [], '_Not In Strings', `loc('_Not In Strings') => '_Not In Strings'`);\n }\n\n ['@test works with argument form'](assert) {\n assert.equal((0, _string.loc)('_Hello %@', 'John'), 'Bonjour John');\n assert.equal((0, _string.loc)('_Hello %@ %@', ['John'], 'Doe'), 'Bonjour John Doe');\n }\n });\n});","enifed('@ember/string/tests/underscore_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.underscore)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.underscore(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.underscore', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.underscore is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.underscore, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@ember/string/tests/w_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.w)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.w(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.w', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.w is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.w, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\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});","enifed('@glimmer/compiler', ['exports', 'node-module', '@glimmer/util', '@glimmer/wire-format', '@glimmer/syntax'], function (exports, _nodeModule, _util, _wireFormat, _syntax) {\n 'use strict';\n\n exports.__esModule = true;\n exports.TemplateVisitor = exports.TemplateCompiler = exports.precompile = exports.defaultId = undefined;\n\n\n class SymbolTable {\n static top() {\n return new ProgramSymbolTable();\n }\n child(locals) {\n let symbols = locals.map(name => this.allocate(name));\n return new BlockSymbolTable(this, locals, symbols);\n }\n }\n class ProgramSymbolTable extends SymbolTable {\n constructor() {\n super(...arguments);\n this.symbols = [];\n this.size = 1;\n this.named = (0, _util.dict)();\n this.blocks = (0, _util.dict)();\n }\n has(_name) {\n return false;\n }\n get(_name) {\n throw (0, _util.unreachable)();\n }\n getLocalsMap() {\n return {};\n }\n getEvalInfo() {\n return [];\n }\n allocateNamed(name) {\n let named = this.named[name];\n if (!named) {\n named = this.named[name] = this.allocate(name);\n }\n return named;\n }\n allocateBlock(name) {\n let block = this.blocks[name];\n if (!block) {\n block = this.blocks[name] = this.allocate(`&${name}`);\n }\n return block;\n }\n allocate(identifier) {\n this.symbols.push(identifier);\n return this.size++;\n }\n }\n class BlockSymbolTable extends SymbolTable {\n constructor(parent, symbols, slots) {\n super();\n this.parent = parent;\n this.symbols = symbols;\n this.slots = slots;\n }\n has(name) {\n return this.symbols.indexOf(name) !== -1 || this.parent.has(name);\n }\n get(name) {\n let slot = this.symbols.indexOf(name);\n return slot === -1 ? this.parent.get(name) : this.slots[slot];\n }\n getLocalsMap() {\n let dict$$1 = this.parent.getLocalsMap();\n this.symbols.forEach(symbol => dict$$1[symbol] = this.get(symbol));\n return dict$$1;\n }\n getEvalInfo() {\n let locals = this.getLocalsMap();\n return Object.keys(locals).map(symbol => locals[symbol]);\n }\n allocateNamed(name) {\n return this.parent.allocateNamed(name);\n }\n allocateBlock(name) {\n return this.parent.allocateBlock(name);\n }\n allocate(identifier) {\n return this.parent.allocate(identifier);\n }\n }\n /**\n * Takes in an AST and outputs a list of actions to be consumed\n * by a compiler. For example, the template\n *\n * foo{{bar}}
    baz
    \n *\n * produces the actions\n *\n * [['startProgram', [programNode, 0]],\n * ['text', [textNode, 0, 3]],\n * ['mustache', [mustacheNode, 1, 3]],\n * ['openElement', [elementNode, 2, 3, 0]],\n * ['text', [textNode, 0, 1]],\n * ['closeElement', [elementNode, 2, 3],\n * ['endProgram', [programNode]]]\n *\n * This visitor walks the AST depth first and backwards. As\n * a result the bottom-most child template will appear at the\n * top of the actions list whereas the root template will appear\n * at the bottom of the list. For example,\n *\n *
    {{#if}}foo{{else}}bar{{/if}}
    \n *\n * produces the actions\n *\n * [['startProgram', [programNode, 0]],\n * ['text', [textNode, 0, 2, 0]],\n * ['openElement', [elementNode, 1, 2, 0]],\n * ['closeElement', [elementNode, 1, 2]],\n * ['endProgram', [programNode]],\n * ['startProgram', [programNode, 0]],\n * ['text', [textNode, 0, 1]],\n * ['endProgram', [programNode]],\n * ['startProgram', [programNode, 2]],\n * ['openElement', [elementNode, 0, 1, 1]],\n * ['block', [blockNode, 0, 1]],\n * ['closeElement', [elementNode, 0, 1]],\n * ['endProgram', [programNode]]]\n *\n * The state of the traversal is maintained by a stack of frames.\n * Whenever a node with children is entered (either a ProgramNode\n * or an ElementNode) a frame is pushed onto the stack. The frame\n * contains information about the state of the traversal of that\n * node. For example,\n *\n * - index of the current child node being visited\n * - the number of mustaches contained within its child nodes\n * - the list of actions generated by its child nodes\n */\n class Frame {\n constructor() {\n this.parentNode = null;\n this.children = null;\n this.childIndex = null;\n this.childCount = null;\n this.childTemplateCount = 0;\n this.mustacheCount = 0;\n this.actions = [];\n this.blankChildTextNodes = null;\n this.symbols = null;\n }\n }\n class TemplateVisitor {\n constructor() {\n this.frameStack = [];\n this.actions = [];\n this.programDepth = -1;\n }\n visit(node) {\n this[node.type](node);\n }\n // Traversal methods\n Program(program) {\n this.programDepth++;\n let parentFrame = this.getCurrentFrame();\n let programFrame = this.pushFrame();\n if (!parentFrame) {\n program['symbols'] = SymbolTable.top();\n } else {\n program['symbols'] = parentFrame.symbols.child(program.blockParams);\n }\n let startType, endType;\n if (this.programDepth === 0) {\n startType = 'startProgram';\n endType = 'endProgram';\n } else {\n startType = 'startBlock';\n endType = 'endBlock';\n }\n programFrame.parentNode = program;\n programFrame.children = program.body;\n programFrame.childCount = program.body.length;\n programFrame.blankChildTextNodes = [];\n programFrame.actions.push([endType, [program, this.programDepth]]);\n programFrame.symbols = program['symbols'];\n for (let i = program.body.length - 1; i >= 0; i--) {\n programFrame.childIndex = i;\n this.visit(program.body[i]);\n }\n programFrame.actions.push([startType, [program, programFrame.childTemplateCount, programFrame.blankChildTextNodes.reverse()]]);\n this.popFrame();\n this.programDepth--;\n // Push the completed template into the global actions list\n if (parentFrame) {\n parentFrame.childTemplateCount++;\n }\n this.actions.push(...programFrame.actions.reverse());\n }\n ElementNode(element) {\n let parentFrame = this.currentFrame;\n let elementFrame = this.pushFrame();\n elementFrame.parentNode = element;\n elementFrame.children = element.children;\n elementFrame.childCount = element.children.length;\n elementFrame.mustacheCount += element.modifiers.length;\n elementFrame.blankChildTextNodes = [];\n elementFrame.symbols = element['symbols'] = parentFrame.symbols.child(element.blockParams);\n let actionArgs = [element, parentFrame.childIndex, parentFrame.childCount];\n elementFrame.actions.push(['closeElement', actionArgs]);\n for (let i = element.attributes.length - 1; i >= 0; i--) {\n this.visit(element.attributes[i]);\n }\n for (let i = element.children.length - 1; i >= 0; i--) {\n elementFrame.childIndex = i;\n this.visit(element.children[i]);\n }\n let open = ['openElement', [...actionArgs, elementFrame.mustacheCount, elementFrame.blankChildTextNodes.reverse()]];\n elementFrame.actions.push(open);\n this.popFrame();\n // Propagate the element's frame state to the parent frame\n if (elementFrame.mustacheCount > 0) {\n parentFrame.mustacheCount++;\n }\n parentFrame.childTemplateCount += elementFrame.childTemplateCount;\n parentFrame.actions.push(...elementFrame.actions);\n }\n AttrNode(attr) {\n if (attr.value.type !== 'TextNode') {\n this.currentFrame.mustacheCount++;\n }\n }\n TextNode(text) {\n let frame = this.currentFrame;\n if (text.chars === '') {\n frame.blankChildTextNodes.push(domIndexOf(frame.children, text));\n }\n frame.actions.push(['text', [text, frame.childIndex, frame.childCount]]);\n }\n BlockStatement(node) {\n let frame = this.currentFrame;\n frame.mustacheCount++;\n frame.actions.push(['block', [node, frame.childIndex, frame.childCount]]);\n if (node.inverse) {\n this.visit(node.inverse);\n }\n if (node.program) {\n this.visit(node.program);\n }\n }\n PartialStatement(node) {\n let frame = this.currentFrame;\n frame.mustacheCount++;\n frame.actions.push(['mustache', [node, frame.childIndex, frame.childCount]]);\n }\n CommentStatement(text) {\n let frame = this.currentFrame;\n frame.actions.push(['comment', [text, frame.childIndex, frame.childCount]]);\n }\n MustacheCommentStatement() {\n // Intentional empty: Handlebars comments should not affect output.\n }\n MustacheStatement(mustache) {\n let frame = this.currentFrame;\n frame.mustacheCount++;\n frame.actions.push(['mustache', [mustache, frame.childIndex, frame.childCount]]);\n }\n // Frame helpers\n get currentFrame() {\n return this.getCurrentFrame();\n }\n getCurrentFrame() {\n return this.frameStack[this.frameStack.length - 1];\n }\n pushFrame() {\n let frame = new Frame();\n this.frameStack.push(frame);\n return frame;\n }\n popFrame() {\n return this.frameStack.pop();\n }\n }\n // Returns the index of `domNode` in the `nodes` array, skipping\n // over any nodes which do not represent DOM nodes.\n function domIndexOf(nodes, domNode) {\n let index = -1;\n for (let i = 0; i < nodes.length; i++) {\n let node = nodes[i];\n if (node.type !== 'TextNode' && node.type !== 'ElementNode') {\n continue;\n } else {\n index++;\n }\n if (node === domNode) {\n return index;\n }\n }\n return -1;\n }\n\n class Block {\n constructor() {\n this.statements = [];\n }\n push(statement) {\n this.statements.push(statement);\n }\n }\n class InlineBlock extends Block {\n constructor(table) {\n super();\n this.table = table;\n }\n toJSON() {\n return {\n statements: this.statements,\n parameters: this.table.slots\n };\n }\n }\n class TemplateBlock extends Block {\n constructor(symbolTable) {\n super();\n this.symbolTable = symbolTable;\n this.type = 'template';\n this.yields = new _util.DictSet();\n this.named = new _util.DictSet();\n this.blocks = [];\n this.hasEval = false;\n }\n push(statement) {\n this.statements.push(statement);\n }\n toJSON() {\n return {\n symbols: this.symbolTable.symbols,\n statements: this.statements,\n hasEval: this.hasEval\n };\n }\n }\n class ComponentBlock extends Block {\n constructor(tag, table, selfClosing) {\n super();\n this.tag = tag;\n this.table = table;\n this.selfClosing = selfClosing;\n this.attributes = [];\n this.arguments = [];\n this.inParams = true;\n this.positionals = [];\n }\n push(statement) {\n if (this.inParams) {\n if ((0, _wireFormat.isFlushElement)(statement)) {\n this.inParams = false;\n } else if ((0, _wireFormat.isArgument)(statement)) {\n this.arguments.push(statement);\n } else if ((0, _wireFormat.isAttribute)(statement)) {\n this.attributes.push(statement);\n } else if ((0, _wireFormat.isAttrSplat)(statement)) {\n this.attributes.push(statement);\n } else {\n throw new Error('Compile Error: only parameters allowed before flush-element');\n }\n } else {\n this.statements.push(statement);\n }\n }\n toJSON() {\n let args = this.arguments;\n let keys = args.map(arg => arg[1]);\n let values = args.map(arg => arg[2]);\n let block = this.selfClosing ? null : {\n statements: this.statements,\n parameters: this.table.slots\n };\n return [this.tag, this.attributes, [keys, values], block];\n }\n }\n class Template {\n constructor(symbols) {\n this.block = new TemplateBlock(symbols);\n }\n toJSON() {\n return this.block.toJSON();\n }\n }\n class JavaScriptCompiler {\n constructor(opcodes, symbols, options) {\n this.blocks = new _util.Stack();\n this.values = [];\n this.opcodes = opcodes;\n this.template = new Template(symbols);\n this.options = options;\n }\n static process(opcodes, symbols, options) {\n let compiler = new JavaScriptCompiler(opcodes, symbols, options);\n return compiler.process();\n }\n get currentBlock() {\n return this.blocks.current;\n }\n process() {\n this.opcodes.forEach(op => {\n let opcode = op[0];\n let arg = op[1];\n if (!this[opcode]) {\n throw new Error(`unimplemented ${opcode} on JavaScriptCompiler`);\n }\n this[opcode](arg);\n });\n return this.template;\n }\n /// Nesting\n startBlock(program) {\n let block = new InlineBlock(program['symbols']);\n this.blocks.push(block);\n }\n endBlock() {\n let { template, blocks } = this;\n let block = blocks.pop();\n template.block.blocks.push(block.toJSON());\n }\n startProgram() {\n this.blocks.push(this.template.block);\n }\n endProgram() {}\n /// Statements\n text(content) {\n this.push([_wireFormat.Ops.Text, content]);\n }\n append(trusted) {\n this.push([_wireFormat.Ops.Append, this.popValue(), trusted]);\n }\n comment(value) {\n this.push([_wireFormat.Ops.Comment, value]);\n }\n modifier(name) {\n let params = this.popValue();\n let hash = this.popValue();\n this.push([_wireFormat.Ops.Modifier, name, params, hash]);\n }\n block([name, template, inverse]) {\n let params = this.popValue();\n let hash = this.popValue();\n let blocks = this.template.block.blocks;\n\n this.push([_wireFormat.Ops.Block, name, params, hash, blocks[template], blocks[inverse]]);\n }\n openComponent(element) {\n let tag = this.options && this.options.customizeComponentName ? this.options.customizeComponentName(element.tag) : element.tag;\n let component = new ComponentBlock(tag, element['symbols'], element.selfClosing);\n this.blocks.push(component);\n }\n openSplattedElement(element) {\n let tag = element.tag;\n if (element.blockParams.length > 0) {\n throw new Error(`Compile Error: <${element.tag}> is not a component and doesn't support block parameters`);\n } else {\n this.push([_wireFormat.Ops.OpenSplattedElement, tag]);\n }\n }\n openElement(element) {\n let tag = element.tag;\n if (element.blockParams.length > 0) {\n throw new Error(`Compile Error: <${element.tag}> is not a component and doesn't support block parameters`);\n } else {\n this.push([_wireFormat.Ops.OpenElement, tag]);\n }\n }\n flushElement() {\n this.push([_wireFormat.Ops.FlushElement]);\n }\n closeComponent(_element) {\n if (_element.modifiers.length > 0) {\n throw new Error('Compile Error: Element modifiers are not allowed in components');\n }\n let [tag, attrs, args, block] = this.endComponent();\n this.push([_wireFormat.Ops.Component, tag, attrs, args, block]);\n }\n closeDynamicComponent(_element) {\n let [, attrs, args, block] = this.endComponent();\n this.push([_wireFormat.Ops.DynamicComponent, this.popValue(), attrs, args, block]);\n }\n closeElement(_element) {\n this.push([_wireFormat.Ops.CloseElement]);\n }\n staticAttr([name, namespace]) {\n let value = this.popValue();\n this.push([_wireFormat.Ops.StaticAttr, name, value, namespace]);\n }\n dynamicAttr([name, namespace]) {\n let value = this.popValue();\n this.push([_wireFormat.Ops.DynamicAttr, name, value, namespace]);\n }\n trustingAttr([name, namespace]) {\n let value = this.popValue();\n this.push([_wireFormat.Ops.TrustingAttr, name, value, namespace]);\n }\n staticArg(name) {\n let value = this.popValue();\n this.push([_wireFormat.Ops.StaticArg, name, value]);\n }\n dynamicArg(name) {\n let value = this.popValue();\n this.push([_wireFormat.Ops.DynamicArg, name, value]);\n }\n yield(to) {\n let params = this.popValue();\n this.push([_wireFormat.Ops.Yield, to, params]);\n }\n attrSplat(to) {\n this.push([_wireFormat.Ops.AttrSplat, to]);\n }\n debugger(evalInfo) {\n this.push([_wireFormat.Ops.Debugger, evalInfo]);\n this.template.block.hasEval = true;\n }\n hasBlock(name) {\n this.pushValue([_wireFormat.Ops.HasBlock, name]);\n }\n hasBlockParams(name) {\n this.pushValue([_wireFormat.Ops.HasBlockParams, name]);\n }\n partial(evalInfo) {\n let params = this.popValue();\n this.push([_wireFormat.Ops.Partial, params[0], evalInfo]);\n this.template.block.hasEval = true;\n }\n /// Expressions\n literal(value) {\n if (value === undefined) {\n this.pushValue([_wireFormat.Ops.Undefined]);\n } else {\n this.pushValue(value);\n }\n }\n unknown(name) {\n this.pushValue([_wireFormat.Ops.Unknown, name]);\n }\n get([head, path]) {\n this.pushValue([_wireFormat.Ops.Get, head, path]);\n }\n maybeLocal(path) {\n this.pushValue([_wireFormat.Ops.MaybeLocal, path]);\n }\n concat() {\n this.pushValue([_wireFormat.Ops.Concat, this.popValue()]);\n }\n helper(name) {\n let params = this.popValue();\n let hash = this.popValue();\n this.pushValue([_wireFormat.Ops.Helper, name, params, hash]);\n }\n /// Stack Management Opcodes\n prepareArray(size) {\n let values = [];\n for (let i = 0; i < size; i++) {\n values.push(this.popValue());\n }\n this.pushValue(values);\n }\n prepareObject(size) {\n\n let keys = new Array(size);\n let values = new Array(size);\n for (let i = 0; i < size; i++) {\n keys[i] = this.popValue();\n values[i] = this.popValue();\n }\n this.pushValue([keys, values]);\n }\n /// Utilities\n endComponent() {\n let component = this.blocks.pop();\n\n return component.toJSON();\n }\n push(args) {\n while (args[args.length - 1] === null) {\n args.pop();\n }\n this.currentBlock.push(args);\n }\n pushValue(val) {\n this.values.push(val);\n }\n popValue() {\n\n return this.values.pop();\n }\n }\n\n // There is a small whitelist of namespaced attributes specially\n // enumerated in\n // https://www.w3.org/TR/html/syntax.html#attributes-0\n //\n // > When a foreign element has one of the namespaced attributes given by\n // > the local name and namespace of the first and second cells of a row\n // > from the following table, it must be written using the name given by\n // > the third cell from the same row.\n //\n // In all other cases, colons are interpreted as a regular character\n // with no special meaning:\n //\n // > No other namespaced attribute can be expressed in the HTML syntax.\n const XLINK = 'http://www.w3.org/1999/xlink';\n const XML = 'http://www.w3.org/XML/1998/namespace';\n const XMLNS = 'http://www.w3.org/2000/xmlns/';\n const WHITELIST = {\n 'xlink:actuate': XLINK,\n 'xlink:arcrole': XLINK,\n 'xlink:href': XLINK,\n 'xlink:role': XLINK,\n 'xlink:show': XLINK,\n 'xlink:title': XLINK,\n 'xlink:type': XLINK,\n 'xml:base': XML,\n 'xml:lang': XML,\n 'xml:space': XML,\n xmlns: XMLNS,\n 'xmlns:xlink': XMLNS\n };\n function getAttrNamespace(attrName) {\n return WHITELIST[attrName] || null;\n }\n\n class SymbolAllocator {\n constructor(ops) {\n this.ops = ops;\n this.symbolStack = new _util.Stack();\n }\n process() {\n let out = [];\n let { ops } = this;\n for (let i = 0; i < ops.length; i++) {\n let op = ops[i];\n let result = this.dispatch(op);\n if (result === undefined) {\n out.push(op);\n } else {\n out.push(result);\n }\n }\n return out;\n }\n dispatch(op) {\n let name = op[0];\n let operand = op[1];\n return this[name](operand);\n }\n get symbols() {\n return this.symbolStack.current;\n }\n startProgram(op) {\n this.symbolStack.push(op['symbols']);\n }\n endProgram(_op) {\n this.symbolStack.pop();\n }\n startBlock(op) {\n this.symbolStack.push(op['symbols']);\n }\n endBlock(_op) {\n this.symbolStack.pop();\n }\n flushElement(op) {\n this.symbolStack.push(op['symbols']);\n }\n closeElement(_op) {\n this.symbolStack.pop();\n }\n closeComponent(_op) {\n this.symbolStack.pop();\n }\n closeDynamicComponent(_op) {\n this.symbolStack.pop();\n }\n attrSplat(_op) {\n return ['attrSplat', this.symbols.allocateBlock('attrs')];\n }\n get(op) {\n let [name, rest] = op;\n if (name === 0) {\n return ['get', [0, rest]];\n }\n if (isLocal(name, this.symbols)) {\n let head = this.symbols.get(name);\n return ['get', [head, rest]];\n } else if (name[0] === '@') {\n let head = this.symbols.allocateNamed(name);\n return ['get', [head, rest]];\n } else {\n return ['maybeLocal', [name, ...rest]];\n }\n }\n maybeGet(op) {\n let [name, rest] = op;\n if (name === 0) {\n return ['get', [0, rest]];\n }\n if (isLocal(name, this.symbols)) {\n let head = this.symbols.get(name);\n return ['get', [head, rest]];\n } else if (name[0] === '@') {\n let head = this.symbols.allocateNamed(name);\n return ['get', [head, rest]];\n } else if (rest.length === 0) {\n return ['unknown', name];\n } else {\n return ['maybeLocal', [name, ...rest]];\n }\n }\n yield(op) {\n if (op === 0) {\n throw new Error('Cannot yield to this');\n }\n return ['yield', this.symbols.allocateBlock(op)];\n }\n debugger(_op) {\n return ['debugger', this.symbols.getEvalInfo()];\n }\n hasBlock(op) {\n if (op === 0) {\n throw new Error('Cannot hasBlock this');\n }\n return ['hasBlock', this.symbols.allocateBlock(op)];\n }\n hasBlockParams(op) {\n if (op === 0) {\n throw new Error('Cannot hasBlockParams this');\n }\n return ['hasBlockParams', this.symbols.allocateBlock(op)];\n }\n partial(_op) {\n return ['partial', this.symbols.getEvalInfo()];\n }\n text(_op) {}\n comment(_op) {}\n openComponent(_op) {}\n openElement(_op) {}\n openSplattedElement(_op) {}\n staticArg(_op) {}\n dynamicArg(_op) {}\n staticAttr(_op) {}\n trustingAttr(_op) {}\n dynamicAttr(_op) {}\n modifier(_op) {}\n append(_op) {}\n block(_op) {}\n literal(_op) {}\n helper(_op) {}\n unknown(_op) {}\n maybeLocal(_op) {}\n prepareArray(_op) {}\n prepareObject(_op) {}\n concat(_op) {}\n }\n function isLocal(name, symbols) {\n return symbols && symbols.has(name);\n }\n\n function isTrustedValue(value) {\n return value.escaped !== undefined && !value.escaped;\n }\n class TemplateCompiler {\n constructor() {\n this.templateId = 0;\n this.templateIds = [];\n this.opcodes = [];\n this.includeMeta = false;\n }\n static compile(ast, options) {\n let templateVisitor = new TemplateVisitor();\n templateVisitor.visit(ast);\n let compiler = new TemplateCompiler();\n let opcodes = compiler.process(templateVisitor.actions);\n let symbols = new SymbolAllocator(opcodes).process();\n return JavaScriptCompiler.process(symbols, ast['symbols'], options);\n }\n process(actions) {\n actions.forEach(([name, ...args]) => {\n if (!this[name]) {\n throw new Error(`Unimplemented ${name} on TemplateCompiler`);\n }\n this[name](...args);\n });\n return this.opcodes;\n }\n startProgram([program]) {\n this.opcode(['startProgram', program], program);\n }\n endProgram() {\n this.opcode(['endProgram', null], null);\n }\n startBlock([program]) {\n this.templateId++;\n this.opcode(['startBlock', program], program);\n }\n endBlock() {\n this.templateIds.push(this.templateId - 1);\n this.opcode(['endBlock', null], null);\n }\n text([action]) {\n this.opcode(['text', action.chars], action);\n }\n comment([action]) {\n this.opcode(['comment', action.value], action);\n }\n openElement([action]) {\n let attributes = action.attributes;\n let hasSplat;\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n if (attr.name === '...attributes') {\n hasSplat = attr;\n break;\n }\n }\n if (isDynamicComponent(action)) {\n let head, rest;\n [head, ...rest] = action.tag.split('.');\n if (head === 'this') {\n head = 0;\n }\n this.opcode(['get', [head, rest]]);\n this.opcode(['openComponent', action], action);\n } else if (isComponent(action)) {\n this.opcode(['openComponent', action], action);\n } else if (hasSplat) {\n this.opcode(['openSplattedElement', action], action);\n } else {\n this.opcode(['openElement', action], action);\n }\n let typeAttr = null;\n let attrs = action.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (attrs[i].name === 'type') {\n typeAttr = attrs[i];\n continue;\n }\n this.attribute([attrs[i]]);\n }\n if (typeAttr) {\n this.attribute([typeAttr]);\n }\n this.opcode(['flushElement', action], null);\n }\n closeElement([action]) {\n if (isDynamicComponent(action)) {\n this.opcode(['closeDynamicComponent', action], action);\n } else if (isComponent(action)) {\n this.opcode(['closeComponent', action], action);\n } else if (action.modifiers.length > 0) {\n for (let i = 0; i < action.modifiers.length; i++) {\n this.modifier([action.modifiers[i]]);\n }\n this.opcode(['closeElement', action], action);\n } else {\n this.opcode(['closeElement', action], action);\n }\n }\n attribute([action]) {\n let { name, value } = action;\n let namespace = getAttrNamespace(name);\n let isStatic = this.prepareAttributeValue(value);\n if (name.charAt(0) === '@') {\n // Arguments\n if (isStatic) {\n this.opcode(['staticArg', name], action);\n } else if (action.value.type === 'MustacheStatement') {\n this.opcode(['dynamicArg', name], action);\n } else {\n this.opcode(['dynamicArg', name], action);\n }\n } else {\n let isTrusting = isTrustedValue(value);\n if (isStatic && name === '...attributes') {\n this.opcode(['attrSplat', null], action);\n } else if (isStatic) {\n this.opcode(['staticAttr', [name, namespace]], action);\n } else if (isTrusting) {\n this.opcode(['trustingAttr', [name, namespace]], action);\n } else if (action.value.type === 'MustacheStatement') {\n this.opcode(['dynamicAttr', [name, null]], action);\n } else {\n this.opcode(['dynamicAttr', [name, namespace]], action);\n }\n }\n }\n modifier([action]) {\n assertIsSimplePath(action.path, action.loc, 'modifier');\n let { path: { parts } } = action;\n this.prepareHelper(action);\n this.opcode(['modifier', parts[0]], action);\n }\n mustache([action]) {\n let { path } = action;\n if ((0, _syntax.isLiteral)(path)) {\n this.mustacheExpression(action);\n this.opcode(['append', !action.escaped], action);\n } else if (isYield(path)) {\n let to = assertValidYield(action);\n this.yield(to, action);\n } else if (isPartial(path)) {\n let params = assertValidPartial(action);\n this.partial(params, action);\n } else if (isDebugger(path)) {\n assertValidDebuggerUsage(action);\n this.debugger('debugger', action);\n } else {\n this.mustacheExpression(action);\n this.opcode(['append', !action.escaped], action);\n }\n }\n block([action /*, index, count*/]) {\n this.prepareHelper(action);\n let templateId = this.templateIds.pop();\n let inverseId = action.inverse === null ? null : this.templateIds.pop();\n this.opcode(['block', [action.path.parts[0], templateId, inverseId]], action);\n }\n /// Internal actions, not found in the original processed actions\n arg([path]) {\n let { parts: [head, ...rest] } = path;\n this.opcode(['get', [`@${head}`, rest]], path);\n }\n mustacheExpression(expr) {\n let { path } = expr;\n if ((0, _syntax.isLiteral)(path)) {\n this.opcode(['literal', path.value], expr);\n } else if (isBuiltInHelper(path)) {\n this.builtInHelper(expr);\n } else if (isArg(path)) {\n this.arg([path]);\n } else if (isHelperInvocation(expr)) {\n this.prepareHelper(expr);\n this.opcode(['helper', path.parts[0]], expr);\n } else if (path.this) {\n this.opcode(['get', [0, path.parts]], expr);\n } else {\n let [head, ...parts] = path.parts;\n this.opcode(['maybeGet', [head, parts]], expr);\n }\n // } else if (isLocal(path, this.symbols)) {\n // let [head, ...parts] = path.parts;\n // this.opcode(['get', [head, parts]], expr);\n // } else if (isSimplePath(path)) {\n // this.opcode(['unknown', path.parts[0]], expr);\n // } else {\n // this.opcode(['maybeLocal', path.parts], expr);\n // }\n }\n /// Internal Syntax\n yield(to, action) {\n this.prepareParams(action.params);\n this.opcode(['yield', to], action);\n }\n debugger(_name, action) {\n this.opcode(['debugger', null], action);\n }\n hasBlock(name, action) {\n this.opcode(['hasBlock', name], action);\n }\n hasBlockParams(name, action) {\n this.opcode(['hasBlockParams', name], action);\n }\n partial(_params, action) {\n this.prepareParams(action.params);\n this.opcode(['partial', null], action);\n }\n builtInHelper(expr) {\n let { path } = expr;\n if (isHasBlock(path)) {\n let name = assertValidHasBlockUsage(expr.path.original, expr);\n this.hasBlock(name, expr);\n } else if (isHasBlockParams(path)) {\n let name = assertValidHasBlockUsage(expr.path.original, expr);\n this.hasBlockParams(name, expr);\n }\n }\n /// Expressions, invoked recursively from prepareParams and prepareHash\n SubExpression(expr) {\n if (isBuiltInHelper(expr.path)) {\n this.builtInHelper(expr);\n } else {\n this.prepareHelper(expr);\n this.opcode(['helper', expr.path.parts[0]], expr);\n }\n }\n PathExpression(expr) {\n if (expr.data) {\n this.arg([expr]);\n } else {\n let [head, ...rest] = expr.parts;\n if (expr.this) {\n this.opcode(['get', [0, expr.parts]], expr);\n } else {\n this.opcode(['get', [head, rest]], expr);\n }\n }\n }\n StringLiteral(action) {\n this.opcode(['literal', action.value], action);\n }\n BooleanLiteral(action) {\n this.opcode(['literal', action.value], action);\n }\n NumberLiteral(action) {\n this.opcode(['literal', action.value], action);\n }\n NullLiteral(action) {\n this.opcode(['literal', action.value], action);\n }\n UndefinedLiteral(action) {\n this.opcode(['literal', action.value], action);\n }\n /// Utilities\n opcode(opcode, action = null) {\n // TODO: This doesn't really work\n if (this.includeMeta && action) {\n opcode.push(this.meta(action));\n }\n this.opcodes.push(opcode);\n }\n prepareHelper(expr) {\n assertIsSimplePath(expr.path, expr.loc, 'helper');\n let { params, hash } = expr;\n this.prepareHash(hash);\n this.prepareParams(params);\n }\n prepareParams(params) {\n if (!params.length) {\n this.opcode(['literal', null], null);\n return;\n }\n for (let i = params.length - 1; i >= 0; i--) {\n let param = params[i];\n\n this[param.type](param);\n }\n this.opcode(['prepareArray', params.length], null);\n }\n prepareHash(hash) {\n let pairs = hash.pairs;\n if (!pairs.length) {\n this.opcode(['literal', null], null);\n return;\n }\n for (let i = pairs.length - 1; i >= 0; i--) {\n let { key, value } = pairs[i];\n\n this[value.type](value);\n this.opcode(['literal', key], null);\n }\n this.opcode(['prepareObject', pairs.length], null);\n }\n prepareAttributeValue(value) {\n // returns the static value if the value is static\n switch (value.type) {\n case 'TextNode':\n this.opcode(['literal', value.chars], value);\n return true;\n case 'MustacheStatement':\n this.attributeMustache([value]);\n return false;\n case 'ConcatStatement':\n this.prepareConcatParts(value.parts);\n this.opcode(['concat', null], value);\n return false;\n }\n }\n prepareConcatParts(parts) {\n for (let i = parts.length - 1; i >= 0; i--) {\n let part = parts[i];\n if (part.type === 'MustacheStatement') {\n this.attributeMustache([part]);\n } else if (part.type === 'TextNode') {\n this.opcode(['literal', part.chars], null);\n }\n }\n this.opcode(['prepareArray', parts.length], null);\n }\n attributeMustache([action]) {\n this.mustacheExpression(action);\n }\n meta(node) {\n let loc = node.loc;\n if (!loc) {\n return [];\n }\n let { source, start, end } = loc;\n return ['loc', [source || null, [start.line, start.column], [end.line, end.column]]];\n }\n }\n function isHelperInvocation(mustache) {\n return mustache.params && mustache.params.length > 0 || mustache.hash && mustache.hash.pairs.length > 0;\n }\n function isSimplePath({ parts }) {\n return parts.length === 1;\n }\n function isYield(path) {\n return path.original === 'yield';\n }\n function isPartial(path) {\n return path.original === 'partial';\n }\n function isDebugger(path) {\n return path.original === 'debugger';\n }\n function isHasBlock(path) {\n return path.original === 'has-block';\n }\n function isHasBlockParams(path) {\n return path.original === 'has-block-params';\n }\n function isBuiltInHelper(path) {\n return isHasBlock(path) || isHasBlockParams(path);\n }\n function isArg(path) {\n return !!path['data'];\n }\n function isDynamicComponent(element) {\n let open = element.tag.charAt(0);\n let [maybeLocal] = element.tag.split('.');\n let isNamedArgument = open === '@';\n let isLocal = element['symbols'].has(maybeLocal);\n let isThisPath = element.tag.indexOf('this.') === 0;\n return isLocal || isNamedArgument || isThisPath;\n }\n function isComponent(element) {\n let open = element.tag.charAt(0);\n let isPath = element.tag.indexOf('.') > -1;\n let isUpperCase = open === open.toUpperCase() && open !== open.toLowerCase();\n return isUpperCase && !isPath || isDynamicComponent(element);\n }\n function assertIsSimplePath(path, loc, context) {\n if (!isSimplePath(path)) {\n throw new _syntax.SyntaxError(`\\`${path.original}\\` is not a valid name for a ${context} on line ${loc.start.line}.`, path.loc);\n }\n }\n function assertValidYield(statement) {\n let { pairs } = statement.hash;\n if (pairs.length === 1 && pairs[0].key !== 'to' || pairs.length > 1) {\n throw new _syntax.SyntaxError(`yield only takes a single named argument: 'to'`, statement.loc);\n } else if (pairs.length === 1 && pairs[0].value.type !== 'StringLiteral') {\n throw new _syntax.SyntaxError(`you can only yield to a literal value`, statement.loc);\n } else if (pairs.length === 0) {\n return 'default';\n } else {\n return pairs[0].value.value;\n }\n }\n function assertValidPartial(statement) {\n let { params, hash, escaped, loc } = statement;\n if (params && params.length !== 1) {\n throw new _syntax.SyntaxError(`Partial found with no arguments. You must specify a template name. (on line ${loc.start.line})`, statement.loc);\n } else if (hash && hash.pairs.length > 0) {\n throw new _syntax.SyntaxError(`partial does not take any named arguments (on line ${loc.start.line})`, statement.loc);\n } else if (!escaped) {\n throw new _syntax.SyntaxError(`{{{partial ...}}} is not supported, please use {{partial ...}} instead (on line ${loc.start.line})`, statement.loc);\n }\n return params;\n }\n function assertValidHasBlockUsage(type, call) {\n let { params, hash, loc } = call;\n if (hash && hash.pairs.length > 0) {\n throw new _syntax.SyntaxError(`${type} does not take any named arguments`, call.loc);\n }\n if (params.length === 0) {\n return 'default';\n } else if (params.length === 1) {\n let param = params[0];\n if (param.type === 'StringLiteral') {\n return param.value;\n } else {\n throw new _syntax.SyntaxError(`you can only yield to a literal value (on line ${loc.start.line})`, call.loc);\n }\n } else {\n throw new _syntax.SyntaxError(`${type} only takes a single positional argument (on line ${loc.start.line})`, call.loc);\n }\n }\n function assertValidDebuggerUsage(statement) {\n let { params, hash } = statement;\n if (hash && hash.pairs.length > 0) {\n throw new _syntax.SyntaxError(`debugger does not take any named arguments`, statement.loc);\n }\n if (params.length === 0) {\n return 'default';\n } else {\n throw new _syntax.SyntaxError(`debugger does not take any positional arguments`, statement.loc);\n }\n }\n\n const defaultId = (() => {\n if (typeof _nodeModule.require === 'function') {\n try {\n /* tslint:disable:no-require-imports */\n const crypto = (0, _nodeModule.require)('crypto');\n /* tslint:enable:no-require-imports */\n let idFn = src => {\n let hash = crypto.createHash('sha1');\n hash.update(src, 'utf8');\n // trim to 6 bytes of data (2^48 - 1)\n return hash.digest('base64').substring(0, 8);\n };\n idFn('test');\n return idFn;\n } catch (e) {}\n }\n return function idFn() {\n return null;\n };\n })();\n const defaultOptions = {\n id: defaultId,\n meta: {}\n };\n function precompile(string, options = defaultOptions) {\n let ast = (0, _syntax.preprocess)(string, options);\n let { meta } = options;\n let { block } = TemplateCompiler.compile(ast, options);\n let idFn = options.id || defaultId;\n let blockJSON = JSON.stringify(block.toJSON());\n let templateJSONObject = {\n id: idFn(JSON.stringify(meta) + blockJSON),\n block: blockJSON,\n meta: meta\n };\n // JSON is javascript\n return JSON.stringify(templateJSONObject);\n }\n\n exports.defaultId = defaultId;\n exports.precompile = precompile;\n exports.TemplateCompiler = TemplateCompiler;\n exports.TemplateVisitor = TemplateVisitor;\n});","enifed('@glimmer/encoder', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n class InstructionEncoder {\n constructor(buffer) {\n this.buffer = buffer;\n this.typePos = 0;\n this.size = 0;\n }\n encode(type, machine) {\n if (type > 255 /* TYPE_SIZE */) {\n throw new Error(`Opcode type over 8-bits. Got ${type}.`);\n }\n this.buffer.push(type | machine | arguments.length - 2 << 8 /* ARG_SHIFT */);\n this.typePos = this.buffer.length - 1;\n for (let i = 2; i < arguments.length; i++) {\n let op = arguments[i];\n if (typeof op === 'number' && op > 65535 /* MAX_SIZE */) {\n throw new Error(`Operand over 16-bits. Got ${op}.`);\n }\n this.buffer.push(op);\n }\n this.size = this.buffer.length;\n }\n patch(position, target) {\n if (this.buffer[position + 1] === -1) {\n this.buffer[position + 1] = target;\n } else {\n throw new Error('Trying to patch operand in populated slot instead of a reserved slot.');\n }\n }\n patchWith(position, target, operand) {\n if (this.buffer[position + 1] === -1) {\n this.buffer[position + 1] = target;\n this.buffer[position + 2] = operand;\n } else {\n throw new Error('Trying to patch operand in populated slot instead of a reserved slot.');\n }\n }\n }\n\n exports.InstructionEncoder = InstructionEncoder;\n});","enifed(\"@glimmer/env\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n const DEBUG = exports.DEBUG = true;\n});","enifed('@glimmer/low-level', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n class Storage {\n constructor() {\n this.array = [];\n this.next = 0;\n }\n add(element) {\n let { next: slot, array } = this;\n if (slot === array.length) {\n this.next++;\n } else {\n let prev = array[slot];\n this.next = prev;\n }\n this.array[slot] = element;\n return slot;\n }\n deref(pointer) {\n return this.array[pointer];\n }\n drop(pointer) {\n this.array[pointer] = this.next;\n this.next = pointer;\n }\n }\n\n class Stack {\n constructor(vec = []) {\n this.vec = vec;\n }\n clone() {\n return new Stack(this.vec.slice());\n }\n sliceFrom(start) {\n return new Stack(this.vec.slice(start));\n }\n slice(start, end) {\n return new Stack(this.vec.slice(start, end));\n }\n copy(from, to) {\n this.vec[to] = this.vec[from];\n }\n // TODO: how to model u64 argument?\n writeRaw(pos, value) {\n // TODO: Grow?\n this.vec[pos] = value;\n }\n writeSmi(pos, value) {\n this.vec[pos] = encodeSmi(value);\n }\n // TODO: partially decoded enum?\n getRaw(pos) {\n return this.vec[pos];\n }\n getSmi(pos) {\n return decodeSmi(this.vec[pos]);\n }\n reset() {\n this.vec.length = 0;\n }\n len() {\n return this.vec.length;\n }\n }\n function decodeSmi(smi) {\n switch (smi & 0b111) {\n case 0 /* NUMBER */:\n return smi >> 3;\n case 4 /* NEGATIVE */:\n return -(smi >> 3);\n default:\n throw new Error('unreachable');\n }\n }\n function encodeSmi(primitive) {\n if (primitive < 0) {\n return Math.abs(primitive) << 3 | 4 /* NEGATIVE */;\n } else {\n return primitive << 3 | 0 /* NUMBER */;\n }\n }\n\n exports.Storage = Storage;\n exports.Stack = Stack;\n});","enifed('@glimmer/node', ['exports', '@glimmer/runtime'], function (exports, _runtime) {\n 'use strict';\n\n exports.__esModule = true;\n exports.serializeBuilder = exports.NodeDOMTreeConstruction = undefined;\n\n\n class NodeDOMTreeConstruction extends _runtime.DOMTreeConstruction {\n constructor(doc) {\n super(doc);\n }\n // override to prevent usage of `this.document` until after the constructor\n setupUselessElement() {}\n insertHTMLBefore(parent, reference, html) {\n let prev = reference ? reference.previousSibling : parent.lastChild;\n let raw = this.document.createRawHTMLSection(html);\n parent.insertBefore(raw, reference);\n let first = prev ? prev.nextSibling : parent.firstChild;\n let last = reference ? reference.previousSibling : parent.lastChild;\n return new _runtime.ConcreteBounds(parent, first, last);\n }\n // override to avoid SVG detection/work when in node (this is not needed in SSR)\n createElement(tag) {\n return this.document.createElement(tag);\n }\n // override to avoid namespace shenanigans when in node (this is not needed in SSR)\n setAttribute(element, name, value) {\n element.setAttribute(name, value);\n }\n }\n\n const TEXT_NODE = 3;\n function currentNode(cursor) {\n let { element, nextSibling } = cursor;\n if (nextSibling === null) {\n return element.lastChild;\n } else {\n return nextSibling.previousSibling;\n }\n }\n class SerializeBuilder extends _runtime.NewElementBuilder {\n constructor() {\n super(...arguments);\n this.serializeBlockDepth = 0;\n }\n __openBlock() {\n let depth = this.serializeBlockDepth++;\n this.__appendComment(`%+b:${depth}%`);\n super.__openBlock();\n }\n __closeBlock() {\n super.__closeBlock();\n this.__appendComment(`%-b:${--this.serializeBlockDepth}%`);\n }\n __appendHTML(html) {\n // Do we need to run the html tokenizer here?\n let first = this.__appendComment('%glmr%');\n if (this.element.tagName === 'TABLE') {\n let openIndex = html.indexOf('<');\n if (openIndex > -1) {\n let tr = html.slice(openIndex + 1, openIndex + 3);\n if (tr === 'tr') {\n html = `${html}`;\n }\n }\n }\n if (html === '') {\n this.__appendComment('% %');\n } else {\n super.__appendHTML(html);\n }\n let last = this.__appendComment('%glmr%');\n return new _runtime.ConcreteBounds(this.element, first, last);\n }\n __appendText(string) {\n let current = currentNode(this);\n if (string === '') {\n return this.__appendComment('% %');\n } else if (current && current.nodeType === TEXT_NODE) {\n this.__appendComment('%|%');\n }\n return super.__appendText(string);\n }\n closeElement() {\n if (this.element['needsExtraClose'] === true) {\n this.element['needsExtraClose'] = false;\n super.closeElement();\n }\n super.closeElement();\n }\n openElement(tag) {\n if (tag === 'tr') {\n if (this.element.tagName !== 'TBODY') {\n this.openElement('tbody');\n // This prevents the closeBlock comment from being re-parented\n // under the auto inserted tbody. Rehydration builder needs to\n // account for the insertion since it is injected here and not\n // really in the template.\n this.constructing['needsExtraClose'] = true;\n this.flushElement();\n }\n }\n return super.openElement(tag);\n }\n pushRemoteElement(element, cursorId, nextSibling = null) {\n let { dom } = this;\n let script = dom.createElement('script');\n script.setAttribute('glmr', cursorId);\n dom.insertBefore(element, script, nextSibling);\n super.pushRemoteElement(element, cursorId, nextSibling);\n }\n }\n function serializeBuilder(env, cursor) {\n return SerializeBuilder.forInitialRender(env, cursor);\n }\n\n exports.NodeDOMTreeConstruction = NodeDOMTreeConstruction;\n exports.serializeBuilder = serializeBuilder;\n});","enifed('@glimmer/opcode-compiler', ['exports', '@glimmer/util', '@glimmer/vm', '@glimmer/wire-format', '@glimmer/encoder', '@glimmer/program'], function (exports, _util, _vm, _wireFormat, _encoder, _program) {\n 'use strict';\n\n exports.__esModule = true;\n exports.PLACEHOLDER_HANDLE = exports.WrappedBuilder = exports.logOpcode = exports.debugSlice = exports.debug = exports.templateFactory = exports.PartialDefinition = exports.StdOpcodeBuilder = exports.OpcodeBuilder = exports.EagerOpcodeBuilder = exports.LazyOpcodeBuilder = exports.CompilableProgram = exports.CompilableBlock = exports.debugCompiler = exports.AbstractCompiler = exports.compile = exports.LazyCompiler = exports.Macros = exports.ATTRS_BLOCK = undefined;\n\n\n const PLACEHOLDER_HANDLE = -1;\n\n var Ops$1;\n (function (Ops$$1) {\n Ops$$1[Ops$$1[\"OpenComponentElement\"] = 0] = \"OpenComponentElement\";\n Ops$$1[Ops$$1[\"DidCreateElement\"] = 1] = \"DidCreateElement\";\n Ops$$1[Ops$$1[\"SetComponentAttrs\"] = 2] = \"SetComponentAttrs\";\n Ops$$1[Ops$$1[\"DidRenderLayout\"] = 3] = \"DidRenderLayout\";\n Ops$$1[Ops$$1[\"Debugger\"] = 4] = \"Debugger\";\n })(Ops$1 || (Ops$1 = {}));\n\n var Ops$2 = _wireFormat.Ops;\n const ATTRS_BLOCK = '&attrs';\n class Compilers {\n constructor(offset = 0) {\n this.offset = offset;\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n }\n compile(sexp, builder) {\n let name = sexp[this.offset];\n let index = this.names[name];\n let func = this.funcs[index];\n\n func(sexp, builder);\n }\n }\n let _statementCompiler;\n function statementCompiler() {\n if (_statementCompiler) {\n return _statementCompiler;\n }\n const STATEMENTS = _statementCompiler = new Compilers();\n STATEMENTS.add(Ops$2.Text, (sexp, builder) => {\n builder.text(sexp[1]);\n });\n STATEMENTS.add(Ops$2.Comment, (sexp, builder) => {\n builder.comment(sexp[1]);\n });\n STATEMENTS.add(Ops$2.CloseElement, (_sexp, builder) => {\n builder.closeElement();\n });\n STATEMENTS.add(Ops$2.FlushElement, (_sexp, builder) => {\n builder.flushElement();\n });\n STATEMENTS.add(Ops$2.Modifier, (sexp, builder) => {\n let { referrer } = builder;\n let [, name, params, hash] = sexp;\n let handle = builder.compiler.resolveModifier(name, referrer);\n if (handle !== null) {\n builder.modifier(handle, params, hash);\n } else {\n throw new Error(`Compile Error ${name} is not a modifier: Helpers may not be used in the element form.`);\n }\n });\n STATEMENTS.add(Ops$2.StaticAttr, (sexp, builder) => {\n let [, name, value, namespace] = sexp;\n builder.staticAttr(name, namespace, value);\n });\n STATEMENTS.add(Ops$2.DynamicAttr, (sexp, builder) => {\n dynamicAttr(sexp, false, builder);\n });\n STATEMENTS.add(Ops$2.TrustingAttr, (sexp, builder) => {\n dynamicAttr(sexp, true, builder);\n });\n STATEMENTS.add(Ops$2.OpenElement, (sexp, builder) => {\n builder.openPrimitiveElement(sexp[1]);\n });\n STATEMENTS.add(Ops$2.OpenSplattedElement, (sexp, builder) => {\n builder.setComponentAttrs(true);\n builder.putComponentOperations();\n builder.openPrimitiveElement(sexp[1]);\n });\n STATEMENTS.add(Ops$2.DynamicComponent, (sexp, builder) => {\n let [, definition, attrs, args, template] = sexp;\n let block = builder.template(template);\n let attrsBlock = null;\n if (attrs.length > 0) {\n let wrappedAttrs = [[Ops$2.ClientSideStatement, Ops$1.SetComponentAttrs, true], ...attrs, [Ops$2.ClientSideStatement, Ops$1.SetComponentAttrs, false]];\n attrsBlock = builder.inlineBlock({ statements: wrappedAttrs, parameters: _util.EMPTY_ARRAY });\n }\n builder.dynamicComponent(definition, attrsBlock, null, args, false, block, null);\n });\n STATEMENTS.add(Ops$2.Component, (sexp, builder) => {\n let [, tag, _attrs, args, block] = sexp;\n let { referrer } = builder;\n let { handle, capabilities, compilable } = builder.compiler.resolveLayoutForTag(tag, referrer);\n if (handle !== null && capabilities !== null) {\n let attrs = [[Ops$2.ClientSideStatement, Ops$1.SetComponentAttrs, true], ..._attrs, [Ops$2.ClientSideStatement, Ops$1.SetComponentAttrs, false]];\n let attrsBlock = builder.inlineBlock({ statements: attrs, parameters: _util.EMPTY_ARRAY });\n let child = builder.template(block);\n if (compilable) {\n builder.pushComponentDefinition(handle);\n builder.invokeStaticComponent(capabilities, compilable, attrsBlock, null, args, false, child && child);\n } else {\n builder.pushComponentDefinition(handle);\n builder.invokeComponent(capabilities, attrsBlock, null, args, false, child && child);\n }\n } else {\n throw new Error(`Compile Error: Cannot find component ${tag}`);\n }\n });\n STATEMENTS.add(Ops$2.Partial, (sexp, builder) => {\n let [, name, evalInfo] = sexp;\n let { referrer } = builder;\n builder.replayableIf({\n args() {\n builder.expr(name);\n builder.dup();\n return 2;\n },\n ifTrue() {\n builder.invokePartial(referrer, builder.evalSymbols(), evalInfo);\n builder.popScope();\n builder.popFrame(); // FIXME: WAT\n }\n });\n });\n STATEMENTS.add(Ops$2.Yield, (sexp, builder) => {\n let [, to, params] = sexp;\n builder.yield(to, params);\n });\n STATEMENTS.add(Ops$2.AttrSplat, (sexp, builder) => {\n let [, to] = sexp;\n builder.yield(to, []);\n builder.setComponentAttrs(false);\n });\n STATEMENTS.add(Ops$2.Debugger, (sexp, builder) => {\n let [, evalInfo] = sexp;\n builder.debugger(builder.evalSymbols(), evalInfo);\n });\n STATEMENTS.add(Ops$2.ClientSideStatement, (sexp, builder) => {\n CLIENT_SIDE.compile(sexp, builder);\n });\n STATEMENTS.add(Ops$2.Append, (sexp, builder) => {\n let [, value, trusting] = sexp;\n let returned = builder.compileInline(sexp) || value;\n if (returned === true) return;\n builder.guardedAppend(value, trusting);\n });\n STATEMENTS.add(Ops$2.Block, (sexp, builder) => {\n let [, name, params, hash, _template, _inverse] = sexp;\n let template = builder.template(_template);\n let inverse = builder.template(_inverse);\n let templateBlock = template && template;\n let inverseBlock = inverse && inverse;\n builder.compileBlock(name, params, hash, templateBlock, inverseBlock);\n });\n const CLIENT_SIDE = new Compilers(1);\n CLIENT_SIDE.add(Ops$1.OpenComponentElement, (sexp, builder) => {\n builder.putComponentOperations();\n builder.openPrimitiveElement(sexp[2]);\n });\n CLIENT_SIDE.add(Ops$1.DidCreateElement, (_sexp, builder) => {\n builder.didCreateElement(_vm.Register.s0);\n });\n CLIENT_SIDE.add(Ops$1.SetComponentAttrs, (sexp, builder) => {\n builder.setComponentAttrs(sexp[2]);\n });\n CLIENT_SIDE.add(Ops$1.Debugger, () => {\n // tslint:disable-next-line:no-debugger\n debugger;\n });\n CLIENT_SIDE.add(Ops$1.DidRenderLayout, (_sexp, builder) => {\n builder.didRenderLayout(_vm.Register.s0);\n });\n return STATEMENTS;\n }\n function dynamicAttr(sexp, trusting, builder) {\n let [, name, value, namespace] = sexp;\n builder.expr(value);\n if (namespace) {\n builder.dynamicAttr(name, namespace, trusting);\n } else {\n builder.dynamicAttr(name, null, trusting);\n }\n }\n let _expressionCompiler;\n function expressionCompiler() {\n if (_expressionCompiler) {\n return _expressionCompiler;\n }\n const EXPRESSIONS = _expressionCompiler = new Compilers();\n EXPRESSIONS.add(Ops$2.Unknown, (sexp, builder) => {\n let { compiler, referrer, containingLayout: { asPartial } } = builder;\n let name = sexp[1];\n let handle = compiler.resolveHelper(name, referrer);\n if (handle !== null) {\n builder.helper(handle, null, null);\n } else if (asPartial) {\n builder.resolveMaybeLocal(name);\n } else {\n builder.getVariable(0);\n builder.getProperty(name);\n }\n });\n EXPRESSIONS.add(Ops$2.Concat, (sexp, builder) => {\n let parts = sexp[1];\n for (let i = 0; i < parts.length; i++) {\n builder.expr(parts[i]);\n }\n builder.concat(parts.length);\n });\n EXPRESSIONS.add(Ops$2.Helper, (sexp, builder) => {\n let { compiler, referrer } = builder;\n let [, name, params, hash] = sexp;\n // TODO: triage this in the WF compiler\n if (name === 'component') {\n\n let [definition, ...restArgs] = params;\n builder.curryComponent(definition, restArgs, hash, true);\n return;\n }\n let handle = compiler.resolveHelper(name, referrer);\n if (handle !== null) {\n builder.helper(handle, params, hash);\n } else {\n throw new Error(`Compile Error: ${name} is not a helper`);\n }\n });\n EXPRESSIONS.add(Ops$2.Get, (sexp, builder) => {\n let [, head, path] = sexp;\n builder.getVariable(head);\n for (let i = 0; i < path.length; i++) {\n builder.getProperty(path[i]);\n }\n });\n EXPRESSIONS.add(Ops$2.MaybeLocal, (sexp, builder) => {\n let [, path] = sexp;\n if (builder.containingLayout.asPartial) {\n let head = path[0];\n path = path.slice(1);\n builder.resolveMaybeLocal(head);\n } else {\n builder.getVariable(0);\n }\n for (let i = 0; i < path.length; i++) {\n builder.getProperty(path[i]);\n }\n });\n EXPRESSIONS.add(Ops$2.Undefined, (_sexp, builder) => {\n return builder.pushPrimitiveReference(undefined);\n });\n EXPRESSIONS.add(Ops$2.HasBlock, (sexp, builder) => {\n builder.hasBlock(sexp[1]);\n });\n EXPRESSIONS.add(Ops$2.HasBlockParams, (sexp, builder) => {\n builder.hasBlockParams(sexp[1]);\n });\n return EXPRESSIONS;\n }\n class Macros {\n constructor() {\n let { blocks, inlines } = populateBuiltins();\n this.blocks = blocks;\n this.inlines = inlines;\n }\n }\n class Blocks {\n constructor() {\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n }\n addMissing(func) {\n this.missing = func;\n }\n compile(name, params, hash, template, inverse, builder) {\n let index = this.names[name];\n if (index === undefined) {\n\n let func = this.missing;\n let handled = func(name, params, hash, template, inverse, builder);\n } else {\n let func = this.funcs[index];\n func(params, hash, template, inverse, builder);\n }\n }\n }\n class Inlines {\n constructor() {\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n }\n addMissing(func) {\n this.missing = func;\n }\n compile(sexp, builder) {\n let value = sexp[1];\n // TODO: Fix this so that expression macros can return\n // things like components, so that {{component foo}}\n // is the same as {{(component foo)}}\n if (!Array.isArray(value)) return ['expr', value];\n let name;\n let params;\n let hash;\n if (value[0] === Ops$2.Helper) {\n name = value[1];\n params = value[2];\n hash = value[3];\n } else if (value[0] === Ops$2.Unknown) {\n name = value[1];\n params = hash = null;\n } else {\n return ['expr', value];\n }\n let index = this.names[name];\n if (index === undefined && this.missing) {\n let func = this.missing;\n let returned = func(name, params, hash, builder);\n return returned === false ? ['expr', value] : returned;\n } else if (index !== undefined) {\n let func = this.funcs[index];\n let returned = func(name, params, hash, builder);\n return returned === false ? ['expr', value] : returned;\n } else {\n return ['expr', value];\n }\n }\n }\n function populateBuiltins(blocks = new Blocks(), inlines = new Inlines()) {\n blocks.add('if', (params, _hash, template, inverse, builder) => {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error(`SYNTAX ERROR: #if requires a single argument`);\n }\n builder.replayableIf({\n args() {\n builder.expr(params[0]);\n builder.toBoolean();\n return 1;\n },\n ifTrue() {\n builder.invokeStaticBlock(template);\n },\n ifFalse() {\n if (inverse) {\n builder.invokeStaticBlock(inverse);\n }\n }\n });\n });\n blocks.add('unless', (params, _hash, template, inverse, builder) => {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error(`SYNTAX ERROR: #unless requires a single argument`);\n }\n builder.replayableIf({\n args() {\n builder.expr(params[0]);\n builder.toBoolean();\n return 1;\n },\n ifTrue() {\n if (inverse) {\n builder.invokeStaticBlock(inverse);\n }\n },\n ifFalse() {\n builder.invokeStaticBlock(template);\n }\n });\n });\n blocks.add('with', (params, _hash, template, inverse, builder) => {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error(`SYNTAX ERROR: #with requires a single argument`);\n }\n builder.replayableIf({\n args() {\n builder.expr(params[0]);\n builder.dup();\n builder.toBoolean();\n return 2;\n },\n ifTrue() {\n builder.invokeStaticBlock(template, 1);\n },\n ifFalse() {\n if (inverse) {\n builder.invokeStaticBlock(inverse);\n }\n }\n });\n });\n blocks.add('each', (params, hash, template, inverse, builder) => {\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // PutArgs\n // PutIterable\n // JumpUnless(ELSE)\n // EnterList(BEGIN2, END2)\n // ITER: Noop\n // NextIter(BREAK)\n // BEGIN2: Noop\n // PushChildScope\n // Evaluate(default)\n // PopScope\n // END2: Noop\n // Exit\n // Jump(ITER)\n // BREAK: Noop\n // ExitList\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n builder.replayable({\n args() {\n if (hash && hash[0][0] === 'key') {\n builder.expr(hash[1][0]);\n } else {\n builder.pushPrimitiveReference(null);\n }\n builder.expr(params[0]);\n return 2;\n },\n body() {\n builder.putIterator();\n builder.jumpUnless('ELSE');\n builder.pushFrame();\n builder.dup(_vm.Register.fp, 1);\n builder.returnTo('ITER');\n builder.enterList('BODY');\n builder.label('ITER');\n builder.iterate('BREAK');\n builder.label('BODY');\n builder.invokeStaticBlock(template, 2);\n builder.pop(2);\n builder.jump('FINALLY');\n builder.label('BREAK');\n builder.exitList();\n builder.popFrame();\n builder.jump('FINALLY');\n builder.label('ELSE');\n if (inverse) {\n builder.invokeStaticBlock(inverse);\n }\n }\n });\n });\n blocks.add('in-element', (params, hash, template, _inverse, builder) => {\n if (!params || params.length !== 1) {\n throw new Error(`SYNTAX ERROR: #in-element requires a single argument`);\n }\n builder.replayableIf({\n args() {\n let [keys, values] = hash;\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n if (key === 'nextSibling' || key === 'guid') {\n builder.expr(values[i]);\n } else {\n throw new Error(`SYNTAX ERROR: #in-element does not take a \\`${keys[0]}\\` option`);\n }\n }\n builder.expr(params[0]);\n builder.dup();\n return 4;\n },\n ifTrue() {\n builder.pushRemoteElement();\n builder.invokeStaticBlock(template);\n builder.popRemoteElement();\n }\n });\n });\n blocks.add('-with-dynamic-vars', (_params, hash, template, _inverse, builder) => {\n if (hash) {\n let [names, expressions] = hash;\n builder.compileParams(expressions);\n builder.pushDynamicScope();\n builder.bindDynamicScope(names);\n builder.invokeStaticBlock(template);\n builder.popDynamicScope();\n } else {\n builder.invokeStaticBlock(template);\n }\n });\n blocks.add('component', (_params, hash, template, inverse, builder) => {\n\n let tag = _params[0];\n if (typeof tag === 'string') {\n let returned = builder.staticComponentHelper(_params[0], hash, template);\n if (returned) return;\n }\n let [definition, ...params] = _params;\n builder.dynamicComponent(definition, null, params, hash, true, template, inverse);\n });\n inlines.add('component', (_name, _params, hash, builder) => {\n\n let tag = _params && _params[0];\n if (typeof tag === 'string') {\n let returned = builder.staticComponentHelper(tag, hash, null);\n if (returned) return true;\n }\n let [definition, ...params] = _params;\n builder.dynamicComponent(definition, null, params, hash, true, null, null);\n return true;\n });\n return { blocks, inlines };\n }\n\n const PLACEHOLDER_HANDLE$1 = -1;\n class CompilableProgram {\n constructor(compiler, layout) {\n this.compiler = compiler;\n this.layout = layout;\n this.compiled = null;\n }\n get symbolTable() {\n return this.layout.block;\n }\n compile() {\n if (this.compiled !== null) return this.compiled;\n this.compiled = PLACEHOLDER_HANDLE$1;\n let { block: { statements } } = this.layout;\n return this.compiled = this.compiler.add(statements, this.layout);\n }\n }\n class CompilableBlock {\n constructor(compiler, parsed) {\n this.compiler = compiler;\n this.parsed = parsed;\n this.compiled = null;\n }\n get symbolTable() {\n return this.parsed.block;\n }\n compile() {\n if (this.compiled !== null) return this.compiled;\n // Track that compilation has started but not yet finished by temporarily\n // using a placeholder handle. In eager compilation mode, where compile()\n // may be called recursively, we use this as a signal that the handle cannot\n // be known synchronously and must be linked lazily.\n this.compiled = PLACEHOLDER_HANDLE$1;\n let { block: { statements }, containingLayout } = this.parsed;\n return this.compiled = this.compiler.add(statements, containingLayout);\n }\n }\n\n function compile(statements, builder, compiler) {\n let sCompiler = statementCompiler();\n for (let i = 0; i < statements.length; i++) {\n sCompiler.compile(statements[i], builder);\n }\n let handle = builder.commit();\n return handle;\n }\n\n function debugSlice(program, start, end) {}\n function logOpcode(type, params) {\n let out = type;\n if (params) {\n let args = Object.keys(params).map(p => ` ${p}=${json(params[p])}`).join('');\n out += args;\n }\n return `(${out})`;\n }\n function json(param) {}\n function debug(pos, c, op, ...operands) {\n let metadata = null;\n if (!metadata) {\n throw (0, _util.unreachable)(`Missing Opcode Metadata for ${op}`);\n }\n let out = (0, _util.dict)();\n metadata.ops.forEach((operand, index) => {\n let op = operands[index];\n switch (operand.type) {\n case 'to':\n out[operand.name] = pos + op;\n break;\n case 'i32':\n case 'symbol':\n case 'block':\n out[operand.name] = op;\n break;\n case 'handle':\n out[operand.name] = c.resolveHandle(op);\n break;\n case 'str':\n out[operand.name] = c.getString(op);\n break;\n case 'option-str':\n out[operand.name] = op ? c.getString(op) : null;\n break;\n case 'str-array':\n out[operand.name] = c.getStringArray(op);\n break;\n case 'array':\n out[operand.name] = c.getArray(op);\n break;\n case 'bool':\n out[operand.name] = !!op;\n break;\n case 'primitive':\n out[operand.name] = decodePrimitive(op, c);\n break;\n case 'register':\n out[operand.name] = _vm.Register[op];\n break;\n case 'serializable':\n out[operand.name] = c.getSerializable(op);\n break;\n case 'lazy-constant':\n out[operand.name] = c.getOther(op);\n break;\n }\n });\n return [metadata.name, out];\n }\n function decodePrimitive(primitive, constants) {\n let flag = primitive & 7; // 111\n let value = primitive >> 3;\n switch (flag) {\n case 0 /* NUMBER */:\n return value;\n case 1 /* FLOAT */:\n return constants.getNumber(value);\n case 2 /* STRING */:\n return constants.getString(value);\n case 3 /* BOOLEAN_OR_VOID */:\n switch (value) {\n case 0:\n return false;\n case 1:\n return true;\n case 2:\n return null;\n case 3:\n return undefined;\n }\n case 4 /* NEGATIVE */:\n return constants.getNumber(value);\n default:\n throw (0, _util.unreachable)();\n }\n }\n\n class StdLib {\n constructor(main, trustingGuardedAppend, cautiousGuardedAppend) {\n this.main = main;\n this.trustingGuardedAppend = trustingGuardedAppend;\n this.cautiousGuardedAppend = cautiousGuardedAppend;\n }\n static compile(compiler) {\n let main = this.std(compiler, b => b.main());\n let trustingGuardedAppend = this.std(compiler, b => b.stdAppend(true));\n let cautiousGuardedAppend = this.std(compiler, b => b.stdAppend(false));\n return new StdLib(main, trustingGuardedAppend, cautiousGuardedAppend);\n }\n static std(compiler, callback) {\n return StdOpcodeBuilder.build(compiler, callback);\n }\n getAppend(trusting) {\n return trusting ? this.trustingGuardedAppend : this.cautiousGuardedAppend;\n }\n }\n class AbstractCompiler {\n constructor(macros, program, resolver) {\n this.macros = macros;\n this.program = program;\n this.resolver = resolver;\n this.initialize();\n }\n initialize() {\n this.stdLib = StdLib.compile(this);\n }\n get constants() {\n return this.program.constants;\n }\n compileInline(sexp, builder) {\n let { inlines } = this.macros;\n return inlines.compile(sexp, builder);\n }\n compileBlock(name, params, hash, template, inverse, builder) {\n let { blocks } = this.macros;\n blocks.compile(name, params, hash, template, inverse, builder);\n }\n add(statements, containingLayout) {\n return compile(statements, this.builderFor(containingLayout), this);\n }\n commit(scopeSize, buffer) {\n let heap = this.program.heap;\n // TODO: change the whole malloc API and do something more efficient\n let handle = heap.malloc();\n for (let i = 0; i < buffer.length; i++) {\n let value = buffer[i];\n if (typeof value === 'function') {\n heap.pushPlaceholder(value);\n } else {\n heap.push(value);\n }\n }\n heap.finishMalloc(handle, scopeSize);\n return handle;\n }\n resolveLayoutForTag(tag, referrer) {\n let { resolver } = this;\n let handle = resolver.lookupComponentDefinition(tag, referrer);\n if (handle === null) return { handle: null, capabilities: null, compilable: null };\n return this.resolveLayoutForHandle(handle);\n }\n resolveLayoutForHandle(handle) {\n let { resolver } = this;\n let capabilities = resolver.getCapabilities(handle);\n let compilable = null;\n if (!capabilities.dynamicLayout) {\n compilable = resolver.getLayout(handle);\n }\n return {\n handle,\n capabilities,\n compilable\n };\n }\n resolveModifier(name, referrer) {\n return this.resolver.lookupModifier(name, referrer);\n }\n resolveHelper(name, referrer) {\n return this.resolver.lookupHelper(name, referrer);\n }\n }\n let debugCompiler;\n\n class WrappedBuilder {\n constructor(compiler, layout) {\n this.compiler = compiler;\n this.layout = layout;\n this.compiled = null;\n let { block } = layout;\n let symbols = block.symbols.slice();\n // ensure ATTRS_BLOCK is always included (only once) in the list of symbols\n let attrsBlockIndex = symbols.indexOf(ATTRS_BLOCK);\n if (attrsBlockIndex === -1) {\n this.attrsBlockNumber = symbols.push(ATTRS_BLOCK);\n } else {\n this.attrsBlockNumber = attrsBlockIndex + 1;\n }\n this.symbolTable = {\n hasEval: block.hasEval,\n symbols\n };\n }\n compile() {\n if (this.compiled !== null) return this.compiled;\n //========DYNAMIC\n // PutValue(TagExpr)\n // Test\n // JumpUnless(BODY)\n // PutComponentOperations\n // OpenDynamicPrimitiveElement\n // DidCreateElement\n // ...attr statements...\n // FlushElement\n // BODY: Noop\n // ...body statements...\n // PutValue(TagExpr)\n // Test\n // JumpUnless(END)\n // CloseElement\n // END: Noop\n // DidRenderLayout\n // Exit\n //\n //========STATIC\n // OpenPrimitiveElementOpcode\n // DidCreateElement\n // ...attr statements...\n // FlushElement\n // ...body statements...\n // CloseElement\n // DidRenderLayout\n // Exit\n let { compiler, layout } = this;\n let b = compiler.builderFor(layout);\n b.startLabels();\n b.fetch(_vm.Register.s1);\n b.getComponentTagName(_vm.Register.s0);\n b.primitiveReference();\n b.dup();\n b.load(_vm.Register.s1);\n b.jumpUnless('BODY');\n b.fetch(_vm.Register.s1);\n b.setComponentAttrs(true);\n b.putComponentOperations();\n b.openDynamicElement();\n b.didCreateElement(_vm.Register.s0);\n b.yield(this.attrsBlockNumber, []);\n b.setComponentAttrs(false);\n b.flushElement();\n b.label('BODY');\n b.invokeStaticBlock(blockFor(layout, compiler));\n b.fetch(_vm.Register.s1);\n b.jumpUnless('END');\n b.closeElement();\n b.label('END');\n b.load(_vm.Register.s1);\n b.stopLabels();\n let handle = b.commit();\n return this.compiled = handle;\n }\n }\n function blockFor(layout, compiler) {\n return new CompilableBlock(compiler, {\n block: {\n statements: layout.block.statements,\n parameters: _util.EMPTY_ARRAY\n },\n containingLayout: layout\n });\n }\n class ComponentBuilder {\n constructor(builder) {\n this.builder = builder;\n }\n static(handle, args) {\n let [params, hash, _default, inverse] = args;\n let { builder } = this;\n if (handle !== null) {\n let { capabilities, compilable } = builder.compiler.resolveLayoutForHandle(handle);\n if (compilable) {\n builder.pushComponentDefinition(handle);\n builder.invokeStaticComponent(capabilities, compilable, null, params, hash, false, _default, inverse);\n } else {\n builder.pushComponentDefinition(handle);\n builder.invokeComponent(capabilities, null, params, hash, false, _default, inverse);\n }\n }\n }\n }\n\n class Labels {\n constructor() {\n this.labels = (0, _util.dict)();\n this.targets = [];\n }\n label(name, index) {\n this.labels[name] = index;\n }\n target(at, target) {\n this.targets.push({ at, target });\n }\n patch(encoder) {\n let { targets, labels } = this;\n for (let i = 0; i < targets.length; i++) {\n let { at, target } = targets[i];\n let address = labels[target] - at;\n encoder.patch(at, address);\n }\n }\n }\n class StdOpcodeBuilder {\n constructor(compiler, size = 0) {\n this.size = size;\n this.encoder = new _encoder.InstructionEncoder([]);\n this.labelsStack = new _util.Stack();\n this.compiler = compiler;\n }\n static build(compiler, callback) {\n let builder = new StdOpcodeBuilder(compiler);\n callback(builder);\n return builder.commit();\n }\n push(name) {\n switch (arguments.length) {\n case 1:\n return this.encoder.encode(name, 0);\n case 2:\n return this.encoder.encode(name, 0, arguments[1]);\n case 3:\n return this.encoder.encode(name, 0, arguments[1], arguments[2]);\n default:\n return this.encoder.encode(name, 0, arguments[1], arguments[2], arguments[3]);\n }\n }\n pushMachine(name) {\n switch (arguments.length) {\n case 1:\n return this.encoder.encode(name, 1024 /* MACHINE_MASK */);\n case 2:\n return this.encoder.encode(name, 1024 /* MACHINE_MASK */, arguments[1]);\n case 3:\n return this.encoder.encode(name, 1024 /* MACHINE_MASK */, arguments[1], arguments[2]);\n default:\n return this.encoder.encode(name, 1024 /* MACHINE_MASK */, arguments[1], arguments[2], arguments[3]);\n }\n }\n commit() {\n this.pushMachine(24 /* Return */);\n return this.compiler.commit(this.size, this.encoder.buffer);\n }\n reserve(name) {\n this.encoder.encode(name, 0, -1);\n }\n reserveWithOperand(name, operand) {\n this.encoder.encode(name, 0, -1, operand);\n }\n reserveMachine(name) {\n this.encoder.encode(name, 1024 /* MACHINE_MASK */, -1);\n }\n ///\n main() {\n this.push(68 /* Main */, _vm.Register.s0);\n this.invokePreparedComponent(false, false, true);\n }\n appendHTML() {\n this.push(28 /* AppendHTML */);\n }\n appendSafeHTML() {\n this.push(29 /* AppendSafeHTML */);\n }\n appendDocumentFragment() {\n this.push(30 /* AppendDocumentFragment */);\n }\n appendNode() {\n this.push(31 /* AppendNode */);\n }\n appendText() {\n this.push(32 /* AppendText */);\n }\n beginComponentTransaction() {\n this.push(91 /* BeginComponentTransaction */);\n }\n commitComponentTransaction() {\n this.push(92 /* CommitComponentTransaction */);\n }\n pushDynamicScope() {\n this.push(44 /* PushDynamicScope */);\n }\n popDynamicScope() {\n this.push(45 /* PopDynamicScope */);\n }\n pushRemoteElement() {\n this.push(41 /* PushRemoteElement */);\n }\n popRemoteElement() {\n this.push(42 /* PopRemoteElement */);\n }\n pushRootScope(symbols, bindCallerScope) {\n this.push(20 /* RootScope */, symbols, bindCallerScope ? 1 : 0);\n }\n pushVirtualRootScope(register) {\n this.push(21 /* VirtualRootScope */, register);\n }\n pushChildScope() {\n this.push(22 /* ChildScope */);\n }\n popScope() {\n this.push(23 /* PopScope */);\n }\n prepareArgs(state) {\n this.push(79 /* PrepareArgs */, state);\n }\n createComponent(state, hasDefault) {\n let flag = hasDefault | 0;\n this.push(81 /* CreateComponent */, flag, state);\n }\n registerComponentDestructor(state) {\n this.push(82 /* RegisterComponentDestructor */, state);\n }\n putComponentOperations() {\n this.push(83 /* PutComponentOperations */);\n }\n getComponentSelf(state) {\n this.push(84 /* GetComponentSelf */, state);\n }\n getComponentTagName(state) {\n this.push(85 /* GetComponentTagName */, state);\n }\n getComponentLayout(state) {\n this.push(86 /* GetComponentLayout */, state);\n }\n setupForEval(state) {\n this.push(87 /* SetupForEval */, state);\n }\n invokeComponentLayout(state) {\n this.push(90 /* InvokeComponentLayout */, state);\n }\n didCreateElement(state) {\n this.push(93 /* DidCreateElement */, state);\n }\n didRenderLayout(state) {\n this.push(94 /* DidRenderLayout */, state);\n }\n pushFrame() {\n this.pushMachine(57 /* PushFrame */);\n }\n popFrame() {\n this.pushMachine(58 /* PopFrame */);\n }\n pushSmallFrame() {\n this.pushMachine(59 /* PushSmallFrame */);\n }\n popSmallFrame() {\n this.pushMachine(60 /* PopSmallFrame */);\n }\n invokeVirtual() {\n this.pushMachine(49 /* InvokeVirtual */);\n }\n invokeYield() {\n this.push(51 /* InvokeYield */);\n }\n toBoolean() {\n this.push(63 /* ToBoolean */);\n }\n invokePreparedComponent(hasBlock, bindableBlocks, bindableAtNames, populateLayout = null) {\n this.beginComponentTransaction();\n this.pushDynamicScope();\n this.createComponent(_vm.Register.s0, hasBlock);\n // this has to run after createComponent to allow\n // for late-bound layouts, but a caller is free\n // to populate the layout earlier if it wants to\n // and do nothing here.\n if (populateLayout) populateLayout();\n this.registerComponentDestructor(_vm.Register.s0);\n this.getComponentSelf(_vm.Register.s0);\n this.pushVirtualRootScope(_vm.Register.s0);\n this.setVariable(0);\n this.setupForEval(_vm.Register.s0);\n if (bindableAtNames) this.setNamedVariables(_vm.Register.s0);\n if (bindableBlocks) this.setBlocks(_vm.Register.s0);\n this.pop();\n this.invokeComponentLayout(_vm.Register.s0);\n this.didRenderLayout(_vm.Register.s0);\n this.popFrame();\n this.popScope();\n this.popDynamicScope();\n this.commitComponentTransaction();\n }\n get pos() {\n return this.encoder.typePos;\n }\n get nextPos() {\n return this.encoder.size;\n }\n ///\n compileInline(sexp) {\n return this.compiler.compileInline(sexp, this);\n }\n compileBlock(name, params, hash, template, inverse) {\n this.compiler.compileBlock(name, params, hash, template, inverse, this);\n }\n label(name) {\n this.labels.label(name, this.nextPos);\n }\n // helpers\n get labels() {\n return this.labelsStack.current;\n }\n startLabels() {\n this.labelsStack.push(new Labels());\n }\n stopLabels() {\n let label = this.labelsStack.pop();\n label.patch(this.encoder);\n }\n // components\n pushCurriedComponent() {\n this.push(74 /* PushCurriedComponent */);\n }\n pushDynamicComponentInstance() {\n this.push(73 /* PushDynamicComponentInstance */);\n }\n // dom\n openDynamicElement() {\n this.push(34 /* OpenDynamicElement */);\n }\n flushElement() {\n this.push(38 /* FlushElement */);\n }\n closeElement() {\n this.push(39 /* CloseElement */);\n }\n // lists\n putIterator() {\n this.push(66 /* PutIterator */);\n }\n enterList(start) {\n this.reserve(64 /* EnterList */);\n this.labels.target(this.pos, start);\n }\n exitList() {\n this.push(65 /* ExitList */);\n }\n iterate(breaks) {\n this.reserve(67 /* Iterate */);\n this.labels.target(this.pos, breaks);\n }\n // expressions\n setNamedVariables(state) {\n this.push(2 /* SetNamedVariables */, state);\n }\n setBlocks(state) {\n this.push(3 /* SetBlocks */, state);\n }\n setVariable(symbol) {\n this.push(4 /* SetVariable */, symbol);\n }\n setBlock(symbol) {\n this.push(5 /* SetBlock */, symbol);\n }\n getVariable(symbol) {\n this.push(6 /* GetVariable */, symbol);\n }\n getBlock(symbol) {\n this.push(8 /* GetBlock */, symbol);\n }\n hasBlock(symbol) {\n this.push(9 /* HasBlock */, symbol);\n }\n concat(size) {\n this.push(11 /* Concat */, size);\n }\n load(register) {\n this.push(18 /* Load */, register);\n }\n fetch(register) {\n this.push(19 /* Fetch */, register);\n }\n dup(register = _vm.Register.sp, offset = 0) {\n return this.push(16 /* Dup */, register, offset);\n }\n pop(count = 1) {\n return this.push(17 /* Pop */, count);\n }\n // vm\n returnTo(label) {\n this.reserveMachine(25 /* ReturnTo */);\n this.labels.target(this.pos, label);\n }\n primitiveReference() {\n this.push(14 /* PrimitiveReference */);\n }\n reifyU32() {\n this.push(15 /* ReifyU32 */);\n }\n enter(args) {\n this.push(61 /* Enter */, args);\n }\n exit() {\n this.push(62 /* Exit */);\n }\n return() {\n this.pushMachine(24 /* Return */);\n }\n jump(target) {\n this.reserveMachine(52 /* Jump */);\n this.labels.target(this.pos, target);\n }\n jumpIf(target) {\n this.reserve(53 /* JumpIf */);\n this.labels.target(this.pos, target);\n }\n jumpUnless(target) {\n this.reserve(54 /* JumpUnless */);\n this.labels.target(this.pos, target);\n }\n jumpEq(value, target) {\n this.reserveWithOperand(55 /* JumpEq */, value);\n this.labels.target(this.pos, target);\n }\n assertSame() {\n this.push(56 /* AssertSame */);\n }\n pushEmptyArgs() {\n this.push(77 /* PushEmptyArgs */);\n }\n switch(_opcode, callback) {\n // Setup the switch DSL\n let clauses = [];\n let count = 0;\n function when(match, callback) {\n clauses.push({ match, callback, label: `CLAUSE${count++}` });\n }\n // Call the callback\n callback(when);\n // Emit the opcodes for the switch\n this.enter(2);\n this.assertSame();\n this.reifyU32();\n this.startLabels();\n // First, emit the jump opcodes. We don't need a jump for the last\n // opcode, since it bleeds directly into its clause.\n clauses.slice(0, -1).forEach(clause => this.jumpEq(clause.match, clause.label));\n // Enumerate the clauses in reverse order. Earlier matches will\n // require fewer checks.\n for (let i = clauses.length - 1; i >= 0; i--) {\n let clause = clauses[i];\n this.label(clause.label);\n this.pop(2);\n clause.callback();\n // The first match is special: it is placed directly before the END\n // label, so no additional jump is needed at the end of it.\n if (i !== 0) {\n this.jump('END');\n }\n }\n this.label('END');\n this.stopLabels();\n this.exit();\n }\n stdAppend(trusting) {\n this.switch(this.contentType(), when => {\n when(1 /* String */, () => {\n if (trusting) {\n this.assertSame();\n this.appendHTML();\n } else {\n this.appendText();\n }\n });\n when(0 /* Component */, () => {\n this.pushCurriedComponent();\n this.pushDynamicComponentInstance();\n this.invokeBareComponent();\n });\n when(3 /* SafeString */, () => {\n this.assertSame();\n this.appendSafeHTML();\n });\n when(4 /* Fragment */, () => {\n this.assertSame();\n this.appendDocumentFragment();\n });\n when(5 /* Node */, () => {\n this.assertSame();\n this.appendNode();\n });\n });\n }\n populateLayout(state) {\n this.push(89 /* PopulateLayout */, state);\n }\n invokeBareComponent() {\n this.fetch(_vm.Register.s0);\n this.dup(_vm.Register.sp, 1);\n this.load(_vm.Register.s0);\n this.pushFrame();\n this.pushEmptyArgs();\n this.prepareArgs(_vm.Register.s0);\n this.invokePreparedComponent(false, false, true, () => {\n this.getComponentLayout(_vm.Register.s0);\n this.populateLayout(_vm.Register.s0);\n });\n this.load(_vm.Register.s0);\n }\n isComponent() {\n this.push(69 /* IsComponent */);\n }\n contentType() {\n this.push(70 /* ContentType */);\n }\n pushBlockScope() {\n this.push(47 /* PushBlockScope */);\n }\n }\n class OpcodeBuilder extends StdOpcodeBuilder {\n constructor(compiler, containingLayout) {\n super(compiler, containingLayout ? containingLayout.block.symbols.length : 0);\n this.containingLayout = containingLayout;\n this.component = new ComponentBuilder(this);\n this.expressionCompiler = expressionCompiler();\n this.isComponentAttrs = false;\n this.constants = compiler.constants;\n this.stdLib = compiler.stdLib;\n }\n /// MECHANICS\n get referrer() {\n return this.containingLayout && this.containingLayout.referrer;\n }\n setComponentAttrs(enabled) {\n this.isComponentAttrs = enabled;\n }\n expr(expression) {\n if (Array.isArray(expression)) {\n this.expressionCompiler.compile(expression, this);\n } else {\n this.pushPrimitiveReference(expression);\n }\n }\n ///\n // args\n pushArgs(names, flags) {\n let serialized = this.constants.stringArray(names);\n this.push(76 /* PushArgs */, serialized, flags);\n }\n pushYieldableBlock(block) {\n this.pushSymbolTable(block && block.symbolTable);\n this.pushBlockScope();\n this.pushBlock(block);\n }\n curryComponent(definition,\n /* TODO: attrs: Option, */params, hash, synthetic) {\n let referrer = this.containingLayout.referrer;\n this.pushFrame();\n this.compileArgs(params, hash, null, synthetic);\n this.push(80 /* CaptureArgs */);\n this.expr(definition);\n this.push(71 /* CurryComponent */, this.constants.serializable(referrer));\n this.popFrame();\n this.fetch(_vm.Register.v0);\n }\n pushSymbolTable(table) {\n if (table) {\n let constant = this.constants.serializable(table);\n this.push(48 /* PushSymbolTable */, constant);\n } else {\n this.primitive(null);\n }\n }\n invokeComponent(capabilities, attrs, params, hash, synthetic, block, inverse = null, layout) {\n this.fetch(_vm.Register.s0);\n this.dup(_vm.Register.sp, 1);\n this.load(_vm.Register.s0);\n this.pushFrame();\n let bindableBlocks = !!(block || inverse || attrs);\n let bindableAtNames = capabilities === true || capabilities.prepareArgs || !!(hash && hash[0].length !== 0);\n let blocks = { main: block, else: inverse, attrs };\n this.compileArgs(params, hash, blocks, synthetic);\n this.prepareArgs(_vm.Register.s0);\n this.invokePreparedComponent(block !== null, bindableBlocks, bindableAtNames, () => {\n if (layout) {\n this.pushSymbolTable(layout.symbolTable);\n this.pushLayout(layout);\n this.resolveLayout();\n } else {\n this.getComponentLayout(_vm.Register.s0);\n }\n this.populateLayout(_vm.Register.s0);\n });\n this.load(_vm.Register.s0);\n }\n invokeStaticComponent(capabilities, layout, attrs, params, hash, synthetic, block, inverse = null) {\n let { symbolTable } = layout;\n let bailOut = symbolTable.hasEval || capabilities.prepareArgs;\n if (bailOut) {\n this.invokeComponent(capabilities, attrs, params, hash, synthetic, block, inverse, layout);\n return;\n }\n this.fetch(_vm.Register.s0);\n this.dup(_vm.Register.sp, 1);\n this.load(_vm.Register.s0);\n let { symbols } = symbolTable;\n if (capabilities.createArgs) {\n this.pushFrame();\n this.compileArgs(null, hash, null, synthetic);\n }\n this.beginComponentTransaction();\n if (capabilities.dynamicScope) {\n this.pushDynamicScope();\n }\n if (capabilities.createInstance) {\n this.createComponent(_vm.Register.s0, block !== null);\n }\n if (capabilities.createArgs) {\n this.popFrame();\n }\n this.pushFrame();\n this.registerComponentDestructor(_vm.Register.s0);\n let bindings = [];\n this.getComponentSelf(_vm.Register.s0);\n bindings.push({ symbol: 0, isBlock: false });\n for (let i = 0; i < symbols.length; i++) {\n let symbol = symbols[i];\n switch (symbol.charAt(0)) {\n case '&':\n let callerBlock = null;\n if (symbol === '&default') {\n callerBlock = block;\n } else if (symbol === '&inverse') {\n callerBlock = inverse;\n } else if (symbol === ATTRS_BLOCK) {\n callerBlock = attrs;\n } else {\n throw (0, _util.unreachable)();\n }\n if (callerBlock) {\n this.pushYieldableBlock(callerBlock);\n bindings.push({ symbol: i + 1, isBlock: true });\n } else {\n this.pushYieldableBlock(null);\n bindings.push({ symbol: i + 1, isBlock: true });\n }\n break;\n case '@':\n if (!hash) {\n break;\n }\n let [keys, values] = hash;\n let lookupName = symbol;\n if (synthetic) {\n lookupName = symbol.slice(1);\n }\n let index = keys.indexOf(lookupName);\n if (index !== -1) {\n this.expr(values[index]);\n bindings.push({ symbol: i + 1, isBlock: false });\n }\n break;\n }\n }\n this.pushRootScope(symbols.length + 1, !!(block || inverse || attrs));\n for (let i = bindings.length - 1; i >= 0; i--) {\n let { symbol, isBlock } = bindings[i];\n if (isBlock) {\n this.setBlock(symbol);\n } else {\n this.setVariable(symbol);\n }\n }\n this.invokeStatic(layout);\n if (capabilities.createInstance) {\n this.didRenderLayout(_vm.Register.s0);\n }\n this.popFrame();\n this.popScope();\n if (capabilities.dynamicScope) {\n this.popDynamicScope();\n }\n this.commitComponentTransaction();\n this.load(_vm.Register.s0);\n }\n dynamicComponent(definition, attrs, params, hash, synthetic, block, inverse = null) {\n this.replayable({\n args: () => {\n this.expr(definition);\n this.dup();\n return 2;\n },\n body: () => {\n this.jumpUnless('ELSE');\n this.resolveDynamicComponent(this.containingLayout.referrer);\n this.pushDynamicComponentInstance();\n this.invokeComponent(true, attrs, params, hash, synthetic, block, inverse);\n this.label('ELSE');\n }\n });\n }\n yield(to, params) {\n this.compileArgs(params, null, null, false);\n this.getBlock(to);\n this.resolveBlock();\n this.invokeYield();\n this.popScope();\n this.popFrame();\n }\n guardedAppend(expression, trusting) {\n this.pushFrame();\n this.expr(expression);\n this.pushMachine(50 /* InvokeStatic */, this.stdLib.getAppend(trusting));\n this.popFrame();\n }\n invokeStaticBlock(block, callerCount = 0) {\n let { parameters } = block.symbolTable;\n let calleeCount = parameters.length;\n let count = Math.min(callerCount, calleeCount);\n this.pushFrame();\n if (count) {\n this.pushChildScope();\n for (let i = 0; i < count; i++) {\n this.dup(_vm.Register.fp, callerCount - i);\n this.setVariable(parameters[i]);\n }\n }\n this.pushBlock(block);\n this.resolveBlock();\n this.invokeVirtual();\n if (count) {\n this.popScope();\n }\n this.popFrame();\n }\n /// CONVENIENCE\n // internal helpers\n string(_string) {\n return this.constants.string(_string);\n }\n names(_names) {\n let names = [];\n for (let i = 0; i < _names.length; i++) {\n let n = _names[i];\n names[i] = this.constants.string(n);\n }\n return this.constants.array(names);\n }\n symbols(symbols) {\n return this.constants.array(symbols);\n }\n // vm\n primitive(_primitive) {\n let type = 0 /* NUMBER */;\n let primitive;\n switch (typeof _primitive) {\n case 'number':\n if (_primitive % 1 === 0) {\n if (_primitive > -1) {\n primitive = _primitive;\n } else {\n primitive = this.constants.number(_primitive);\n type = 4 /* NEGATIVE */;\n }\n } else {\n primitive = this.constants.number(_primitive);\n type = 1 /* FLOAT */;\n }\n break;\n case 'string':\n primitive = this.string(_primitive);\n type = 2 /* STRING */;\n break;\n case 'boolean':\n primitive = _primitive | 0;\n type = 3 /* BOOLEAN_OR_VOID */;\n break;\n case 'object':\n // assume null\n primitive = 2;\n type = 3 /* BOOLEAN_OR_VOID */;\n break;\n case 'undefined':\n primitive = 3;\n type = 3 /* BOOLEAN_OR_VOID */;\n break;\n default:\n throw new Error('Invalid primitive passed to pushPrimitive');\n }\n let immediate = this.sizeImmediate(primitive << 3 | type, primitive);\n this.push(13 /* Primitive */, immediate);\n }\n sizeImmediate(shifted, primitive) {\n if (shifted >= 65535 /* MAX_SIZE */ || shifted < 0) {\n return this.constants.number(primitive) << 3 | 5 /* BIG_NUM */;\n }\n return shifted;\n }\n pushPrimitiveReference(primitive) {\n this.primitive(primitive);\n this.primitiveReference();\n }\n // components\n pushComponentDefinition(handle) {\n this.push(72 /* PushComponentDefinition */, this.constants.handle(handle));\n }\n resolveDynamicComponent(referrer) {\n this.push(75 /* ResolveDynamicComponent */, this.constants.serializable(referrer));\n }\n staticComponentHelper(tag, hash, template) {\n let { handle, capabilities, compilable } = this.compiler.resolveLayoutForTag(tag, this.referrer);\n if (handle !== null && capabilities !== null) {\n if (compilable) {\n if (hash) {\n for (let i = 0; i < hash.length; i = i + 2) {\n hash[i][0] = `@${hash[i][0]}`;\n }\n }\n this.pushComponentDefinition(handle);\n this.invokeStaticComponent(capabilities, compilable, null, null, hash, false, template && template);\n return true;\n }\n }\n return false;\n }\n // partial\n invokePartial(referrer, symbols, evalInfo) {\n let _meta = this.constants.serializable(referrer);\n let _symbols = this.constants.stringArray(symbols);\n let _evalInfo = this.constants.array(evalInfo);\n this.push(95 /* InvokePartial */, _meta, _symbols, _evalInfo);\n }\n resolveMaybeLocal(name) {\n this.push(96 /* ResolveMaybeLocal */, this.string(name));\n }\n // debugger\n debugger(symbols, evalInfo) {\n this.push(97 /* Debugger */, this.constants.stringArray(symbols), this.constants.array(evalInfo));\n }\n // dom\n text(text) {\n this.push(26 /* Text */, this.constants.string(text));\n }\n openPrimitiveElement(tag) {\n this.push(33 /* OpenElement */, this.constants.string(tag));\n }\n modifier(locator, params, hash) {\n this.pushFrame();\n this.compileArgs(params, hash, null, true);\n this.push(40 /* Modifier */, this.constants.handle(locator));\n this.popFrame();\n }\n comment(_comment) {\n let comment = this.constants.string(_comment);\n this.push(27 /* Comment */, comment);\n }\n dynamicAttr(_name, _namespace, trusting) {\n let name = this.constants.string(_name);\n let namespace = _namespace ? this.constants.string(_namespace) : 0;\n if (this.isComponentAttrs) {\n this.push(37 /* ComponentAttr */, name, trusting === true ? 1 : 0, namespace);\n } else {\n this.push(36 /* DynamicAttr */, name, trusting === true ? 1 : 0, namespace);\n }\n }\n staticAttr(_name, _namespace, _value) {\n let name = this.constants.string(_name);\n let namespace = _namespace ? this.constants.string(_namespace) : 0;\n if (this.isComponentAttrs) {\n this.pushPrimitiveReference(_value);\n this.push(37 /* ComponentAttr */, name, 1, namespace);\n } else {\n let value = this.constants.string(_value);\n this.push(35 /* StaticAttr */, name, value, namespace);\n }\n }\n // expressions\n hasBlockParams(to) {\n this.getBlock(to);\n this.resolveBlock();\n this.push(10 /* HasBlockParams */);\n }\n getProperty(key) {\n this.push(7 /* GetProperty */, this.string(key));\n }\n helper(helper, params, hash) {\n this.pushFrame();\n this.compileArgs(params, hash, null, true);\n this.push(1 /* Helper */, this.constants.handle(helper));\n this.popFrame();\n this.fetch(_vm.Register.v0);\n }\n bindDynamicScope(_names) {\n this.push(43 /* BindDynamicScope */, this.names(_names));\n }\n // convenience methods\n /**\n * A convenience for pushing some arguments on the stack and\n * running some code if the code needs to be re-executed during\n * updating execution if some of the arguments have changed.\n *\n * # Initial Execution\n *\n * The `args` function should push zero or more arguments onto\n * the stack and return the number of arguments pushed.\n *\n * The `body` function provides the instructions to execute both\n * during initial execution and during updating execution.\n *\n * Internally, this function starts by pushing a new frame, so\n * that the body can return and sets the return point ($ra) to\n * the ENDINITIAL label.\n *\n * It then executes the `args` function, which adds instructions\n * responsible for pushing the arguments for the block to the\n * stack. These arguments will be restored to the stack before\n * updating execution.\n *\n * Next, it adds the Enter opcode, which marks the current position\n * in the DOM, and remembers the current $pc (the next instruction)\n * as the first instruction to execute during updating execution.\n *\n * Next, it runs `body`, which adds the opcodes that should\n * execute both during initial execution and during updating execution.\n * If the `body` wishes to finish early, it should Jump to the\n * `FINALLY` label.\n *\n * Next, it adds the FINALLY label, followed by:\n *\n * - the Exit opcode, which finalizes the marked DOM started by the\n * Enter opcode.\n * - the Return opcode, which returns to the current return point\n * ($ra).\n *\n * Finally, it adds the ENDINITIAL label followed by the PopFrame\n * instruction, which restores $fp, $sp and $ra.\n *\n * # Updating Execution\n *\n * Updating execution for this `replayable` occurs if the `body` added an\n * assertion, via one of the `JumpIf`, `JumpUnless` or `AssertSame` opcodes.\n *\n * If, during updating executon, the assertion fails, the initial VM is\n * restored, and the stored arguments are pushed onto the stack. The DOM\n * between the starting and ending markers is cleared, and the VM's cursor\n * is set to the area just cleared.\n *\n * The return point ($ra) is set to -1, the exit instruction.\n *\n * Finally, the $pc is set to to the instruction saved off by the\n * Enter opcode during initial execution, and execution proceeds as\n * usual.\n *\n * The only difference is that when a `Return` instruction is\n * encountered, the program jumps to -1 rather than the END label,\n * and the PopFrame opcode is not needed.\n */\n replayable({ args, body }) {\n // Start a new label frame, to give END and RETURN\n // a unique meaning.\n this.startLabels();\n this.pushFrame();\n // If the body invokes a block, its return will return to\n // END. Otherwise, the return in RETURN will return to END.\n this.returnTo('ENDINITIAL');\n // Push the arguments onto the stack. The args() function\n // tells us how many stack elements to retain for re-execution\n // when updating.\n let count = args();\n // Start a new updating closure, remembering `count` elements\n // from the stack. Everything after this point, and before END,\n // will execute both initially and to update the block.\n //\n // The enter and exit opcodes also track the area of the DOM\n // associated with this block. If an assertion inside the block\n // fails (for example, the test value changes from true to false\n // in an #if), the DOM is cleared and the program is re-executed,\n // restoring `count` elements to the stack and executing the\n // instructions between the enter and exit.\n this.enter(count);\n // Evaluate the body of the block. The body of the block may\n // return, which will jump execution to END during initial\n // execution, and exit the updating routine.\n body();\n // All execution paths in the body should run the FINALLY once\n // they are done. It is executed both during initial execution\n // and during updating execution.\n this.label('FINALLY');\n // Finalize the DOM.\n this.exit();\n // In initial execution, this is a noop: it returns to the\n // immediately following opcode. In updating execution, this\n // exits the updating routine.\n this.return();\n // Cleanup code for the block. Runs on initial execution\n // but not on updating.\n this.label('ENDINITIAL');\n this.popFrame();\n this.stopLabels();\n }\n /**\n * A specialized version of the `replayable` convenience that allows the\n * caller to provide different code based upon whether the item at\n * the top of the stack is true or false.\n *\n * As in `replayable`, the `ifTrue` and `ifFalse` code can invoke `return`.\n *\n * During the initial execution, a `return` will continue execution\n * in the cleanup code, which finalizes the current DOM block and pops\n * the current frame.\n *\n * During the updating execution, a `return` will exit the updating\n * routine, as it can reuse the DOM block and is always only a single\n * frame deep.\n */\n replayableIf({ args, ifTrue, ifFalse }) {\n this.replayable({\n args,\n body: () => {\n // If the conditional is false, jump to the ELSE label.\n this.jumpUnless('ELSE');\n // Otherwise, execute the code associated with the true branch.\n ifTrue();\n // We're done, so return. In the initial execution, this runs\n // the cleanup code. In the updating VM, it exits the updating\n // routine.\n this.jump('FINALLY');\n this.label('ELSE');\n // If the conditional is false, and code associatied ith the\n // false branch was provided, execute it. If there was no code\n // associated with the false branch, jumping to the else statement\n // has no other behavior.\n if (ifFalse) {\n ifFalse();\n }\n }\n });\n }\n inlineBlock(block) {\n return new CompilableBlock(this.compiler, {\n block,\n containingLayout: this.containingLayout\n });\n }\n evalSymbols() {\n let { containingLayout: { block } } = this;\n return block.hasEval ? block.symbols : null;\n }\n compileParams(params) {\n if (!params) return 0;\n for (let i = 0; i < params.length; i++) {\n this.expr(params[i]);\n }\n return params.length;\n }\n compileArgs(params, hash, blocks, synthetic) {\n if (blocks) {\n this.pushYieldableBlock(blocks.main);\n this.pushYieldableBlock(blocks.else);\n this.pushYieldableBlock(blocks.attrs);\n }\n let count = this.compileParams(params);\n let flags = count << 4;\n if (synthetic) flags |= 0b1000;\n if (blocks) {\n flags |= 0b111;\n }\n let names = _util.EMPTY_ARRAY;\n if (hash) {\n names = hash[0];\n let val = hash[1];\n for (let i = 0; i < val.length; i++) {\n this.expr(val[i]);\n }\n }\n this.pushArgs(names, flags);\n }\n template(block) {\n if (!block) return null;\n return this.inlineBlock(block);\n }\n }\n class LazyOpcodeBuilder extends OpcodeBuilder {\n pushBlock(block) {\n if (block) {\n this.pushOther(block);\n } else {\n this.primitive(null);\n }\n }\n resolveBlock() {\n this.push(46 /* CompileBlock */);\n }\n pushLayout(layout) {\n if (layout) {\n this.pushOther(layout);\n } else {\n this.primitive(null);\n }\n }\n resolveLayout() {\n this.push(46 /* CompileBlock */);\n }\n invokeStatic(compilable) {\n this.pushOther(compilable);\n this.push(46 /* CompileBlock */);\n this.pushMachine(49 /* InvokeVirtual */);\n }\n pushOther(value) {\n this.push(12 /* Constant */, this.other(value));\n }\n other(value) {\n return this.constants.other(value);\n }\n }\n class EagerOpcodeBuilder extends OpcodeBuilder {\n pushBlock(block) {\n let handle = block ? block.compile() : null;\n this.primitive(handle);\n }\n resolveBlock() {\n return;\n }\n pushLayout(layout) {\n if (layout) {\n this.primitive(layout.compile());\n } else {\n this.primitive(null);\n }\n }\n resolveLayout() {}\n invokeStatic(compilable) {\n let handle = compilable.compile();\n // If the handle for the invoked component is not yet known (for example,\n // because this is a recursive invocation and we're still compiling), push a\n // function that will produce the correct handle when the heap is\n // serialized.\n if (handle === PLACEHOLDER_HANDLE$1) {\n this.pushMachine(50 /* InvokeStatic */, () => compilable.compile());\n } else {\n this.pushMachine(50 /* InvokeStatic */, handle);\n }\n }\n }\n\n class LazyCompiler extends AbstractCompiler {\n // FIXME: turn to static method\n constructor(lookup, resolver, macros) {\n let constants = new _program.LazyConstants(resolver);\n let program = new _program.Program(constants);\n super(macros, program, lookup);\n }\n builderFor(containingLayout) {\n return new LazyOpcodeBuilder(this, containingLayout);\n }\n }\n\n class PartialDefinition {\n constructor(name, // for debugging\n template) {\n this.name = name;\n this.template = template;\n }\n getPartial() {\n let partial = this.template.asPartial();\n let handle = partial.compile();\n return { symbolTable: partial.symbolTable, handle };\n }\n }\n\n let clientId = 0;\n function templateFactory({ id: templateId, meta, block }) {\n let parsedBlock;\n let id = templateId || `client-${clientId++}`;\n let create = (compiler, envMeta) => {\n let newMeta = envMeta ? (0, _util.assign)({}, envMeta, meta) : meta;\n if (!parsedBlock) {\n parsedBlock = JSON.parse(block);\n }\n return new TemplateImpl(compiler, { id, block: parsedBlock, referrer: newMeta });\n };\n return { id, meta, create };\n }\n class TemplateImpl {\n constructor(compiler, parsedLayout) {\n this.compiler = compiler;\n this.parsedLayout = parsedLayout;\n this.layout = null;\n this.partial = null;\n this.wrappedLayout = null;\n let { block } = parsedLayout;\n this.symbols = block.symbols;\n this.hasEval = block.hasEval;\n this.referrer = parsedLayout.referrer;\n this.id = parsedLayout.id || `client-${clientId++}`;\n }\n asLayout() {\n if (this.layout) return this.layout;\n return this.layout = new CompilableProgram(this.compiler, Object.assign({}, this.parsedLayout, { asPartial: false }));\n }\n asPartial() {\n if (this.partial) return this.partial;\n return this.layout = new CompilableProgram(this.compiler, Object.assign({}, this.parsedLayout, { asPartial: true }));\n }\n asWrappedLayout() {\n if (this.wrappedLayout) return this.wrappedLayout;\n return this.wrappedLayout = new WrappedBuilder(this.compiler, Object.assign({}, this.parsedLayout, { asPartial: false }));\n }\n }\n\n exports.ATTRS_BLOCK = ATTRS_BLOCK;\n exports.Macros = Macros;\n exports.LazyCompiler = LazyCompiler;\n exports.compile = compile;\n exports.AbstractCompiler = AbstractCompiler;\n exports.debugCompiler = debugCompiler;\n exports.CompilableBlock = CompilableBlock;\n exports.CompilableProgram = CompilableProgram;\n exports.LazyOpcodeBuilder = LazyOpcodeBuilder;\n exports.EagerOpcodeBuilder = EagerOpcodeBuilder;\n exports.OpcodeBuilder = OpcodeBuilder;\n exports.StdOpcodeBuilder = StdOpcodeBuilder;\n exports.PartialDefinition = PartialDefinition;\n exports.templateFactory = templateFactory;\n exports.debug = debug;\n exports.debugSlice = debugSlice;\n exports.logOpcode = logOpcode;\n exports.WrappedBuilder = WrappedBuilder;\n exports.PLACEHOLDER_HANDLE = PLACEHOLDER_HANDLE;\n});","enifed('@glimmer/program', ['exports', '@glimmer/util'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.Opcode = exports.Program = exports.RuntimeProgram = exports.WriteOnlyProgram = exports.Heap = exports.LazyConstants = exports.Constants = exports.RuntimeConstants = exports.WriteOnlyConstants = exports.WELL_KNOWN_EMPTY_ARRAY_POSITION = undefined;\n\n\n const UNRESOLVED = {};\n const WELL_KNOWN_EMPTY_ARRAY_POSITION = 0;\n const WELL_KNOW_EMPTY_ARRAY = Object.freeze([]);\n class WriteOnlyConstants {\n constructor() {\n // `0` means NULL\n this.strings = [];\n this.arrays = [WELL_KNOW_EMPTY_ARRAY];\n this.tables = [];\n this.handles = [];\n this.resolved = [];\n this.numbers = [];\n }\n string(value) {\n let index = this.strings.indexOf(value);\n if (index > -1) {\n return index;\n }\n return this.strings.push(value) - 1;\n }\n stringArray(strings) {\n let _strings = new Array(strings.length);\n for (let i = 0; i < strings.length; i++) {\n _strings[i] = this.string(strings[i]);\n }\n return this.array(_strings);\n }\n array(values) {\n if (values.length === 0) {\n return WELL_KNOWN_EMPTY_ARRAY_POSITION;\n }\n let index = this.arrays.indexOf(values);\n if (index > -1) {\n return index;\n }\n return this.arrays.push(values) - 1;\n }\n handle(handle) {\n let index = this.handles.indexOf(handle);\n if (index > -1) {\n return index;\n }\n this.resolved.push(UNRESOLVED);\n return this.handles.push(handle) - 1;\n }\n serializable(value) {\n let str = JSON.stringify(value);\n let index = this.strings.indexOf(str);\n if (index > -1) {\n return index;\n }\n return this.strings.push(str) - 1;\n }\n number(number) {\n let index = this.numbers.indexOf(number);\n if (index > -1) {\n return index;\n }\n return this.numbers.push(number) - 1;\n }\n toPool() {\n return {\n strings: this.strings,\n arrays: this.arrays,\n handles: this.handles,\n numbers: this.numbers\n };\n }\n }\n class RuntimeConstants {\n constructor(resolver, pool) {\n this.resolver = resolver;\n this.strings = pool.strings;\n this.arrays = pool.arrays;\n this.handles = pool.handles;\n this.resolved = this.handles.map(() => UNRESOLVED);\n this.numbers = pool.numbers;\n }\n getString(value) {\n return this.strings[value];\n }\n getNumber(value) {\n return this.numbers[value];\n }\n getStringArray(value) {\n let names = this.getArray(value);\n let _names = new Array(names.length);\n for (let i = 0; i < names.length; i++) {\n let n = names[i];\n _names[i] = this.getString(n);\n }\n return _names;\n }\n getArray(value) {\n return this.arrays[value];\n }\n resolveHandle(index) {\n let resolved = this.resolved[index];\n if (resolved === UNRESOLVED) {\n let handle = this.handles[index];\n resolved = this.resolved[index] = this.resolver.resolve(handle);\n }\n return resolved;\n }\n getSerializable(s) {\n return JSON.parse(this.strings[s]);\n }\n }\n class Constants extends WriteOnlyConstants {\n constructor(resolver, pool) {\n super();\n this.resolver = resolver;\n if (pool) {\n this.strings = pool.strings;\n this.arrays = pool.arrays;\n this.handles = pool.handles;\n this.resolved = this.handles.map(() => UNRESOLVED);\n this.numbers = pool.numbers;\n }\n }\n getNumber(value) {\n return this.numbers[value];\n }\n getString(value) {\n return this.strings[value];\n }\n getStringArray(value) {\n let names = this.getArray(value);\n let _names = new Array(names.length);\n for (let i = 0; i < names.length; i++) {\n let n = names[i];\n _names[i] = this.getString(n);\n }\n return _names;\n }\n getArray(value) {\n return this.arrays[value];\n }\n resolveHandle(index) {\n let resolved = this.resolved[index];\n if (resolved === UNRESOLVED) {\n let handle = this.handles[index];\n resolved = this.resolved[index] = this.resolver.resolve(handle);\n }\n return resolved;\n }\n getSerializable(s) {\n return JSON.parse(this.strings[s]);\n }\n }\n class LazyConstants extends Constants {\n constructor() {\n super(...arguments);\n this.others = [];\n this.serializables = [];\n }\n serializable(value) {\n let index = this.serializables.indexOf(value);\n if (index > -1) {\n return index;\n }\n return this.serializables.push(value) - 1;\n }\n getSerializable(s) {\n return this.serializables[s];\n }\n getOther(value) {\n return this.others[value - 1];\n }\n other(other) {\n return this.others.push(other);\n }\n }\n\n class Opcode {\n constructor(heap) {\n this.heap = heap;\n this.offset = 0;\n }\n get size() {\n let rawType = this.heap.getbyaddr(this.offset);\n return ((rawType & 768 /* OPERAND_LEN_MASK */) >> 8 /* ARG_SHIFT */) + 1;\n }\n get isMachine() {\n let rawType = this.heap.getbyaddr(this.offset);\n return rawType & 1024 /* MACHINE_MASK */;\n }\n get type() {\n return this.heap.getbyaddr(this.offset) & 255 /* TYPE_MASK */;\n }\n get op1() {\n return this.heap.getbyaddr(this.offset + 1);\n }\n get op2() {\n return this.heap.getbyaddr(this.offset + 2);\n }\n get op3() {\n return this.heap.getbyaddr(this.offset + 3);\n }\n }\n\n function encodeTableInfo(size, scopeSize, state) {\n return size | scopeSize << 16 | state << 30;\n }\n function changeState(info, newState) {\n return info | newState << 30;\n }\n const PAGE_SIZE = 0x100000;\n /**\n * The Heap is responsible for dynamically allocating\n * memory in which we read/write the VM's instructions\n * from/to. When we malloc we pass out a VMHandle, which\n * is used as an indirect way of accessing the memory during\n * execution of the VM. Internally we track the different\n * regions of the memory in an int array known as the table.\n *\n * The table 32-bit aligned and has the following layout:\n *\n * | ... | hp (u32) | info (u32) |\n * | ... | Handle | Size | Scope Size | State |\n * | ... | 32-bits | 16b | 14b | 2b |\n *\n * With this information we effectively have the ability to\n * control when we want to free memory. That being said you\n * can not free during execution as raw address are only\n * valid during the execution. This means you cannot close\n * over them as you will have a bad memory access exception.\n */\n class Heap {\n constructor(serializedHeap) {\n this.placeholders = [];\n this.offset = 0;\n this.handle = 0;\n this.capacity = PAGE_SIZE;\n if (serializedHeap) {\n let { buffer, table, handle } = serializedHeap;\n this.heap = new Uint16Array(buffer);\n this.table = table;\n this.offset = this.heap.length;\n this.handle = handle;\n this.capacity = 0;\n } else {\n this.heap = new Uint16Array(PAGE_SIZE);\n this.table = [];\n }\n }\n push(item) {\n this.sizeCheck();\n this.heap[this.offset++] = item;\n }\n sizeCheck() {\n if (this.capacity === 0) {\n let heap = slice(this.heap, 0, this.offset);\n this.heap = new Uint16Array(heap.length + PAGE_SIZE);\n this.heap.set(heap, 0);\n this.capacity = PAGE_SIZE;\n }\n this.capacity--;\n }\n getbyaddr(address) {\n return this.heap[address];\n }\n setbyaddr(address, value) {\n this.heap[address] = value;\n }\n malloc() {\n this.table.push(this.offset, 0);\n let handle = this.handle;\n this.handle += 2 /* ENTRY_SIZE */;\n return handle;\n }\n finishMalloc(handle, scopeSize) {\n let start = this.table[handle];\n let finish = this.offset;\n let instructionSize = finish - start;\n let info = encodeTableInfo(instructionSize, scopeSize, 0 /* Allocated */);\n this.table[handle + 1 /* INFO_OFFSET */] = info;\n }\n size() {\n return this.offset;\n }\n // It is illegal to close over this address, as compaction\n // may move it. However, it is legal to use this address\n // multiple times between compactions.\n getaddr(handle) {\n return this.table[handle];\n }\n gethandle(address) {\n this.table.push(address, encodeTableInfo(0, 0, 3 /* Pointer */));\n let handle = this.handle;\n this.handle += 2 /* ENTRY_SIZE */;\n return handle;\n }\n sizeof(handle) {\n return -1;\n }\n scopesizeof(handle) {\n let info = this.table[handle + 1 /* INFO_OFFSET */];\n return (info & 1073676288 /* SCOPE_MASK */) >> 16;\n }\n free(handle) {\n let info = this.table[handle + 1 /* INFO_OFFSET */];\n this.table[handle + 1 /* INFO_OFFSET */] = changeState(info, 1 /* Freed */);\n }\n /**\n * The heap uses the [Mark-Compact Algorithm](https://en.wikipedia.org/wiki/Mark-compact_algorithm) to shift\n * reachable memory to the bottom of the heap and freeable\n * memory to the top of the heap. When we have shifted all\n * the reachable memory to the top of the heap, we move the\n * offset to the next free position.\n */\n compact() {\n let compactedSize = 0;\n let { table, table: { length }, heap } = this;\n for (let i = 0; i < length; i += 2 /* ENTRY_SIZE */) {\n let offset = table[i];\n let info = table[i + 1 /* INFO_OFFSET */];\n let size = info & 65535 /* SIZE_MASK */;\n let state = info & 3221225472 /* STATE_MASK */ >> 30;\n if (state === 2 /* Purged */) {\n continue;\n } else if (state === 1 /* Freed */) {\n // transition to \"already freed\" aka \"purged\"\n // a good improvement would be to reuse\n // these slots\n table[i + 1 /* INFO_OFFSET */] = changeState(info, 2 /* Purged */);\n compactedSize += size;\n } else if (state === 0 /* Allocated */) {\n for (let j = offset; j <= i + size; j++) {\n heap[j - compactedSize] = heap[j];\n }\n table[i] = offset - compactedSize;\n } else if (state === 3 /* Pointer */) {\n table[i] = offset - compactedSize;\n }\n }\n this.offset = this.offset - compactedSize;\n }\n pushPlaceholder(valueFunc) {\n this.sizeCheck();\n let address = this.offset++;\n this.heap[address] = 65535 /* MAX_SIZE */;\n this.placeholders.push([address, valueFunc]);\n }\n patchPlaceholders() {\n let { placeholders } = this;\n for (let i = 0; i < placeholders.length; i++) {\n let [address, getValue] = placeholders[i];\n\n this.setbyaddr(address, getValue());\n }\n }\n capture(offset = this.offset) {\n this.patchPlaceholders();\n // Only called in eager mode\n let buffer = slice(this.heap, 0, offset).buffer;\n return {\n handle: this.handle,\n table: this.table,\n buffer: buffer\n };\n }\n }\n class WriteOnlyProgram {\n constructor(constants = new WriteOnlyConstants(), heap = new Heap()) {\n this.constants = constants;\n this.heap = heap;\n this._opcode = new Opcode(this.heap);\n }\n opcode(offset) {\n this._opcode.offset = offset;\n return this._opcode;\n }\n }\n class RuntimeProgram {\n constructor(constants, heap) {\n this.constants = constants;\n this.heap = heap;\n this._opcode = new Opcode(this.heap);\n }\n static hydrate(rawHeap, pool, resolver) {\n let heap = new Heap(rawHeap);\n let constants = new RuntimeConstants(resolver, pool);\n return new RuntimeProgram(constants, heap);\n }\n opcode(offset) {\n this._opcode.offset = offset;\n return this._opcode;\n }\n }\n class Program extends WriteOnlyProgram {}\n function slice(arr, start, end) {\n if (arr.slice !== undefined) {\n return arr.slice(start, end);\n }\n let ret = new Uint16Array(end);\n for (; start < end; start++) {\n ret[start] = arr[start];\n }\n return ret;\n }\n\n exports.WELL_KNOWN_EMPTY_ARRAY_POSITION = WELL_KNOWN_EMPTY_ARRAY_POSITION;\n exports.WriteOnlyConstants = WriteOnlyConstants;\n exports.RuntimeConstants = RuntimeConstants;\n exports.Constants = Constants;\n exports.LazyConstants = LazyConstants;\n exports.Heap = Heap;\n exports.WriteOnlyProgram = WriteOnlyProgram;\n exports.RuntimeProgram = RuntimeProgram;\n exports.Program = Program;\n exports.Opcode = Opcode;\n});","enifed('@glimmer/reference', ['exports', '@glimmer/util'], function (exports, _util) {\n 'use strict';\n\n exports.__esModule = true;\n exports.isModified = exports.ReferenceCache = exports.map = exports.CachedReference = exports.UpdatableTag = exports.CachedTag = exports.combine = exports.combineSlice = exports.combineTagged = exports.DirtyableTag = exports.bump = exports.isConstTag = exports.isConst = exports.CURRENT_TAG = exports.VOLATILE_TAG = exports.CONSTANT_TAG = exports.TagWrapper = exports.RevisionTag = exports.VOLATILE = exports.INITIAL = exports.CONSTANT = exports.IteratorSynchronizer = exports.ReferenceIterator = exports.IterationArtifacts = exports.ListItem = exports.ConstReference = undefined;\n\n\n const CONSTANT = 0;\n const INITIAL = 1;\n const VOLATILE = NaN;\n class RevisionTag {\n validate(snapshot) {\n return this.value() === snapshot;\n }\n }\n RevisionTag.id = 0;\n const VALUE = [];\n const VALIDATE = [];\n class TagWrapper {\n constructor(type, inner) {\n this.type = type;\n this.inner = inner;\n }\n value() {\n let func = VALUE[this.type];\n return func(this.inner);\n }\n validate(snapshot) {\n let func = VALIDATE[this.type];\n return func(this.inner, snapshot);\n }\n }\n function register(Type) {\n let type = VALUE.length;\n VALUE.push(tag => tag.value());\n VALIDATE.push((tag, snapshot) => tag.validate(snapshot));\n Type.id = type;\n }\n ///\n // CONSTANT: 0\n VALUE.push(() => CONSTANT);\n VALIDATE.push((_tag, snapshot) => snapshot === CONSTANT);\n const CONSTANT_TAG = new TagWrapper(0, null);\n // VOLATILE: 1\n VALUE.push(() => VOLATILE);\n VALIDATE.push((_tag, snapshot) => snapshot === VOLATILE);\n const VOLATILE_TAG = new TagWrapper(1, null);\n // CURRENT: 2\n VALUE.push(() => $REVISION);\n VALIDATE.push((_tag, snapshot) => snapshot === $REVISION);\n const CURRENT_TAG = new TagWrapper(2, null);\n function isConst({ tag }) {\n return tag === CONSTANT_TAG;\n }\n function isConstTag(tag) {\n return tag === CONSTANT_TAG;\n }\n ///\n let $REVISION = INITIAL;\n function bump() {\n $REVISION++;\n }\n class DirtyableTag extends RevisionTag {\n static create(revision = $REVISION) {\n return new TagWrapper(this.id, new DirtyableTag(revision));\n }\n constructor(revision = $REVISION) {\n super();\n this.revision = revision;\n }\n value() {\n return this.revision;\n }\n dirty() {\n this.revision = ++$REVISION;\n }\n }\n register(DirtyableTag);\n function combineTagged(tagged) {\n let optimized = [];\n for (let i = 0, l = tagged.length; i < l; i++) {\n let tag = tagged[i].tag;\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag === CONSTANT_TAG) continue;\n optimized.push(tag);\n }\n return _combine(optimized);\n }\n function combineSlice(slice) {\n let optimized = [];\n let node = slice.head();\n while (node !== null) {\n let tag = node.tag;\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag !== CONSTANT_TAG) optimized.push(tag);\n node = slice.nextNode(node);\n }\n return _combine(optimized);\n }\n function combine(tags) {\n let optimized = [];\n for (let i = 0, l = tags.length; i < l; i++) {\n let tag = tags[i];\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag === CONSTANT_TAG) continue;\n optimized.push(tag);\n }\n return _combine(optimized);\n }\n function _combine(tags) {\n switch (tags.length) {\n case 0:\n return CONSTANT_TAG;\n case 1:\n return tags[0];\n case 2:\n return TagsPair.create(tags[0], tags[1]);\n default:\n return TagsCombinator.create(tags);\n }\n }\n class CachedTag extends RevisionTag {\n constructor() {\n super(...arguments);\n this.lastChecked = null;\n this.lastValue = null;\n }\n value() {\n let { lastChecked, lastValue } = this;\n if (lastChecked !== $REVISION) {\n this.lastChecked = $REVISION;\n this.lastValue = lastValue = this.compute();\n }\n return this.lastValue;\n }\n invalidate() {\n this.lastChecked = null;\n }\n }\n class TagsPair extends CachedTag {\n static create(first, second) {\n return new TagWrapper(this.id, new TagsPair(first, second));\n }\n constructor(first, second) {\n super();\n this.first = first;\n this.second = second;\n }\n compute() {\n return Math.max(this.first.value(), this.second.value());\n }\n }\n register(TagsPair);\n class TagsCombinator extends CachedTag {\n static create(tags) {\n return new TagWrapper(this.id, new TagsCombinator(tags));\n }\n constructor(tags) {\n super();\n this.tags = tags;\n }\n compute() {\n let { tags } = this;\n let max = -1;\n for (let i = 0; i < tags.length; i++) {\n let value = tags[i].value();\n max = Math.max(value, max);\n }\n return max;\n }\n }\n register(TagsCombinator);\n class UpdatableTag extends CachedTag {\n static create(tag) {\n return new TagWrapper(this.id, new UpdatableTag(tag));\n }\n constructor(tag) {\n super();\n this.tag = tag;\n this.lastUpdated = INITIAL;\n }\n compute() {\n return Math.max(this.lastUpdated, this.tag.value());\n }\n update(tag) {\n if (tag !== this.tag) {\n this.tag = tag;\n this.lastUpdated = $REVISION;\n this.invalidate();\n }\n }\n }\n register(UpdatableTag);\n class CachedReference {\n constructor() {\n this.lastRevision = null;\n this.lastValue = null;\n }\n value() {\n let { tag, lastRevision, lastValue } = this;\n if (lastRevision === null || !tag.validate(lastRevision)) {\n lastValue = this.lastValue = this.compute();\n this.lastRevision = tag.value();\n }\n return lastValue;\n }\n invalidate() {\n this.lastRevision = null;\n }\n }\n class MapperReference extends CachedReference {\n constructor(reference, mapper) {\n super();\n this.tag = reference.tag;\n this.reference = reference;\n this.mapper = mapper;\n }\n compute() {\n let { reference, mapper } = this;\n return mapper(reference.value());\n }\n }\n function map(reference, mapper) {\n return new MapperReference(reference, mapper);\n }\n //////////\n class ReferenceCache {\n constructor(reference) {\n this.lastValue = null;\n this.lastRevision = null;\n this.initialized = false;\n this.tag = reference.tag;\n this.reference = reference;\n }\n peek() {\n if (!this.initialized) {\n return this.initialize();\n }\n return this.lastValue;\n }\n revalidate() {\n if (!this.initialized) {\n return this.initialize();\n }\n let { reference, lastRevision } = this;\n let tag = reference.tag;\n if (tag.validate(lastRevision)) return NOT_MODIFIED;\n this.lastRevision = tag.value();\n let { lastValue } = this;\n let value = reference.value();\n if (value === lastValue) return NOT_MODIFIED;\n this.lastValue = value;\n return value;\n }\n initialize() {\n let { reference } = this;\n let value = this.lastValue = reference.value();\n this.lastRevision = reference.tag.value();\n this.initialized = true;\n return value;\n }\n }\n const NOT_MODIFIED = 'adb3b78e-3d22-4e4b-877a-6317c2c5c145';\n function isModified(value) {\n return value !== NOT_MODIFIED;\n }\n\n class ConstReference {\n constructor(inner) {\n this.inner = inner;\n this.tag = CONSTANT_TAG;\n }\n value() {\n return this.inner;\n }\n }\n\n class ListItem extends _util.ListNode {\n constructor(iterable, result) {\n super(iterable.valueReferenceFor(result));\n this.retained = false;\n this.seen = false;\n this.key = result.key;\n this.iterable = iterable;\n this.memo = iterable.memoReferenceFor(result);\n }\n update(item) {\n this.retained = true;\n this.iterable.updateValueReference(this.value, item);\n this.iterable.updateMemoReference(this.memo, item);\n }\n shouldRemove() {\n return !this.retained;\n }\n reset() {\n this.retained = false;\n this.seen = false;\n }\n }\n class IterationArtifacts {\n constructor(iterable) {\n this.iterator = null;\n this.map = (0, _util.dict)();\n this.list = new _util.LinkedList();\n this.tag = iterable.tag;\n this.iterable = iterable;\n }\n isEmpty() {\n let iterator = this.iterator = this.iterable.iterate();\n return iterator.isEmpty();\n }\n iterate() {\n let iterator;\n if (this.iterator === null) {\n iterator = this.iterable.iterate();\n } else {\n iterator = this.iterator;\n }\n this.iterator = null;\n return iterator;\n }\n has(key) {\n return !!this.map[key];\n }\n get(key) {\n return this.map[key];\n }\n wasSeen(key) {\n let node = this.map[key];\n return node !== undefined && node.seen;\n }\n append(item) {\n let { map, list, iterable } = this;\n let node = map[item.key] = new ListItem(iterable, item);\n list.append(node);\n return node;\n }\n insertBefore(item, reference) {\n let { map, list, iterable } = this;\n let node = map[item.key] = new ListItem(iterable, item);\n node.retained = true;\n list.insertBefore(node, reference);\n return node;\n }\n move(item, reference) {\n let { list } = this;\n item.retained = true;\n list.remove(item);\n list.insertBefore(item, reference);\n }\n remove(item) {\n let { list } = this;\n list.remove(item);\n delete this.map[item.key];\n }\n nextNode(item) {\n return this.list.nextNode(item);\n }\n head() {\n return this.list.head();\n }\n }\n class ReferenceIterator {\n // if anyone needs to construct this object with something other than\n // an iterable, let @wycats know.\n constructor(iterable) {\n this.iterator = null;\n let artifacts = new IterationArtifacts(iterable);\n this.artifacts = artifacts;\n }\n next() {\n let { artifacts } = this;\n let iterator = this.iterator = this.iterator || artifacts.iterate();\n let item = iterator.next();\n if (item === null) return null;\n return artifacts.append(item);\n }\n }\n var Phase;\n (function (Phase) {\n Phase[Phase[\"Append\"] = 0] = \"Append\";\n Phase[Phase[\"Prune\"] = 1] = \"Prune\";\n Phase[Phase[\"Done\"] = 2] = \"Done\";\n })(Phase || (Phase = {}));\n class IteratorSynchronizer {\n constructor({ target, artifacts }) {\n this.target = target;\n this.artifacts = artifacts;\n this.iterator = artifacts.iterate();\n this.current = artifacts.head();\n }\n sync() {\n let phase = Phase.Append;\n while (true) {\n switch (phase) {\n case Phase.Append:\n phase = this.nextAppend();\n break;\n case Phase.Prune:\n phase = this.nextPrune();\n break;\n case Phase.Done:\n this.nextDone();\n return;\n }\n }\n }\n advanceToKey(key) {\n let { current, artifacts } = this;\n let seek = current;\n while (seek !== null && seek.key !== key) {\n seek.seen = true;\n seek = artifacts.nextNode(seek);\n }\n if (seek !== null) {\n this.current = artifacts.nextNode(seek);\n }\n }\n nextAppend() {\n let { iterator, current, artifacts } = this;\n let item = iterator.next();\n if (item === null) {\n return this.startPrune();\n }\n let { key } = item;\n if (current !== null && current.key === key) {\n this.nextRetain(item);\n } else if (artifacts.has(key)) {\n this.nextMove(item);\n } else {\n this.nextInsert(item);\n }\n return Phase.Append;\n }\n nextRetain(item) {\n let { artifacts, current } = this;\n current = current;\n current.update(item);\n this.current = artifacts.nextNode(current);\n this.target.retain(item.key, current.value, current.memo);\n }\n nextMove(item) {\n let { current, artifacts, target } = this;\n let { key } = item;\n let found = artifacts.get(item.key);\n found.update(item);\n if (artifacts.wasSeen(item.key)) {\n artifacts.move(found, current);\n target.move(found.key, found.value, found.memo, current ? current.key : null);\n } else {\n this.advanceToKey(key);\n }\n }\n nextInsert(item) {\n let { artifacts, target, current } = this;\n let node = artifacts.insertBefore(item, current);\n target.insert(node.key, node.value, node.memo, current ? current.key : null);\n }\n startPrune() {\n this.current = this.artifacts.head();\n return Phase.Prune;\n }\n nextPrune() {\n let { artifacts, target, current } = this;\n if (current === null) {\n return Phase.Done;\n }\n let node = current;\n this.current = artifacts.nextNode(node);\n if (node.shouldRemove()) {\n artifacts.remove(node);\n target.delete(node.key);\n } else {\n node.reset();\n }\n return Phase.Prune;\n }\n nextDone() {\n this.target.done();\n }\n }\n\n exports.ConstReference = ConstReference;\n exports.ListItem = ListItem;\n exports.IterationArtifacts = IterationArtifacts;\n exports.ReferenceIterator = ReferenceIterator;\n exports.IteratorSynchronizer = IteratorSynchronizer;\n exports.CONSTANT = CONSTANT;\n exports.INITIAL = INITIAL;\n exports.VOLATILE = VOLATILE;\n exports.RevisionTag = RevisionTag;\n exports.TagWrapper = TagWrapper;\n exports.CONSTANT_TAG = CONSTANT_TAG;\n exports.VOLATILE_TAG = VOLATILE_TAG;\n exports.CURRENT_TAG = CURRENT_TAG;\n exports.isConst = isConst;\n exports.isConstTag = isConstTag;\n exports.bump = bump;\n exports.DirtyableTag = DirtyableTag;\n exports.combineTagged = combineTagged;\n exports.combineSlice = combineSlice;\n exports.combine = combine;\n exports.CachedTag = CachedTag;\n exports.UpdatableTag = UpdatableTag;\n exports.CachedReference = CachedReference;\n exports.map = map;\n exports.ReferenceCache = ReferenceCache;\n exports.isModified = isModified;\n});","enifed('@glimmer/runtime', ['exports', '@glimmer/util', '@glimmer/reference', '@glimmer/vm', '@glimmer/low-level'], function (exports, _util, _reference, _vm2, _lowLevel) {\n 'use strict';\n\n exports.__esModule = true;\n exports.hasCapability = exports.capabilityFlagsFrom = exports.Cursor = exports.ConcreteBounds = exports.RehydrateBuilder = exports.rehydrationBuilder = exports.clientBuilder = exports.NewElementBuilder = exports.normalizeProperty = exports.insertHTMLBefore = exports.isWhitespace = exports.DOMTreeConstruction = exports.IDOMChanges = exports.SVG_NAMESPACE = exports.DOMChanges = exports.curry = exports.isCurriedComponentDefinition = exports.CurriedComponentDefinition = exports.MINIMAL_CAPABILITIES = exports.DEFAULT_CAPABILITIES = exports.DefaultEnvironment = exports.Environment = exports.Scope = exports.EMPTY_ARGS = exports.DynamicAttribute = exports.SimpleDynamicAttribute = exports.RenderResult = exports.UpdatingVM = exports.LowLevelVM = exports.getDynamicVar = exports.resetDebuggerCallback = exports.setDebuggerCallback = exports.ConditionalReference = exports.PrimitiveReference = exports.UNDEFINED_REFERENCE = exports.NULL_REFERENCE = exports.renderMain = undefined;\n\n\n // these import bindings will be stripped from build\n\n class AppendOpcodes {\n constructor() {\n this.evaluateOpcode = (0, _util.fillNulls)(98 /* Size */).slice();\n }\n add(name, evaluate, kind = 'syscall') {\n this.evaluateOpcode[name] = { syscall: kind === 'syscall', evaluate };\n }\n debugBefore(vm, opcode, type) {\n let sp;\n let state;\n\n return { sp: sp, state };\n }\n debugAfter(vm, opcode, type, pre) {\n let expectedChange;\n let { sp, state } = pre;\n let metadata = null;\n if (metadata !== null) {\n if (typeof metadata.stackChange === 'number') {\n expectedChange = metadata.stackChange;\n } else {\n expectedChange = metadata.stackChange({ opcode, constants: vm.constants, state });\n if (isNaN(expectedChange)) throw (0, _util.unreachable)();\n }\n }\n }\n evaluate(vm, opcode, type) {\n let operation = this.evaluateOpcode[type];\n if (operation.syscall) {\n\n operation.evaluate(vm, opcode);\n } else {\n\n operation.evaluate(vm.inner, opcode);\n }\n }\n }\n const APPEND_OPCODES = new AppendOpcodes();\n class AbstractOpcode {\n constructor() {\n (0, _util.initializeGuid)(this);\n }\n }\n class UpdatingOpcode extends AbstractOpcode {\n constructor() {\n super(...arguments);\n this.next = null;\n this.prev = null;\n }\n }\n\n class PrimitiveReference extends _reference.ConstReference {\n constructor(value) {\n super(value);\n }\n static create(value) {\n if (value === undefined) {\n return UNDEFINED_REFERENCE;\n } else if (value === null) {\n return NULL_REFERENCE;\n } else if (value === true) {\n return TRUE_REFERENCE;\n } else if (value === false) {\n return FALSE_REFERENCE;\n } else if (typeof value === 'number') {\n return new ValueReference(value);\n } else {\n return new StringReference(value);\n }\n }\n get(_key) {\n return UNDEFINED_REFERENCE;\n }\n }\n class StringReference extends PrimitiveReference {\n constructor() {\n super(...arguments);\n this.lengthReference = null;\n }\n get(key) {\n if (key === 'length') {\n let { lengthReference } = this;\n if (lengthReference === null) {\n lengthReference = this.lengthReference = new ValueReference(this.inner.length);\n }\n return lengthReference;\n } else {\n return super.get(key);\n }\n }\n }\n class ValueReference extends PrimitiveReference {\n constructor(value) {\n super(value);\n }\n }\n const UNDEFINED_REFERENCE = new ValueReference(undefined);\n const NULL_REFERENCE = new ValueReference(null);\n const TRUE_REFERENCE = new ValueReference(true);\n const FALSE_REFERENCE = new ValueReference(false);\n class ConditionalReference {\n constructor(inner) {\n this.inner = inner;\n this.tag = inner.tag;\n }\n value() {\n return this.toBool(this.inner.value());\n }\n toBool(value) {\n return !!value;\n }\n }\n\n class ConcatReference extends _reference.CachedReference {\n constructor(parts) {\n super();\n this.parts = parts;\n this.tag = (0, _reference.combineTagged)(parts);\n }\n compute() {\n let parts = new Array();\n for (let i = 0; i < this.parts.length; i++) {\n let value = this.parts[i].value();\n if (value !== null && value !== undefined) {\n parts[i] = castToString(value);\n }\n }\n if (parts.length > 0) {\n return parts.join('');\n }\n return null;\n }\n }\n function castToString(value) {\n if (typeof value.toString !== 'function') {\n return '';\n }\n return String(value);\n }\n\n APPEND_OPCODES.add(1 /* Helper */, (vm, { op1: handle }) => {\n let stack = vm.stack;\n let helper = vm.constants.resolveHandle(handle);\n let args = stack.pop();\n let value = helper(vm, args);\n vm.loadValue(_vm2.Register.v0, value);\n });\n APPEND_OPCODES.add(6 /* GetVariable */, (vm, { op1: symbol }) => {\n let expr = vm.referenceForSymbol(symbol);\n vm.stack.push(expr);\n });\n APPEND_OPCODES.add(4 /* SetVariable */, (vm, { op1: symbol }) => {\n let expr = vm.stack.pop();\n vm.scope().bindSymbol(symbol, expr);\n });\n APPEND_OPCODES.add(5 /* SetBlock */, (vm, { op1: symbol }) => {\n let handle = vm.stack.pop();\n let scope = vm.stack.pop(); // FIXME(mmun): shouldn't need to cast this\n let table = vm.stack.pop();\n let block = table ? [handle, scope, table] : null;\n vm.scope().bindBlock(symbol, block);\n });\n APPEND_OPCODES.add(96 /* ResolveMaybeLocal */, (vm, { op1: _name }) => {\n let name = vm.constants.getString(_name);\n let locals = vm.scope().getPartialMap();\n let ref = locals[name];\n if (ref === undefined) {\n ref = vm.getSelf().get(name);\n }\n vm.stack.push(ref);\n });\n APPEND_OPCODES.add(20 /* RootScope */, (vm, { op1: symbols, op2: bindCallerScope }) => {\n vm.pushRootScope(symbols, !!bindCallerScope);\n });\n APPEND_OPCODES.add(7 /* GetProperty */, (vm, { op1: _key }) => {\n let key = vm.constants.getString(_key);\n let expr = vm.stack.pop();\n vm.stack.push(expr.get(key));\n });\n APPEND_OPCODES.add(8 /* GetBlock */, (vm, { op1: _block }) => {\n let { stack } = vm;\n let block = vm.scope().getBlock(_block);\n if (block) {\n stack.push(block[2]);\n stack.push(block[1]);\n stack.push(block[0]);\n } else {\n stack.push(null);\n stack.push(null);\n stack.push(null);\n }\n });\n APPEND_OPCODES.add(9 /* HasBlock */, (vm, { op1: _block }) => {\n let hasBlock = !!vm.scope().getBlock(_block);\n vm.stack.push(hasBlock ? TRUE_REFERENCE : FALSE_REFERENCE);\n });\n APPEND_OPCODES.add(10 /* HasBlockParams */, vm => {\n // FIXME(mmun): should only need to push the symbol table\n let block = vm.stack.pop();\n let scope = vm.stack.pop();\n\n let table = vm.stack.pop();\n\n let hasBlockParams = table && table.parameters.length;\n vm.stack.push(hasBlockParams ? TRUE_REFERENCE : FALSE_REFERENCE);\n });\n APPEND_OPCODES.add(11 /* Concat */, (vm, { op1: count }) => {\n let out = new Array(count);\n for (let i = count; i > 0; i--) {\n let offset = i - 1;\n out[offset] = vm.stack.pop();\n }\n vm.stack.push(new ConcatReference(out));\n });\n\n const CURRIED_COMPONENT_DEFINITION_BRAND = 'CURRIED COMPONENT DEFINITION [id=6f00feb9-a0ef-4547-99ea-ac328f80acea]';\n function isCurriedComponentDefinition(definition) {\n return !!(definition && definition[CURRIED_COMPONENT_DEFINITION_BRAND]);\n }\n function isComponentDefinition(definition) {\n return definition && definition[CURRIED_COMPONENT_DEFINITION_BRAND];\n }\n class CurriedComponentDefinition {\n /** @internal */\n constructor(inner, args) {\n this.inner = inner;\n this.args = args;\n this[CURRIED_COMPONENT_DEFINITION_BRAND] = true;\n }\n unwrap(args) {\n args.realloc(this.offset);\n let definition = this;\n while (true) {\n let { args: curriedArgs, inner } = definition;\n if (curriedArgs) {\n args.positional.prepend(curriedArgs.positional);\n args.named.merge(curriedArgs.named);\n }\n if (!isCurriedComponentDefinition(inner)) {\n return inner;\n }\n definition = inner;\n }\n }\n /** @internal */\n get offset() {\n let { inner, args } = this;\n let length = args ? args.positional.length : 0;\n return isCurriedComponentDefinition(inner) ? length + inner.offset : length;\n }\n }\n function curry(spec, args = null) {\n return new CurriedComponentDefinition(spec, args);\n }\n\n function normalizeStringValue(value) {\n if (isEmpty(value)) {\n return '';\n }\n return String(value);\n }\n function shouldCoerce(value) {\n return isString(value) || isEmpty(value) || typeof value === 'boolean' || typeof value === 'number';\n }\n function isEmpty(value) {\n return value === null || value === undefined || typeof value.toString !== 'function';\n }\n function isSafeString(value) {\n return typeof value === 'object' && value !== null && typeof value.toHTML === 'function';\n }\n function isNode(value) {\n return typeof value === 'object' && value !== null && typeof value.nodeType === 'number';\n }\n function isFragment(value) {\n return isNode(value) && value.nodeType === 11;\n }\n function isString(value) {\n return typeof value === 'string';\n }\n\n class DynamicTextContent extends UpdatingOpcode {\n constructor(node, reference, lastValue) {\n super();\n this.node = node;\n this.reference = reference;\n this.lastValue = lastValue;\n this.type = 'dynamic-text';\n this.tag = reference.tag;\n this.lastRevision = this.tag.value();\n }\n evaluate() {\n let { reference, tag } = this;\n if (!tag.validate(this.lastRevision)) {\n this.lastRevision = tag.value();\n this.update(reference.value());\n }\n }\n update(value) {\n let { lastValue } = this;\n if (value === lastValue) return;\n let normalized;\n if (isEmpty(value)) {\n normalized = '';\n } else if (isString(value)) {\n normalized = value;\n } else {\n normalized = String(value);\n }\n if (normalized !== lastValue) {\n let textNode = this.node;\n textNode.nodeValue = this.lastValue = normalized;\n }\n }\n }\n\n class IsCurriedComponentDefinitionReference extends ConditionalReference {\n static create(inner) {\n return new IsCurriedComponentDefinitionReference(inner);\n }\n toBool(value) {\n return isCurriedComponentDefinition(value);\n }\n }\n class ContentTypeReference {\n constructor(inner) {\n this.inner = inner;\n this.tag = inner.tag;\n }\n value() {\n let value = this.inner.value();\n if (shouldCoerce(value)) {\n return 1 /* String */;\n } else if (isComponentDefinition(value)) {\n return 0 /* Component */;\n } else if (isSafeString(value)) {\n return 3 /* SafeString */;\n } else if (isFragment(value)) {\n return 4 /* Fragment */;\n } else if (isNode(value)) {\n return 5 /* Node */;\n } else {\n return 1 /* String */;\n }\n }\n }\n APPEND_OPCODES.add(28 /* AppendHTML */, vm => {\n let reference = vm.stack.pop();\n let rawValue = reference.value();\n let value = isEmpty(rawValue) ? '' : String(rawValue);\n vm.elements().appendDynamicHTML(value);\n });\n APPEND_OPCODES.add(29 /* AppendSafeHTML */, vm => {\n let reference = vm.stack.pop();\n let rawValue = reference.value().toHTML();\n let value = isEmpty(rawValue) ? '' : rawValue;\n vm.elements().appendDynamicHTML(value);\n });\n APPEND_OPCODES.add(32 /* AppendText */, vm => {\n let reference = vm.stack.pop();\n let rawValue = reference.value();\n let value = isEmpty(rawValue) ? '' : String(rawValue);\n let node = vm.elements().appendDynamicText(value);\n if (!(0, _reference.isConst)(reference)) {\n vm.updateWith(new DynamicTextContent(node, reference, value));\n }\n });\n APPEND_OPCODES.add(30 /* AppendDocumentFragment */, vm => {\n let reference = vm.stack.pop();\n let value = reference.value();\n vm.elements().appendDynamicFragment(value);\n });\n APPEND_OPCODES.add(31 /* AppendNode */, vm => {\n let reference = vm.stack.pop();\n let value = reference.value();\n vm.elements().appendDynamicNode(value);\n });\n\n APPEND_OPCODES.add(22 /* ChildScope */, vm => vm.pushChildScope());\n APPEND_OPCODES.add(23 /* PopScope */, vm => vm.popScope());\n APPEND_OPCODES.add(44 /* PushDynamicScope */, vm => vm.pushDynamicScope());\n APPEND_OPCODES.add(45 /* PopDynamicScope */, vm => vm.popDynamicScope());\n APPEND_OPCODES.add(12 /* Constant */, (vm, { op1: other }) => {\n vm.stack.push(vm.constants.getOther(other));\n });\n APPEND_OPCODES.add(13 /* Primitive */, (vm, { op1: primitive }) => {\n let stack = vm.stack;\n let flag = primitive & 7; // 111\n let value = primitive >> 3;\n switch (flag) {\n case 0 /* NUMBER */:\n stack.push(value);\n break;\n case 1 /* FLOAT */:\n stack.push(vm.constants.getNumber(value));\n break;\n case 2 /* STRING */:\n stack.push(vm.constants.getString(value));\n break;\n case 3 /* BOOLEAN_OR_VOID */:\n stack.pushEncodedImmediate(primitive);\n break;\n case 4 /* NEGATIVE */:\n stack.push(vm.constants.getNumber(value));\n break;\n case 5 /* BIG_NUM */:\n stack.push(vm.constants.getNumber(value));\n break;\n }\n });\n APPEND_OPCODES.add(14 /* PrimitiveReference */, vm => {\n let stack = vm.stack;\n stack.push(PrimitiveReference.create(stack.pop()));\n });\n APPEND_OPCODES.add(15 /* ReifyU32 */, vm => {\n let stack = vm.stack;\n stack.push(stack.peek().value());\n });\n APPEND_OPCODES.add(16 /* Dup */, (vm, { op1: register, op2: offset }) => {\n let position = vm.fetchValue(register) - offset;\n vm.stack.dup(position);\n });\n APPEND_OPCODES.add(17 /* Pop */, (vm, { op1: count }) => {\n vm.stack.pop(count);\n });\n APPEND_OPCODES.add(18 /* Load */, (vm, { op1: register }) => {\n vm.load(register);\n });\n APPEND_OPCODES.add(19 /* Fetch */, (vm, { op1: register }) => {\n vm.fetch(register);\n });\n APPEND_OPCODES.add(43 /* BindDynamicScope */, (vm, { op1: _names }) => {\n let names = vm.constants.getArray(_names);\n vm.bindDynamicScope(names);\n });\n APPEND_OPCODES.add(61 /* Enter */, (vm, { op1: args }) => {\n vm.enter(args);\n });\n APPEND_OPCODES.add(62 /* Exit */, vm => {\n vm.exit();\n });\n APPEND_OPCODES.add(48 /* PushSymbolTable */, (vm, { op1: _table }) => {\n let stack = vm.stack;\n stack.push(vm.constants.getSerializable(_table));\n });\n APPEND_OPCODES.add(47 /* PushBlockScope */, vm => {\n let stack = vm.stack;\n stack.push(vm.scope());\n });\n APPEND_OPCODES.add(46 /* CompileBlock */, vm => {\n let stack = vm.stack;\n let block = stack.pop();\n if (block) {\n stack.pushSmi(block.compile());\n } else {\n stack.pushNull();\n }\n });\n APPEND_OPCODES.add(51 /* InvokeYield */, vm => {\n let { stack } = vm;\n let handle = stack.pop();\n let scope = stack.pop(); // FIXME(mmun): shouldn't need to cast this\n let table = stack.pop();\n\n let args = stack.pop();\n if (table === null) {\n // To balance the pop{Frame,Scope}\n vm.pushFrame();\n vm.pushScope(scope); // Could be null but it doesnt matter as it is immediatelly popped.\n return;\n }\n let invokingScope = scope;\n // If necessary, create a child scope\n {\n let locals = table.parameters;\n let localsCount = locals.length;\n if (localsCount > 0) {\n invokingScope = invokingScope.child();\n for (let i = 0; i < localsCount; i++) {\n invokingScope.bindSymbol(locals[i], args.at(i));\n }\n }\n }\n vm.pushFrame();\n vm.pushScope(invokingScope);\n vm.call(handle);\n });\n APPEND_OPCODES.add(53 /* JumpIf */, (vm, { op1: target }) => {\n let reference = vm.stack.pop();\n if ((0, _reference.isConst)(reference)) {\n if (reference.value()) {\n vm.goto(target);\n }\n } else {\n let cache = new _reference.ReferenceCache(reference);\n if (cache.peek()) {\n vm.goto(target);\n }\n vm.updateWith(new Assert(cache));\n }\n });\n APPEND_OPCODES.add(54 /* JumpUnless */, (vm, { op1: target }) => {\n let reference = vm.stack.pop();\n if ((0, _reference.isConst)(reference)) {\n if (!reference.value()) {\n vm.goto(target);\n }\n } else {\n let cache = new _reference.ReferenceCache(reference);\n if (!cache.peek()) {\n vm.goto(target);\n }\n vm.updateWith(new Assert(cache));\n }\n });\n APPEND_OPCODES.add(55 /* JumpEq */, (vm, { op1: target, op2: comparison }) => {\n let other = vm.stack.peek();\n if (other === comparison) {\n vm.goto(target);\n }\n });\n APPEND_OPCODES.add(56 /* AssertSame */, vm => {\n let reference = vm.stack.peek();\n if (!(0, _reference.isConst)(reference)) {\n vm.updateWith(Assert.initialize(new _reference.ReferenceCache(reference)));\n }\n });\n APPEND_OPCODES.add(63 /* ToBoolean */, vm => {\n let { env, stack } = vm;\n stack.push(env.toConditionalReference(stack.pop()));\n });\n class Assert extends UpdatingOpcode {\n constructor(cache) {\n super();\n this.type = 'assert';\n this.tag = cache.tag;\n this.cache = cache;\n }\n static initialize(cache) {\n let assert = new Assert(cache);\n cache.peek();\n return assert;\n }\n evaluate(vm) {\n let { cache } = this;\n if ((0, _reference.isModified)(cache.revalidate())) {\n vm.throw();\n }\n }\n }\n class JumpIfNotModifiedOpcode extends UpdatingOpcode {\n constructor(tag, target) {\n super();\n this.target = target;\n this.type = 'jump-if-not-modified';\n this.tag = tag;\n this.lastRevision = tag.value();\n }\n evaluate(vm) {\n let { tag, target, lastRevision } = this;\n if (!vm.alwaysRevalidate && tag.validate(lastRevision)) {\n vm.goto(target);\n }\n }\n didModify() {\n this.lastRevision = this.tag.value();\n }\n }\n class DidModifyOpcode extends UpdatingOpcode {\n constructor(target) {\n super();\n this.target = target;\n this.type = 'did-modify';\n this.tag = _reference.CONSTANT_TAG;\n }\n evaluate() {\n this.target.didModify();\n }\n }\n class LabelOpcode {\n constructor(label) {\n this.tag = _reference.CONSTANT_TAG;\n this.type = 'label';\n this.label = null;\n this.prev = null;\n this.next = null;\n (0, _util.initializeGuid)(this);\n this.label = label;\n }\n evaluate() {}\n inspect() {\n return `${this.label} [${this._guid}]`;\n }\n }\n\n APPEND_OPCODES.add(26 /* Text */, (vm, { op1: text }) => {\n vm.elements().appendText(vm.constants.getString(text));\n });\n APPEND_OPCODES.add(27 /* Comment */, (vm, { op1: text }) => {\n vm.elements().appendComment(vm.constants.getString(text));\n });\n APPEND_OPCODES.add(33 /* OpenElement */, (vm, { op1: tag }) => {\n vm.elements().openElement(vm.constants.getString(tag));\n });\n APPEND_OPCODES.add(34 /* OpenDynamicElement */, vm => {\n let tagName = vm.stack.pop().value();\n vm.elements().openElement(tagName);\n });\n APPEND_OPCODES.add(41 /* PushRemoteElement */, vm => {\n let elementRef = vm.stack.pop();\n let nextSiblingRef = vm.stack.pop();\n let guidRef = vm.stack.pop();\n let element;\n let nextSibling;\n let guid = guidRef.value();\n if ((0, _reference.isConst)(elementRef)) {\n element = elementRef.value();\n } else {\n let cache = new _reference.ReferenceCache(elementRef);\n element = cache.peek();\n vm.updateWith(new Assert(cache));\n }\n if ((0, _reference.isConst)(nextSiblingRef)) {\n nextSibling = nextSiblingRef.value();\n } else {\n let cache = new _reference.ReferenceCache(nextSiblingRef);\n nextSibling = cache.peek();\n vm.updateWith(new Assert(cache));\n }\n vm.elements().pushRemoteElement(element, guid, nextSibling);\n });\n APPEND_OPCODES.add(42 /* PopRemoteElement */, vm => {\n vm.elements().popRemoteElement();\n });\n APPEND_OPCODES.add(38 /* FlushElement */, vm => {\n let operations = vm.fetchValue(_vm2.Register.t0);\n if (operations) {\n operations.flush(vm);\n vm.loadValue(_vm2.Register.t0, null);\n }\n vm.elements().flushElement();\n });\n APPEND_OPCODES.add(39 /* CloseElement */, vm => {\n vm.elements().closeElement();\n });\n APPEND_OPCODES.add(40 /* Modifier */, (vm, { op1: handle }) => {\n let { manager, state } = vm.constants.resolveHandle(handle);\n let stack = vm.stack;\n let args = stack.pop();\n let { element, updateOperations } = vm.elements();\n let dynamicScope = vm.dynamicScope();\n let modifier = manager.create(element, state, args, dynamicScope, updateOperations);\n vm.env.scheduleInstallModifier(modifier, manager);\n let destructor = manager.getDestructor(modifier);\n if (destructor) {\n vm.newDestroyable(destructor);\n }\n let tag = manager.getTag(modifier);\n if (!(0, _reference.isConstTag)(tag)) {\n vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier));\n }\n });\n class UpdateModifierOpcode extends UpdatingOpcode {\n constructor(tag, manager, modifier) {\n super();\n this.tag = tag;\n this.manager = manager;\n this.modifier = modifier;\n this.type = 'update-modifier';\n this.lastUpdated = tag.value();\n }\n evaluate(vm) {\n let { manager, modifier, tag, lastUpdated } = this;\n if (!tag.validate(lastUpdated)) {\n vm.env.scheduleUpdateModifier(modifier, manager);\n this.lastUpdated = tag.value();\n }\n }\n }\n APPEND_OPCODES.add(35 /* StaticAttr */, (vm, { op1: _name, op2: _value, op3: _namespace }) => {\n let name = vm.constants.getString(_name);\n let value = vm.constants.getString(_value);\n let namespace = _namespace ? vm.constants.getString(_namespace) : null;\n vm.elements().setStaticAttribute(name, value, namespace);\n });\n APPEND_OPCODES.add(36 /* DynamicAttr */, (vm, { op1: _name, op2: trusting, op3: _namespace }) => {\n let name = vm.constants.getString(_name);\n let reference = vm.stack.pop();\n let value = reference.value();\n let namespace = _namespace ? vm.constants.getString(_namespace) : null;\n let attribute = vm.elements().setDynamicAttribute(name, value, !!trusting, namespace);\n if (!(0, _reference.isConst)(reference)) {\n vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute));\n }\n });\n class UpdateDynamicAttributeOpcode extends UpdatingOpcode {\n constructor(reference, attribute) {\n super();\n this.reference = reference;\n this.attribute = attribute;\n this.type = 'patch-element';\n this.tag = reference.tag;\n this.lastRevision = this.tag.value();\n }\n evaluate(vm) {\n let { attribute, reference, tag } = this;\n if (!tag.validate(this.lastRevision)) {\n this.lastRevision = tag.value();\n attribute.update(reference.value(), vm.env);\n }\n }\n }\n\n function resolveComponent(resolver, name, meta) {\n let definition = resolver.lookupComponentDefinition(name, meta);\n\n return definition;\n }\n\n class CurryComponentReference {\n constructor(inner, resolver, meta, args) {\n this.inner = inner;\n this.resolver = resolver;\n this.meta = meta;\n this.args = args;\n this.tag = inner.tag;\n this.lastValue = null;\n this.lastDefinition = null;\n }\n value() {\n let { inner, lastValue } = this;\n let value = inner.value();\n if (value === lastValue) {\n return this.lastDefinition;\n }\n let definition = null;\n if (isCurriedComponentDefinition(value)) {\n definition = value;\n } else if (typeof value === 'string' && value) {\n let { resolver, meta } = this;\n definition = resolveComponent(resolver, value, meta);\n }\n definition = this.curry(definition);\n this.lastValue = value;\n this.lastDefinition = definition;\n return definition;\n }\n get() {\n return UNDEFINED_REFERENCE;\n }\n curry(definition) {\n let { args } = this;\n if (!args && isCurriedComponentDefinition(definition)) {\n return definition;\n } else if (!definition) {\n return null;\n } else {\n return new CurriedComponentDefinition(definition, args);\n }\n }\n }\n\n class ClassListReference {\n constructor(list) {\n this.list = list;\n this.tag = (0, _reference.combineTagged)(list);\n this.list = list;\n }\n value() {\n let ret = [];\n let { list } = this;\n for (let i = 0; i < list.length; i++) {\n let value = normalizeStringValue(list[i].value());\n if (value) ret.push(value);\n }\n return ret.length === 0 ? null : ret.join(' ');\n }\n }\n\n /**\n * Converts a ComponentCapabilities object into a 32-bit integer representation.\n */\n function capabilityFlagsFrom(capabilities) {\n return 0 | (capabilities.dynamicLayout ? 1 /* DynamicLayout */ : 0) | (capabilities.dynamicTag ? 2 /* DynamicTag */ : 0) | (capabilities.prepareArgs ? 4 /* PrepareArgs */ : 0) | (capabilities.createArgs ? 8 /* CreateArgs */ : 0) | (capabilities.attributeHook ? 16 /* AttributeHook */ : 0) | (capabilities.elementHook ? 32 /* ElementHook */ : 0) | (capabilities.dynamicScope ? 64 /* DynamicScope */ : 0) | (capabilities.createCaller ? 128 /* CreateCaller */ : 0) | (capabilities.updateHook ? 256 /* UpdateHook */ : 0) | (capabilities.createInstance ? 512 /* CreateInstance */ : 0);\n }\n function hasCapability(capabilities, capability) {\n return !!(capabilities & capability);\n }\n\n APPEND_OPCODES.add(69 /* IsComponent */, vm => {\n let stack = vm.stack;\n let ref = stack.pop();\n stack.push(IsCurriedComponentDefinitionReference.create(ref));\n });\n APPEND_OPCODES.add(70 /* ContentType */, vm => {\n let stack = vm.stack;\n let ref = stack.peek();\n stack.push(new ContentTypeReference(ref));\n });\n APPEND_OPCODES.add(71 /* CurryComponent */, (vm, { op1: _meta }) => {\n let stack = vm.stack;\n let definition = stack.pop();\n let capturedArgs = stack.pop();\n let meta = vm.constants.getSerializable(_meta);\n let resolver = vm.constants.resolver;\n vm.loadValue(_vm2.Register.v0, new CurryComponentReference(definition, resolver, meta, capturedArgs));\n // expectStackChange(vm.stack, -args.length - 1, 'CurryComponent');\n });\n APPEND_OPCODES.add(72 /* PushComponentDefinition */, (vm, { op1: handle }) => {\n let definition = vm.constants.resolveHandle(handle);\n\n let { manager } = definition;\n let capabilities = capabilityFlagsFrom(manager.getCapabilities(definition.state));\n let instance = {\n definition,\n manager,\n capabilities,\n state: null,\n handle: null,\n table: null,\n lookup: null\n };\n vm.stack.push(instance);\n });\n APPEND_OPCODES.add(75 /* ResolveDynamicComponent */, (vm, { op1: _meta }) => {\n let stack = vm.stack;\n let component = stack.pop().value();\n let meta = vm.constants.getSerializable(_meta);\n vm.loadValue(_vm2.Register.t1, null); // Clear the temp register\n let definition;\n if (typeof component === 'string') {\n let { constants: { resolver } } = vm;\n let resolvedDefinition = resolveComponent(resolver, component, meta);\n definition = resolvedDefinition;\n } else if (isCurriedComponentDefinition(component)) {\n definition = component;\n } else {\n throw (0, _util.unreachable)();\n }\n stack.push(definition);\n });\n APPEND_OPCODES.add(73 /* PushDynamicComponentInstance */, vm => {\n let { stack } = vm;\n let definition = stack.pop();\n let capabilities, manager;\n if (isCurriedComponentDefinition(definition)) {\n manager = capabilities = null;\n } else {\n manager = definition.manager;\n capabilities = capabilityFlagsFrom(manager.getCapabilities(definition.state));\n }\n stack.push({ definition, capabilities, manager, state: null, handle: null, table: null });\n });\n APPEND_OPCODES.add(74 /* PushCurriedComponent */, (vm, { op1: _meta }) => {\n let stack = vm.stack;\n let component = stack.pop().value();\n let definition;\n if (isCurriedComponentDefinition(component)) {\n definition = component;\n } else {\n throw (0, _util.unreachable)();\n }\n stack.push(definition);\n });\n APPEND_OPCODES.add(76 /* PushArgs */, (vm, { op1: _names, op2: flags }) => {\n let stack = vm.stack;\n let names = vm.constants.getStringArray(_names);\n let positionalCount = flags >> 4;\n let synthetic = flags & 0b1000;\n let blockNames = [];\n if (flags & 0b0100) blockNames.push('main');\n if (flags & 0b0010) blockNames.push('else');\n if (flags & 0b0001) blockNames.push('attrs');\n vm.args.setup(stack, names, blockNames, positionalCount, !!synthetic);\n stack.push(vm.args);\n });\n APPEND_OPCODES.add(77 /* PushEmptyArgs */, vm => {\n let { stack } = vm;\n stack.push(vm.args.empty(stack));\n });\n APPEND_OPCODES.add(80 /* CaptureArgs */, vm => {\n let stack = vm.stack;\n let args = stack.pop();\n let capturedArgs = args.capture();\n stack.push(capturedArgs);\n });\n APPEND_OPCODES.add(79 /* PrepareArgs */, (vm, { op1: _state }) => {\n let stack = vm.stack;\n let instance = vm.fetchValue(_state);\n let args = stack.pop();\n let { definition } = instance;\n if (isCurriedComponentDefinition(definition)) {\n\n definition = resolveCurriedComponentDefinition(instance, definition, args);\n }\n let { manager, state } = definition;\n let capabilities = instance.capabilities;\n if (hasCapability(capabilities, 4 /* PrepareArgs */) !== true) {\n stack.push(args);\n return;\n }\n let blocks = args.blocks.values;\n let blockNames = args.blocks.names;\n let preparedArgs = manager.prepareArgs(state, args);\n if (preparedArgs) {\n args.clear();\n for (let i = 0; i < blocks.length; i++) {\n stack.push(blocks[i]);\n }\n let { positional, named } = preparedArgs;\n let positionalCount = positional.length;\n for (let i = 0; i < positionalCount; i++) {\n stack.push(positional[i]);\n }\n let names = Object.keys(named);\n for (let i = 0; i < names.length; i++) {\n stack.push(named[names[i]]);\n }\n args.setup(stack, names, blockNames, positionalCount, true);\n }\n stack.push(args);\n });\n function resolveCurriedComponentDefinition(instance, definition, args) {\n let unwrappedDefinition = instance.definition = definition.unwrap(args);\n let { manager, state } = unwrappedDefinition;\n\n instance.manager = manager;\n instance.capabilities = capabilityFlagsFrom(manager.getCapabilities(state));\n return unwrappedDefinition;\n }\n APPEND_OPCODES.add(81 /* CreateComponent */, (vm, { op1: flags, op2: _state }) => {\n let instance = vm.fetchValue(_state);\n let { definition, manager } = instance;\n let capabilities = instance.capabilities = capabilityFlagsFrom(manager.getCapabilities(definition.state));\n let dynamicScope = null;\n if (hasCapability(capabilities, 64 /* DynamicScope */)) {\n dynamicScope = vm.dynamicScope();\n }\n let hasDefaultBlock = flags & 1;\n let args = null;\n if (hasCapability(capabilities, 8 /* CreateArgs */)) {\n args = vm.stack.peek();\n }\n let self = null;\n if (hasCapability(capabilities, 128 /* CreateCaller */)) {\n self = vm.getSelf();\n }\n let state = manager.create(vm.env, definition.state, args, dynamicScope, self, !!hasDefaultBlock);\n // We want to reuse the `state` POJO here, because we know that the opcodes\n // only transition at exactly one place.\n instance.state = state;\n let tag = manager.getTag(state);\n if (hasCapability(capabilities, 256 /* UpdateHook */) && !(0, _reference.isConstTag)(tag)) {\n vm.updateWith(new UpdateComponentOpcode(tag, state, manager, dynamicScope));\n }\n });\n APPEND_OPCODES.add(82 /* RegisterComponentDestructor */, (vm, { op1: _state }) => {\n let { manager, state } = vm.fetchValue(_state);\n let destructor = manager.getDestructor(state);\n if (destructor) vm.newDestroyable(destructor);\n });\n APPEND_OPCODES.add(91 /* BeginComponentTransaction */, vm => {\n vm.beginCacheGroup();\n vm.elements().pushSimpleBlock();\n });\n APPEND_OPCODES.add(83 /* PutComponentOperations */, vm => {\n vm.loadValue(_vm2.Register.t0, new ComponentElementOperations());\n });\n APPEND_OPCODES.add(37 /* ComponentAttr */, (vm, { op1: _name, op2: trusting, op3: _namespace }) => {\n let name = vm.constants.getString(_name);\n let reference = vm.stack.pop();\n let namespace = _namespace ? vm.constants.getString(_namespace) : null;\n vm.fetchValue(_vm2.Register.t0).setAttribute(name, reference, !!trusting, namespace);\n });\n class ComponentElementOperations {\n constructor() {\n this.attributes = (0, _util.dict)();\n this.classes = [];\n }\n setAttribute(name, value, trusting, namespace) {\n let deferred = { value, namespace, trusting };\n if (name === 'class') {\n this.classes.push(value);\n }\n this.attributes[name] = deferred;\n }\n flush(vm) {\n for (let name in this.attributes) {\n let attr = this.attributes[name];\n let { value: reference, namespace, trusting } = attr;\n if (name === 'class') {\n reference = new ClassListReference(this.classes);\n }\n if (name === 'type') {\n continue;\n }\n let attribute = vm.elements().setDynamicAttribute(name, reference.value(), trusting, namespace);\n if (!(0, _reference.isConst)(reference)) {\n vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute));\n }\n }\n if ('type' in this.attributes) {\n let type = this.attributes.type;\n let { value: reference, namespace, trusting } = type;\n let attribute = vm.elements().setDynamicAttribute('type', reference.value(), trusting, namespace);\n if (!(0, _reference.isConst)(reference)) {\n vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute));\n }\n }\n }\n }\n APPEND_OPCODES.add(93 /* DidCreateElement */, (vm, { op1: _state }) => {\n let { definition, state } = vm.fetchValue(_state);\n let { manager } = definition;\n let operations = vm.fetchValue(_vm2.Register.t0);\n let action = 'DidCreateElementOpcode#evaluate';\n manager.didCreateElement(state, vm.elements().expectConstructing(action), operations);\n });\n APPEND_OPCODES.add(84 /* GetComponentSelf */, (vm, { op1: _state }) => {\n let { definition, state } = vm.fetchValue(_state);\n let { manager } = definition;\n vm.stack.push(manager.getSelf(state));\n });\n APPEND_OPCODES.add(85 /* GetComponentTagName */, (vm, { op1: _state }) => {\n let { definition, state } = vm.fetchValue(_state);\n let { manager } = definition;\n vm.stack.push(manager.getTagName(state));\n });\n // Dynamic Invocation Only\n APPEND_OPCODES.add(86 /* GetComponentLayout */, (vm, { op1: _state }) => {\n let instance = vm.fetchValue(_state);\n let { manager, definition } = instance;\n let { constants: { resolver }, stack } = vm;\n let { state: instanceState, capabilities } = instance;\n let { state: definitionState } = definition;\n let invoke;\n if (hasStaticLayout(capabilities, manager)) {\n invoke = manager.getLayout(definitionState, resolver);\n } else if (hasDynamicLayout(capabilities, manager)) {\n invoke = manager.getDynamicLayout(instanceState, resolver);\n } else {\n throw (0, _util.unreachable)();\n }\n stack.push(invoke.symbolTable);\n stack.push(invoke.handle);\n });\n function hasStaticLayout(capabilities, _manager) {\n return hasCapability(capabilities, 1 /* DynamicLayout */) === false;\n }\n function hasDynamicLayout(capabilities, _manager) {\n return hasCapability(capabilities, 1 /* DynamicLayout */) === true;\n }\n APPEND_OPCODES.add(68 /* Main */, (vm, { op1: register }) => {\n let definition = vm.stack.pop();\n let invocation = vm.stack.pop();\n let { manager } = definition;\n let capabilities = capabilityFlagsFrom(manager.getCapabilities(definition.state));\n let state = {\n definition,\n manager,\n capabilities,\n state: null,\n handle: invocation.handle,\n table: invocation.symbolTable,\n lookup: null\n };\n vm.loadValue(register, state);\n });\n APPEND_OPCODES.add(89 /* PopulateLayout */, (vm, { op1: _state }) => {\n let { stack } = vm;\n let handle = stack.pop();\n let table = stack.pop();\n let state = vm.fetchValue(_state);\n state.handle = handle;\n state.table = table;\n });\n APPEND_OPCODES.add(21 /* VirtualRootScope */, (vm, { op1: _state }) => {\n let { symbols } = vm.fetchValue(_state).table;\n vm.pushRootScope(symbols.length + 1, true);\n });\n APPEND_OPCODES.add(87 /* SetupForEval */, (vm, { op1: _state }) => {\n let state = vm.fetchValue(_state);\n if (state.table.hasEval) {\n let lookup = state.lookup = (0, _util.dict)();\n vm.scope().bindEvalScope(lookup);\n }\n });\n APPEND_OPCODES.add(2 /* SetNamedVariables */, (vm, { op1: _state }) => {\n let state = vm.fetchValue(_state);\n let scope = vm.scope();\n let args = vm.stack.peek();\n let callerNames = args.named.atNames;\n for (let i = callerNames.length - 1; i >= 0; i--) {\n let atName = callerNames[i];\n let symbol = state.table.symbols.indexOf(callerNames[i]);\n let value = args.named.get(atName, false);\n if (symbol !== -1) scope.bindSymbol(symbol + 1, value);\n if (state.lookup) state.lookup[atName] = value;\n }\n });\n function bindBlock(symbolName, blockName, state, blocks, vm) {\n let symbol = state.table.symbols.indexOf(symbolName);\n let block = blocks.get(blockName);\n if (symbol !== -1) {\n vm.scope().bindBlock(symbol + 1, block);\n }\n if (state.lookup) state.lookup[symbolName] = block;\n }\n APPEND_OPCODES.add(3 /* SetBlocks */, (vm, { op1: _state }) => {\n let state = vm.fetchValue(_state);\n let { blocks } = vm.stack.peek();\n bindBlock('&attrs', 'attrs', state, blocks, vm);\n bindBlock('&inverse', 'else', state, blocks, vm);\n bindBlock('&default', 'main', state, blocks, vm);\n });\n // Dynamic Invocation Only\n APPEND_OPCODES.add(90 /* InvokeComponentLayout */, (vm, { op1: _state }) => {\n let state = vm.fetchValue(_state);\n vm.call(state.handle);\n });\n APPEND_OPCODES.add(94 /* DidRenderLayout */, (vm, { op1: _state }) => {\n let { manager, state } = vm.fetchValue(_state);\n let bounds = vm.elements().popBlock();\n let mgr = manager;\n mgr.didRenderLayout(state, bounds);\n vm.env.didCreate(state, manager);\n vm.updateWith(new DidUpdateLayoutOpcode(manager, state, bounds));\n });\n APPEND_OPCODES.add(92 /* CommitComponentTransaction */, vm => {\n vm.commitCacheGroup();\n });\n class UpdateComponentOpcode extends UpdatingOpcode {\n constructor(tag, component, manager, dynamicScope) {\n super();\n this.tag = tag;\n this.component = component;\n this.manager = manager;\n this.dynamicScope = dynamicScope;\n this.type = 'update-component';\n }\n evaluate(_vm) {\n let { component, manager, dynamicScope } = this;\n manager.update(component, dynamicScope);\n }\n }\n class DidUpdateLayoutOpcode extends UpdatingOpcode {\n constructor(manager, component, bounds) {\n super();\n this.manager = manager;\n this.component = component;\n this.bounds = bounds;\n this.type = 'did-update-layout';\n this.tag = _reference.CONSTANT_TAG;\n }\n evaluate(vm) {\n let { manager, component, bounds } = this;\n manager.didUpdateLayout(component, bounds);\n vm.env.didUpdate(component, manager);\n }\n }\n\n /* tslint:disable */\n function debugCallback(context, get) {\n console.info('Use `context`, and `get()` to debug this template.');\n // for example...\n context === get('this');\n debugger;\n }\n /* tslint:enable */\n let callback = debugCallback;\n // For testing purposes\n function setDebuggerCallback(cb) {\n callback = cb;\n }\n function resetDebuggerCallback() {\n callback = debugCallback;\n }\n class ScopeInspector {\n constructor(scope, symbols, evalInfo) {\n this.scope = scope;\n this.locals = (0, _util.dict)();\n for (let i = 0; i < evalInfo.length; i++) {\n let slot = evalInfo[i];\n let name = symbols[slot - 1];\n let ref = scope.getSymbol(slot);\n this.locals[name] = ref;\n }\n }\n get(path) {\n let { scope, locals } = this;\n let parts = path.split('.');\n let [head, ...tail] = path.split('.');\n let evalScope = scope.getEvalScope();\n let ref;\n if (head === 'this') {\n ref = scope.getSelf();\n } else if (locals[head]) {\n ref = locals[head];\n } else if (head.indexOf('@') === 0 && evalScope[head]) {\n ref = evalScope[head];\n } else {\n ref = this.scope.getSelf();\n tail = parts;\n }\n return tail.reduce((r, part) => r.get(part), ref);\n }\n }\n APPEND_OPCODES.add(97 /* Debugger */, (vm, { op1: _symbols, op2: _evalInfo }) => {\n let symbols = vm.constants.getStringArray(_symbols);\n let evalInfo = vm.constants.getArray(_evalInfo);\n let inspector = new ScopeInspector(vm.scope(), symbols, evalInfo);\n callback(vm.getSelf().value(), path => inspector.get(path).value());\n });\n\n APPEND_OPCODES.add(95 /* InvokePartial */, (vm, { op1: _meta, op2: _symbols, op3: _evalInfo }) => {\n let { constants, constants: { resolver }, stack } = vm;\n let name = stack.pop().value();\n\n let meta = constants.getSerializable(_meta);\n let outerSymbols = constants.getStringArray(_symbols);\n let evalInfo = constants.getArray(_evalInfo);\n let handle = resolver.lookupPartial(name, meta);\n\n let definition = resolver.resolve(handle);\n let { symbolTable, handle: vmHandle } = definition.getPartial();\n {\n let partialSymbols = symbolTable.symbols;\n let outerScope = vm.scope();\n let partialScope = vm.pushRootScope(partialSymbols.length, false);\n let evalScope = outerScope.getEvalScope();\n partialScope.bindCallerScope(outerScope.getCallerScope());\n partialScope.bindEvalScope(evalScope);\n partialScope.bindSelf(outerScope.getSelf());\n let locals = Object.create(outerScope.getPartialMap());\n for (let i = 0; i < evalInfo.length; i++) {\n let slot = evalInfo[i];\n let name = outerSymbols[slot - 1];\n let ref = outerScope.getSymbol(slot);\n locals[name] = ref;\n }\n if (evalScope) {\n for (let i = 0; i < partialSymbols.length; i++) {\n let name = partialSymbols[i];\n let symbol = i + 1;\n let value = evalScope[name];\n if (value !== undefined) partialScope.bind(symbol, value);\n }\n }\n partialScope.bindPartialMap(locals);\n vm.pushFrame(); // sp += 2\n vm.call(vmHandle);\n }\n });\n\n class IterablePresenceReference {\n constructor(artifacts) {\n this.tag = artifacts.tag;\n this.artifacts = artifacts;\n }\n value() {\n return !this.artifacts.isEmpty();\n }\n }\n APPEND_OPCODES.add(66 /* PutIterator */, vm => {\n let stack = vm.stack;\n let listRef = stack.pop();\n let key = stack.pop();\n let iterable = vm.env.iterableFor(listRef, key.value());\n let iterator = new _reference.ReferenceIterator(iterable);\n stack.push(iterator);\n stack.push(new IterablePresenceReference(iterator.artifacts));\n });\n APPEND_OPCODES.add(64 /* EnterList */, (vm, { op1: relativeStart }) => {\n vm.enterList(relativeStart);\n });\n APPEND_OPCODES.add(65 /* ExitList */, vm => {\n vm.exitList();\n });\n APPEND_OPCODES.add(67 /* Iterate */, (vm, { op1: breaks }) => {\n let stack = vm.stack;\n let item = stack.peek().next();\n if (item) {\n let tryOpcode = vm.iterate(item.memo, item.value);\n vm.enterItem(item.key, tryOpcode);\n } else {\n vm.goto(breaks);\n }\n });\n\n class Cursor {\n constructor(element, nextSibling) {\n this.element = element;\n this.nextSibling = nextSibling;\n }\n }\n class ConcreteBounds {\n constructor(parentNode, first, last) {\n this.parentNode = parentNode;\n this.first = first;\n this.last = last;\n }\n parentElement() {\n return this.parentNode;\n }\n firstNode() {\n return this.first;\n }\n lastNode() {\n return this.last;\n }\n }\n class SingleNodeBounds {\n constructor(parentNode, node) {\n this.parentNode = parentNode;\n this.node = node;\n }\n parentElement() {\n return this.parentNode;\n }\n firstNode() {\n return this.node;\n }\n lastNode() {\n return this.node;\n }\n }\n function bounds(parent, first, last) {\n return new ConcreteBounds(parent, first, last);\n }\n function single(parent, node) {\n return new SingleNodeBounds(parent, node);\n }\n function move(bounds, reference) {\n let parent = bounds.parentElement();\n let first = bounds.firstNode();\n let last = bounds.lastNode();\n let node = first;\n while (node) {\n let next = node.nextSibling;\n parent.insertBefore(node, reference);\n if (node === last) return next;\n node = next;\n }\n return null;\n }\n function clear(bounds) {\n let parent = bounds.parentElement();\n let first = bounds.firstNode();\n let last = bounds.lastNode();\n let node = first;\n while (node) {\n let next = node.nextSibling;\n parent.removeChild(node);\n if (node === last) return next;\n node = next;\n }\n return null;\n }\n\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n // Patch: insertAdjacentHTML on SVG Fix\n // Browsers: Safari, IE, Edge, Firefox ~33-34\n // Reason: insertAdjacentHTML does not exist on SVG elements in Safari. It is\n // present but throws an exception on IE and Edge. Old versions of\n // Firefox create nodes in the incorrect namespace.\n // Fix: Since IE and Edge silently fail to create SVG nodes using\n // innerHTML, and because Firefox may create nodes in the incorrect\n // namespace using innerHTML on SVG elements, an HTML-string wrapping\n // approach is used. A pre/post SVG tag is added to the string, then\n // that whole string is added to a div. The created nodes are plucked\n // out and applied to the target location on DOM.\n function applySVGInnerHTMLFix(document, DOMClass, svgNamespace) {\n if (!document) return DOMClass;\n if (!shouldApplyFix(document, svgNamespace)) {\n return DOMClass;\n }\n let div = document.createElement('div');\n return class DOMChangesWithSVGInnerHTMLFix extends DOMClass {\n insertHTMLBefore(parent, nextSibling, html) {\n if (parent.namespaceURI !== svgNamespace) {\n return super.insertHTMLBefore(parent, nextSibling, html);\n }\n return fixSVG(parent, div, html, nextSibling);\n }\n };\n }\n function fixSVG(parent, div, html, reference) {\n let source;\n // This is important, because decendants of the integration\n // point are parsed in the HTML namespace\n if (parent.tagName.toUpperCase() === 'FOREIGNOBJECT') {\n // IE, Edge: also do not correctly support using `innerHTML` on SVG\n // namespaced elements. So here a wrapper is used.\n let wrappedHtml = '' + (html || '') + '';\n div.innerHTML = wrappedHtml;\n source = div.firstChild.firstChild;\n } else {\n // IE, Edge: also do not correctly support using `innerHTML` on SVG\n // namespaced elements. So here a wrapper is used.\n let wrappedHtml = '' + (html || '') + '';\n div.innerHTML = wrappedHtml;\n source = div.firstChild;\n }\n let [first, last] = moveNodesBefore(source, parent, reference);\n return new ConcreteBounds(parent, first, last);\n }\n function shouldApplyFix(document, svgNamespace) {\n let svg = document.createElementNS(svgNamespace, 'svg');\n try {\n svg['insertAdjacentHTML']('beforeend', '');\n } catch (e) {\n // IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG\n // Safari: Will throw, insertAdjacentHTML is not present on SVG\n } finally {\n // FF: Old versions will create a node in the wrong namespace\n if (svg.childNodes.length === 1 && svg.firstChild.namespaceURI === SVG_NAMESPACE) {\n // The test worked as expected, no fix required\n return false;\n }\n return true;\n }\n }\n\n // Patch: Adjacent text node merging fix\n // Browsers: IE, Edge, Firefox w/o inspector open\n // Reason: These browsers will merge adjacent text nodes. For exmaple given\n //
    Hello
    with div.insertAdjacentHTML(' world') browsers\n // with proper behavior will populate div.childNodes with two items.\n // These browsers will populate it with one merged node instead.\n // Fix: Add these nodes to a wrapper element, then iterate the childNodes\n // of that wrapper and move the nodes to their target location. Note\n // that potential SVG bugs will have been handled before this fix.\n // Note that this fix must only apply to the previous text node, as\n // the base implementation of `insertHTMLBefore` already handles\n // following text nodes correctly.\n function applyTextNodeMergingFix(document, DOMClass) {\n if (!document) return DOMClass;\n if (!shouldApplyFix$1(document)) {\n return DOMClass;\n }\n return class DOMChangesWithTextNodeMergingFix extends DOMClass {\n constructor(document) {\n super(document);\n this.uselessComment = document.createComment('');\n }\n insertHTMLBefore(parent, nextSibling, html) {\n let didSetUselessComment = false;\n let nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n if (nextPrevious && nextPrevious instanceof Text) {\n didSetUselessComment = true;\n parent.insertBefore(this.uselessComment, nextSibling);\n }\n let bounds = super.insertHTMLBefore(parent, nextSibling, html);\n if (didSetUselessComment) {\n parent.removeChild(this.uselessComment);\n }\n return bounds;\n }\n };\n }\n function shouldApplyFix$1(document) {\n let mergingTextDiv = document.createElement('div');\n mergingTextDiv.innerHTML = 'first';\n mergingTextDiv.insertAdjacentHTML('beforeend', 'second');\n if (mergingTextDiv.childNodes.length === 2) {\n // It worked as expected, no fix required\n return false;\n }\n return true;\n }\n\n const SVG_NAMESPACE$1 = 'http://www.w3.org/2000/svg';\n // http://www.w3.org/TR/html/syntax.html#html-integration-point\n const SVG_INTEGRATION_POINTS = { foreignObject: 1, desc: 1, title: 1 };\n // http://www.w3.org/TR/html/syntax.html#adjust-svg-attributes\n // TODO: Adjust SVG attributes\n // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n // TODO: Adjust SVG elements\n // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n const BLACKLIST_TABLE = Object.create(null);\n ['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'main', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var'].forEach(tag => BLACKLIST_TABLE[tag] = 1);\n const WHITESPACE = /[\\t-\\r \\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF]/;\n let doc = typeof document === 'undefined' ? null : document;\n function isWhitespace(string) {\n return WHITESPACE.test(string);\n }\n function moveNodesBefore(source, target, nextSibling) {\n let first = source.firstChild;\n let last = null;\n let current = first;\n while (current) {\n last = current;\n current = current.nextSibling;\n target.insertBefore(last, nextSibling);\n }\n return [first, last];\n }\n class DOMOperations {\n constructor(document) {\n this.document = document;\n this.setupUselessElement();\n }\n // split into seperate method so that NodeDOMTreeConstruction\n // can override it.\n setupUselessElement() {\n this.uselessElement = this.document.createElement('div');\n }\n createElement(tag, context) {\n let isElementInSVGNamespace, isHTMLIntegrationPoint;\n if (context) {\n isElementInSVGNamespace = context.namespaceURI === SVG_NAMESPACE$1 || tag === 'svg';\n isHTMLIntegrationPoint = SVG_INTEGRATION_POINTS[context.tagName];\n } else {\n isElementInSVGNamespace = tag === 'svg';\n isHTMLIntegrationPoint = false;\n }\n if (isElementInSVGNamespace && !isHTMLIntegrationPoint) {\n // FIXME: This does not properly handle with color, face, or\n // size attributes, which is also disallowed by the spec. We should fix\n // this.\n if (BLACKLIST_TABLE[tag]) {\n throw new Error(`Cannot create a ${tag} inside an SVG context`);\n }\n return this.document.createElementNS(SVG_NAMESPACE$1, tag);\n } else {\n return this.document.createElement(tag);\n }\n }\n insertBefore(parent, node, reference) {\n parent.insertBefore(node, reference);\n }\n insertHTMLBefore(_parent, nextSibling, html) {\n return insertHTMLBefore(this.uselessElement, _parent, nextSibling, html);\n }\n createTextNode(text) {\n return this.document.createTextNode(text);\n }\n createComment(data) {\n return this.document.createComment(data);\n }\n }\n var DOM;\n (function (DOM) {\n class TreeConstruction extends DOMOperations {\n createElementNS(namespace, tag) {\n return this.document.createElementNS(namespace, tag);\n }\n setAttribute(element, name, value, namespace = null) {\n if (namespace) {\n element.setAttributeNS(namespace, name, value);\n } else {\n element.setAttribute(name, value);\n }\n }\n }\n DOM.TreeConstruction = TreeConstruction;\n let appliedTreeContruction = TreeConstruction;\n appliedTreeContruction = applyTextNodeMergingFix(doc, appliedTreeContruction);\n appliedTreeContruction = applySVGInnerHTMLFix(doc, appliedTreeContruction, SVG_NAMESPACE$1);\n DOM.DOMTreeConstruction = appliedTreeContruction;\n })(DOM || (DOM = {}));\n class DOMChanges extends DOMOperations {\n constructor(document) {\n super(document);\n this.document = document;\n this.namespace = null;\n }\n setAttribute(element, name, value) {\n element.setAttribute(name, value);\n }\n removeAttribute(element, name) {\n element.removeAttribute(name);\n }\n insertAfter(element, node, reference) {\n this.insertBefore(element, node, reference.nextSibling);\n }\n }\n function insertHTMLBefore(useless, _parent, _nextSibling, _html) {\n let parent = _parent;\n let nextSibling = _nextSibling;\n let prev = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n let last;\n let html = _html || '';\n if (nextSibling === null) {\n parent.insertAdjacentHTML('beforeend', html);\n last = parent.lastChild;\n } else if (nextSibling instanceof HTMLElement) {\n nextSibling.insertAdjacentHTML('beforebegin', html);\n last = nextSibling.previousSibling;\n } else {\n // Non-element nodes do not support insertAdjacentHTML, so add an\n // element and call it on that element. Then remove the element.\n //\n // This also protects Edge, IE and Firefox w/o the inspector open\n // from merging adjacent text nodes. See ./compat/text-node-merging-fix.ts\n parent.insertBefore(useless, nextSibling);\n useless.insertAdjacentHTML('beforebegin', html);\n last = useless.previousSibling;\n parent.removeChild(useless);\n }\n let first = prev ? prev.nextSibling : parent.firstChild;\n return new ConcreteBounds(parent, first, last);\n }\n let helper = DOMChanges;\n helper = applyTextNodeMergingFix(doc, helper);\n helper = applySVGInnerHTMLFix(doc, helper, SVG_NAMESPACE$1);\n var helper$1 = helper;\n const DOMTreeConstruction = DOM.DOMTreeConstruction;\n\n const badProtocols = ['javascript:', 'vbscript:'];\n const badTags = ['A', 'BODY', 'LINK', 'IMG', 'IFRAME', 'BASE', 'FORM'];\n const badTagsForDataURI = ['EMBED'];\n const badAttributes = ['href', 'src', 'background', 'action'];\n const badAttributesForDataURI = ['src'];\n function has(array, item) {\n return array.indexOf(item) !== -1;\n }\n function checkURI(tagName, attribute) {\n return (tagName === null || has(badTags, tagName)) && has(badAttributes, attribute);\n }\n function checkDataURI(tagName, attribute) {\n if (tagName === null) return false;\n return has(badTagsForDataURI, tagName) && has(badAttributesForDataURI, attribute);\n }\n function requiresSanitization(tagName, attribute) {\n return checkURI(tagName, attribute) || checkDataURI(tagName, attribute);\n }\n function sanitizeAttributeValue(env, element, attribute, value) {\n let tagName = null;\n if (value === null || value === undefined) {\n return value;\n }\n if (isSafeString(value)) {\n return value.toHTML();\n }\n if (!element) {\n tagName = null;\n } else {\n tagName = element.tagName.toUpperCase();\n }\n let str = normalizeStringValue(value);\n if (checkURI(tagName, attribute)) {\n let protocol = env.protocolForURL(str);\n if (has(badProtocols, protocol)) {\n return `unsafe:${str}`;\n }\n }\n if (checkDataURI(tagName, attribute)) {\n return `unsafe:${str}`;\n }\n return str;\n }\n\n /*\n * @method normalizeProperty\n * @param element {HTMLElement}\n * @param slotName {String}\n * @returns {Object} { name, type }\n */\n function normalizeProperty(element, slotName) {\n let type, normalized;\n if (slotName in element) {\n normalized = slotName;\n type = 'prop';\n } else {\n let lower = slotName.toLowerCase();\n if (lower in element) {\n type = 'prop';\n normalized = lower;\n } else {\n type = 'attr';\n normalized = slotName;\n }\n }\n if (type === 'prop' && (normalized.toLowerCase() === 'style' || preferAttr(element.tagName, normalized))) {\n type = 'attr';\n }\n return { normalized, type };\n }\n // properties that MUST be set as attributes, due to:\n // * browser bug\n // * strange spec outlier\n const ATTR_OVERRIDES = {\n INPUT: {\n form: true,\n // Chrome 46.0.2464.0: 'autocorrect' in document.createElement('input') === false\n // Safari 8.0.7: 'autocorrect' in document.createElement('input') === false\n // Mobile Safari (iOS 8.4 simulator): 'autocorrect' in document.createElement('input') === true\n autocorrect: true,\n // Chrome 54.0.2840.98: 'list' in document.createElement('input') === true\n // Safari 9.1.3: 'list' in document.createElement('input') === false\n list: true\n },\n // element.form is actually a legitimate readOnly property, that is to be\n // mutated, but must be mutated by setAttribute...\n SELECT: { form: true },\n OPTION: { form: true },\n TEXTAREA: { form: true },\n LABEL: { form: true },\n FIELDSET: { form: true },\n LEGEND: { form: true },\n OBJECT: { form: true },\n BUTTON: { form: true }\n };\n function preferAttr(tagName, propName) {\n let tag = ATTR_OVERRIDES[tagName.toUpperCase()];\n return tag && tag[propName.toLowerCase()] || false;\n }\n\n function dynamicAttribute(element, attr, namespace) {\n let { tagName, namespaceURI } = element;\n let attribute = { element, name: attr, namespace };\n if (namespaceURI === SVG_NAMESPACE$1) {\n return buildDynamicAttribute(tagName, attr, attribute);\n }\n let { type, normalized } = normalizeProperty(element, attr);\n if (type === 'attr') {\n return buildDynamicAttribute(tagName, normalized, attribute);\n } else {\n return buildDynamicProperty(tagName, normalized, attribute);\n }\n }\n function buildDynamicAttribute(tagName, name, attribute) {\n if (requiresSanitization(tagName, name)) {\n return new SafeDynamicAttribute(attribute);\n } else {\n return new SimpleDynamicAttribute(attribute);\n }\n }\n function buildDynamicProperty(tagName, name, attribute) {\n if (requiresSanitization(tagName, name)) {\n return new SafeDynamicProperty(name, attribute);\n }\n if (isUserInputValue(tagName, name)) {\n return new InputValueDynamicAttribute(name, attribute);\n }\n if (isOptionSelected(tagName, name)) {\n return new OptionSelectedDynamicAttribute(name, attribute);\n }\n return new DefaultDynamicProperty(name, attribute);\n }\n class DynamicAttribute {\n constructor(attribute) {\n this.attribute = attribute;\n }\n }\n class SimpleDynamicAttribute extends DynamicAttribute {\n set(dom, value, _env) {\n let normalizedValue = normalizeValue(value);\n if (normalizedValue !== null) {\n let { name, namespace } = this.attribute;\n dom.__setAttribute(name, normalizedValue, namespace);\n }\n }\n update(value, _env) {\n let normalizedValue = normalizeValue(value);\n let { element, name } = this.attribute;\n if (normalizedValue === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, normalizedValue);\n }\n }\n }\n class DefaultDynamicProperty extends DynamicAttribute {\n constructor(normalizedName, attribute) {\n super(attribute);\n this.normalizedName = normalizedName;\n }\n set(dom, value, _env) {\n if (value !== null && value !== undefined) {\n this.value = value;\n dom.__setProperty(this.normalizedName, value);\n }\n }\n update(value, _env) {\n let { element } = this.attribute;\n if (this.value !== value) {\n element[this.normalizedName] = this.value = value;\n if (value === null || value === undefined) {\n this.removeAttribute();\n }\n }\n }\n removeAttribute() {\n // TODO this sucks but to preserve properties first and to meet current\n // semantics we must do this.\n let { element, namespace } = this.attribute;\n if (namespace) {\n element.removeAttributeNS(namespace, this.normalizedName);\n } else {\n element.removeAttribute(this.normalizedName);\n }\n }\n }\n class SafeDynamicProperty extends DefaultDynamicProperty {\n set(dom, value, env) {\n let { element, name } = this.attribute;\n let sanitized = sanitizeAttributeValue(env, element, name, value);\n super.set(dom, sanitized, env);\n }\n update(value, env) {\n let { element, name } = this.attribute;\n let sanitized = sanitizeAttributeValue(env, element, name, value);\n super.update(sanitized, env);\n }\n }\n class SafeDynamicAttribute extends SimpleDynamicAttribute {\n set(dom, value, env) {\n let { element, name } = this.attribute;\n let sanitized = sanitizeAttributeValue(env, element, name, value);\n super.set(dom, sanitized, env);\n }\n update(value, env) {\n let { element, name } = this.attribute;\n let sanitized = sanitizeAttributeValue(env, element, name, value);\n super.update(sanitized, env);\n }\n }\n class InputValueDynamicAttribute extends DefaultDynamicProperty {\n set(dom, value) {\n dom.__setProperty('value', normalizeStringValue(value));\n }\n update(value) {\n let input = this.attribute.element;\n let currentValue = input.value;\n let normalizedValue = normalizeStringValue(value);\n if (currentValue !== normalizedValue) {\n input.value = normalizedValue;\n }\n }\n }\n class OptionSelectedDynamicAttribute extends DefaultDynamicProperty {\n set(dom, value) {\n if (value !== null && value !== undefined && value !== false) {\n dom.__setProperty('selected', true);\n }\n }\n update(value) {\n let option = this.attribute.element;\n if (value) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n }\n }\n function isOptionSelected(tagName, attribute) {\n return tagName === 'OPTION' && attribute === 'selected';\n }\n function isUserInputValue(tagName, attribute) {\n return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value';\n }\n function normalizeValue(value) {\n if (value === false || value === undefined || value === null || typeof value.toString === 'undefined') {\n return null;\n }\n if (value === true) {\n return '';\n }\n // onclick function etc in SSR\n if (typeof value === 'function') {\n return null;\n }\n return String(value);\n }\n\n class Scope {\n constructor(\n // the 0th slot is `self`\n slots, callerScope,\n // named arguments and blocks passed to a layout that uses eval\n evalScope,\n // locals in scope when the partial was invoked\n partialMap) {\n this.slots = slots;\n this.callerScope = callerScope;\n this.evalScope = evalScope;\n this.partialMap = partialMap;\n }\n static root(self, size = 0) {\n let refs = new Array(size + 1);\n for (let i = 0; i <= size; i++) {\n refs[i] = UNDEFINED_REFERENCE;\n }\n return new Scope(refs, null, null, null).init({ self });\n }\n static sized(size = 0) {\n let refs = new Array(size + 1);\n for (let i = 0; i <= size; i++) {\n refs[i] = UNDEFINED_REFERENCE;\n }\n return new Scope(refs, null, null, null);\n }\n init({ self }) {\n this.slots[0] = self;\n return this;\n }\n getSelf() {\n return this.get(0);\n }\n getSymbol(symbol) {\n return this.get(symbol);\n }\n getBlock(symbol) {\n let block = this.get(symbol);\n return block === UNDEFINED_REFERENCE ? null : block;\n }\n getEvalScope() {\n return this.evalScope;\n }\n getPartialMap() {\n return this.partialMap;\n }\n bind(symbol, value) {\n this.set(symbol, value);\n }\n bindSelf(self) {\n this.set(0, self);\n }\n bindSymbol(symbol, value) {\n this.set(symbol, value);\n }\n bindBlock(symbol, value) {\n this.set(symbol, value);\n }\n bindEvalScope(map) {\n this.evalScope = map;\n }\n bindPartialMap(map) {\n this.partialMap = map;\n }\n bindCallerScope(scope) {\n this.callerScope = scope;\n }\n getCallerScope() {\n return this.callerScope;\n }\n child() {\n return new Scope(this.slots.slice(), this.callerScope, this.evalScope, this.partialMap);\n }\n get(index) {\n if (index >= this.slots.length) {\n throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);\n }\n return this.slots[index];\n }\n set(index, value) {\n if (index >= this.slots.length) {\n throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);\n }\n this.slots[index] = value;\n }\n }\n class Transaction {\n constructor() {\n this.scheduledInstallManagers = [];\n this.scheduledInstallModifiers = [];\n this.scheduledUpdateModifierManagers = [];\n this.scheduledUpdateModifiers = [];\n this.createdComponents = [];\n this.createdManagers = [];\n this.updatedComponents = [];\n this.updatedManagers = [];\n this.destructors = [];\n }\n didCreate(component, manager) {\n this.createdComponents.push(component);\n this.createdManagers.push(manager);\n }\n didUpdate(component, manager) {\n this.updatedComponents.push(component);\n this.updatedManagers.push(manager);\n }\n scheduleInstallModifier(modifier, manager) {\n this.scheduledInstallManagers.push(manager);\n this.scheduledInstallModifiers.push(modifier);\n }\n scheduleUpdateModifier(modifier, manager) {\n this.scheduledUpdateModifierManagers.push(manager);\n this.scheduledUpdateModifiers.push(modifier);\n }\n didDestroy(d) {\n this.destructors.push(d);\n }\n commit() {\n let { createdComponents, createdManagers } = this;\n for (let i = 0; i < createdComponents.length; i++) {\n let component = createdComponents[i];\n let manager = createdManagers[i];\n manager.didCreate(component);\n }\n let { updatedComponents, updatedManagers } = this;\n for (let i = 0; i < updatedComponents.length; i++) {\n let component = updatedComponents[i];\n let manager = updatedManagers[i];\n manager.didUpdate(component);\n }\n let { destructors } = this;\n for (let i = 0; i < destructors.length; i++) {\n destructors[i].destroy();\n }\n let { scheduledInstallManagers, scheduledInstallModifiers } = this;\n for (let i = 0; i < scheduledInstallManagers.length; i++) {\n let manager = scheduledInstallManagers[i];\n let modifier = scheduledInstallModifiers[i];\n manager.install(modifier);\n }\n let { scheduledUpdateModifierManagers, scheduledUpdateModifiers } = this;\n for (let i = 0; i < scheduledUpdateModifierManagers.length; i++) {\n let manager = scheduledUpdateModifierManagers[i];\n let modifier = scheduledUpdateModifiers[i];\n manager.update(modifier);\n }\n }\n }\n class Environment {\n constructor({ appendOperations, updateOperations }) {\n this._transaction = null;\n this.appendOperations = appendOperations;\n this.updateOperations = updateOperations;\n }\n toConditionalReference(reference) {\n return new ConditionalReference(reference);\n }\n getAppendOperations() {\n return this.appendOperations;\n }\n getDOM() {\n return this.updateOperations;\n }\n begin() {\n\n this._transaction = new Transaction();\n }\n get transaction() {\n return this._transaction;\n }\n didCreate(component, manager) {\n this.transaction.didCreate(component, manager);\n }\n didUpdate(component, manager) {\n this.transaction.didUpdate(component, manager);\n }\n scheduleInstallModifier(modifier, manager) {\n this.transaction.scheduleInstallModifier(modifier, manager);\n }\n scheduleUpdateModifier(modifier, manager) {\n this.transaction.scheduleUpdateModifier(modifier, manager);\n }\n didDestroy(d) {\n this.transaction.didDestroy(d);\n }\n commit() {\n let transaction = this.transaction;\n this._transaction = null;\n transaction.commit();\n }\n attributeFor(element, attr, _isTrusting, namespace = null) {\n return dynamicAttribute(element, attr, namespace);\n }\n }\n class DefaultEnvironment extends Environment {\n constructor(options) {\n if (!options) {\n let document = window.document;\n let appendOperations = new DOMTreeConstruction(document);\n let updateOperations = new DOMChanges(document);\n options = { appendOperations, updateOperations };\n }\n super(options);\n }\n }\n\n class LowLevelVM {\n constructor(stack, heap, program, externs, pc = -1, ra = -1) {\n this.stack = stack;\n this.heap = heap;\n this.program = program;\n this.externs = externs;\n this.pc = pc;\n this.ra = ra;\n this.currentOpSize = 0;\n }\n // Start a new frame and save $ra and $fp on the stack\n pushFrame() {\n this.stack.pushSmi(this.ra);\n this.stack.pushSmi(this.stack.fp);\n this.stack.fp = this.stack.sp - 1;\n }\n // Restore $ra, $sp and $fp\n popFrame() {\n this.stack.sp = this.stack.fp - 1;\n this.ra = this.stack.getSmi(0);\n this.stack.fp = this.stack.getSmi(1);\n }\n pushSmallFrame() {\n this.stack.pushSmi(this.ra);\n }\n popSmallFrame() {\n this.ra = this.stack.popSmi();\n }\n // Jump to an address in `program`\n goto(offset) {\n let addr = this.pc + offset - this.currentOpSize;\n this.pc = addr;\n }\n // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)\n call(handle) {\n this.ra = this.pc;\n this.pc = this.heap.getaddr(handle);\n }\n // Put a specific `program` address in $ra\n returnTo(offset) {\n let addr = this.pc + offset - this.currentOpSize;\n this.ra = addr;\n }\n // Return to the `program` address stored in $ra\n return() {\n this.pc = this.ra;\n }\n nextStatement() {\n let { pc, program } = this;\n if (pc === -1) {\n return null;\n }\n // We have to save off the current operations size so that\n // when we do a jump we can calculate the correct offset\n // to where we are going. We can't simply ask for the size\n // in a jump because we have have already incremented the\n // program counter to the next instruction prior to executing.\n let { size } = this.program.opcode(pc);\n let operationSize = this.currentOpSize = size;\n this.pc += operationSize;\n return program.opcode(pc);\n }\n evaluateOuter(opcode, vm) {\n {\n this.evaluateInner(opcode, vm);\n }\n }\n evaluateInner(opcode, vm) {\n if (opcode.isMachine) {\n this.evaluateMachine(opcode);\n } else {\n this.evaluateSyscall(opcode, vm);\n }\n }\n evaluateMachine(opcode) {\n switch (opcode.type) {\n case 57 /* PushFrame */:\n return this.pushFrame();\n case 58 /* PopFrame */:\n return this.popFrame();\n case 59 /* PushSmallFrame */:\n return this.pushSmallFrame();\n case 60 /* PopSmallFrame */:\n return this.popSmallFrame();\n case 50 /* InvokeStatic */:\n return this.call(opcode.op1);\n case 49 /* InvokeVirtual */:\n return this.call(this.stack.popSmi());\n case 52 /* Jump */:\n return this.goto(opcode.op1);\n case 24 /* Return */:\n return this.return();\n case 25 /* ReturnTo */:\n return this.returnTo(opcode.op1);\n }\n }\n evaluateSyscall(opcode, vm) {\n APPEND_OPCODES.evaluate(vm, opcode, opcode.type);\n }\n }\n\n class First {\n constructor(node) {\n this.node = node;\n }\n firstNode() {\n return this.node;\n }\n }\n class Last {\n constructor(node) {\n this.node = node;\n }\n lastNode() {\n return this.node;\n }\n }\n class NewElementBuilder {\n constructor(env, parentNode, nextSibling) {\n this.constructing = null;\n this.operations = null;\n this.cursorStack = new _util.Stack();\n this.blockStack = new _util.Stack();\n this.pushElement(parentNode, nextSibling);\n this.env = env;\n this.dom = env.getAppendOperations();\n this.updateOperations = env.getDOM();\n }\n static forInitialRender(env, cursor) {\n let builder = new this(env, cursor.element, cursor.nextSibling);\n builder.pushSimpleBlock();\n return builder;\n }\n static resume(env, tracker, nextSibling) {\n let parentNode = tracker.parentElement();\n let stack = new this(env, parentNode, nextSibling);\n stack.pushSimpleBlock();\n stack.pushBlockTracker(tracker);\n return stack;\n }\n get element() {\n return this.cursorStack.current.element;\n }\n get nextSibling() {\n return this.cursorStack.current.nextSibling;\n }\n expectConstructing(method) {\n return this.constructing;\n }\n block() {\n return this.blockStack.current;\n }\n popElement() {\n this.cursorStack.pop();\n this.cursorStack.current;\n }\n pushSimpleBlock() {\n return this.pushBlockTracker(new SimpleBlockTracker(this.element));\n }\n pushUpdatableBlock() {\n return this.pushBlockTracker(new UpdatableBlockTracker(this.element));\n }\n pushBlockList(list) {\n return this.pushBlockTracker(new BlockListTracker(this.element, list));\n }\n pushBlockTracker(tracker, isRemote = false) {\n let current = this.blockStack.current;\n if (current !== null) {\n current.newDestroyable(tracker);\n if (!isRemote) {\n current.didAppendBounds(tracker);\n }\n }\n this.__openBlock();\n this.blockStack.push(tracker);\n return tracker;\n }\n popBlock() {\n this.block().finalize(this);\n this.__closeBlock();\n return this.blockStack.pop();\n }\n __openBlock() {}\n __closeBlock() {}\n // todo return seems unused\n openElement(tag) {\n let element = this.__openElement(tag);\n this.constructing = element;\n return element;\n }\n __openElement(tag) {\n return this.dom.createElement(tag, this.element);\n }\n flushElement() {\n let parent = this.element;\n let element = this.constructing;\n this.__flushElement(parent, element);\n this.constructing = null;\n this.operations = null;\n this.pushElement(element, null);\n this.didOpenElement(element);\n }\n __flushElement(parent, constructing) {\n this.dom.insertBefore(parent, constructing, this.nextSibling);\n }\n closeElement() {\n this.willCloseElement();\n this.popElement();\n }\n pushRemoteElement(element, guid, nextSibling = null) {\n this.__pushRemoteElement(element, guid, nextSibling);\n }\n __pushRemoteElement(element, _guid, nextSibling) {\n this.pushElement(element, nextSibling);\n let tracker = new RemoteBlockTracker(element);\n this.pushBlockTracker(tracker, true);\n }\n popRemoteElement() {\n this.popBlock();\n this.popElement();\n }\n pushElement(element, nextSibling) {\n this.cursorStack.push(new Cursor(element, nextSibling));\n }\n didAddDestroyable(d) {\n this.block().newDestroyable(d);\n }\n didAppendBounds(bounds$$1) {\n this.block().didAppendBounds(bounds$$1);\n return bounds$$1;\n }\n didAppendNode(node) {\n this.block().didAppendNode(node);\n return node;\n }\n didOpenElement(element) {\n this.block().openElement(element);\n return element;\n }\n willCloseElement() {\n this.block().closeElement();\n }\n appendText(string) {\n return this.didAppendNode(this.__appendText(string));\n }\n __appendText(text) {\n let { dom, element, nextSibling } = this;\n let node = dom.createTextNode(text);\n dom.insertBefore(element, node, nextSibling);\n return node;\n }\n __appendNode(node) {\n this.dom.insertBefore(this.element, node, this.nextSibling);\n return node;\n }\n __appendFragment(fragment) {\n let first = fragment.firstChild;\n if (first) {\n let ret = bounds(this.element, first, fragment.lastChild);\n this.dom.insertBefore(this.element, fragment, this.nextSibling);\n return ret;\n } else {\n return single(this.element, this.__appendComment(''));\n }\n }\n __appendHTML(html) {\n return this.dom.insertHTMLBefore(this.element, this.nextSibling, html);\n }\n appendDynamicHTML(value) {\n let bounds$$1 = this.trustedContent(value);\n this.didAppendBounds(bounds$$1);\n }\n appendDynamicText(value) {\n let node = this.untrustedContent(value);\n this.didAppendNode(node);\n return node;\n }\n appendDynamicFragment(value) {\n let bounds$$1 = this.__appendFragment(value);\n this.didAppendBounds(bounds$$1);\n }\n appendDynamicNode(value) {\n let node = this.__appendNode(value);\n let bounds$$1 = single(this.element, node);\n this.didAppendBounds(bounds$$1);\n }\n trustedContent(value) {\n return this.__appendHTML(value);\n }\n untrustedContent(value) {\n return this.__appendText(value);\n }\n appendComment(string) {\n return this.didAppendNode(this.__appendComment(string));\n }\n __appendComment(string) {\n let { dom, element, nextSibling } = this;\n let node = dom.createComment(string);\n dom.insertBefore(element, node, nextSibling);\n return node;\n }\n __setAttribute(name, value, namespace) {\n this.dom.setAttribute(this.constructing, name, value, namespace);\n }\n __setProperty(name, value) {\n this.constructing[name] = value;\n }\n setStaticAttribute(name, value, namespace) {\n this.__setAttribute(name, value, namespace);\n }\n setDynamicAttribute(name, value, trusting, namespace) {\n let element = this.constructing;\n let attribute = this.env.attributeFor(element, name, trusting, namespace);\n attribute.set(this, value, this.env);\n return attribute;\n }\n }\n class SimpleBlockTracker {\n constructor(parent) {\n this.parent = parent;\n this.first = null;\n this.last = null;\n this.destroyables = null;\n this.nesting = 0;\n }\n destroy() {\n let { destroyables } = this;\n if (destroyables && destroyables.length) {\n for (let i = 0; i < destroyables.length; i++) {\n destroyables[i].destroy();\n }\n }\n }\n parentElement() {\n return this.parent;\n }\n firstNode() {\n return this.first && this.first.firstNode();\n }\n lastNode() {\n return this.last && this.last.lastNode();\n }\n openElement(element) {\n this.didAppendNode(element);\n this.nesting++;\n }\n closeElement() {\n this.nesting--;\n }\n didAppendNode(node) {\n if (this.nesting !== 0) return;\n if (!this.first) {\n this.first = new First(node);\n }\n this.last = new Last(node);\n }\n didAppendBounds(bounds$$1) {\n if (this.nesting !== 0) return;\n if (!this.first) {\n this.first = bounds$$1;\n }\n this.last = bounds$$1;\n }\n newDestroyable(d) {\n this.destroyables = this.destroyables || [];\n this.destroyables.push(d);\n }\n finalize(stack) {\n if (this.first === null) {\n stack.appendComment('');\n }\n }\n }\n class RemoteBlockTracker extends SimpleBlockTracker {\n destroy() {\n super.destroy();\n clear(this);\n }\n }\n class UpdatableBlockTracker extends SimpleBlockTracker {\n reset(env) {\n let { destroyables } = this;\n if (destroyables && destroyables.length) {\n for (let i = 0; i < destroyables.length; i++) {\n env.didDestroy(destroyables[i]);\n }\n }\n let nextSibling = clear(this);\n this.first = null;\n this.last = null;\n this.destroyables = null;\n this.nesting = 0;\n return nextSibling;\n }\n }\n class BlockListTracker {\n constructor(parent, boundList) {\n this.parent = parent;\n this.boundList = boundList;\n this.parent = parent;\n this.boundList = boundList;\n }\n destroy() {\n this.boundList.forEachNode(node => node.destroy());\n }\n parentElement() {\n return this.parent;\n }\n firstNode() {\n let head = this.boundList.head();\n return head && head.firstNode();\n }\n lastNode() {\n let tail = this.boundList.tail();\n return tail && tail.lastNode();\n }\n openElement(_element) {}\n closeElement() {}\n didAppendNode(_node) {}\n didAppendBounds(_bounds) {}\n newDestroyable(_d) {}\n finalize(_stack) {}\n }\n function clientBuilder(env, cursor) {\n return NewElementBuilder.forInitialRender(env, cursor);\n }\n\n const HI = 0x80000000;\n const MASK = 0x7fffffff;\n class InnerStack {\n constructor(inner = new _lowLevel.Stack(), js = []) {\n this.inner = inner;\n this.js = js;\n }\n slice(start, end) {\n let inner;\n if (typeof start === 'number' && typeof end === 'number') {\n inner = this.inner.slice(start, end);\n } else if (typeof start === 'number' && end === undefined) {\n inner = this.inner.sliceFrom(start);\n } else {\n inner = this.inner.clone();\n }\n return new InnerStack(inner, this.js.slice(start, end));\n }\n sliceInner(start, end) {\n let out = [];\n for (let i = start; i < end; i++) {\n out.push(this.get(i));\n }\n return out;\n }\n copy(from, to) {\n this.inner.copy(from, to);\n }\n write(pos, value) {\n if (isImmediate(value)) {\n this.inner.writeRaw(pos, encodeImmediate(value));\n } else {\n let idx = this.js.length;\n this.js.push(value);\n this.inner.writeRaw(pos, idx | HI);\n }\n }\n writeSmi(pos, value) {\n this.inner.writeSmi(pos, value);\n }\n writeImmediate(pos, value) {\n this.inner.writeRaw(pos, value);\n }\n get(pos) {\n let value = this.inner.getRaw(pos);\n if (value & HI) {\n return this.js[value & MASK];\n } else {\n return decodeImmediate(value);\n }\n }\n getSmi(pos) {\n return this.inner.getSmi(pos);\n }\n reset() {\n this.inner.reset();\n this.js.length = 0;\n }\n get length() {\n return this.inner.len();\n }\n }\n class EvaluationStack {\n constructor(stack, fp, sp) {\n this.stack = stack;\n this.fp = fp;\n this.sp = sp;\n }\n static empty() {\n return new this(new InnerStack(), 0, -1);\n }\n static restore(snapshot) {\n let stack = new InnerStack();\n for (let i = 0; i < snapshot.length; i++) {\n stack.write(i, snapshot[i]);\n }\n return new this(stack, 0, snapshot.length - 1);\n }\n push(value) {\n this.stack.write(++this.sp, value);\n }\n pushSmi(value) {\n this.stack.writeSmi(++this.sp, value);\n }\n pushImmediate(value) {\n this.stack.writeImmediate(++this.sp, encodeImmediate(value));\n }\n pushEncodedImmediate(value) {\n this.stack.writeImmediate(++this.sp, value);\n }\n pushNull() {\n this.stack.writeImmediate(++this.sp, 19 /* Null */);\n }\n dup(position = this.sp) {\n this.stack.copy(position, ++this.sp);\n }\n copy(from, to) {\n this.stack.copy(from, to);\n }\n pop(n = 1) {\n let top = this.stack.get(this.sp);\n this.sp -= n;\n return top;\n }\n popSmi() {\n return this.stack.getSmi(this.sp--);\n }\n peek(offset = 0) {\n return this.stack.get(this.sp - offset);\n }\n peekSmi(offset = 0) {\n return this.stack.getSmi(this.sp - offset);\n }\n get(offset, base = this.fp) {\n return this.stack.get(base + offset);\n }\n getSmi(offset, base = this.fp) {\n return this.stack.getSmi(base + offset);\n }\n set(value, offset, base = this.fp) {\n this.stack.write(base + offset, value);\n }\n slice(start, end) {\n return this.stack.slice(start, end);\n }\n sliceArray(start, end) {\n return this.stack.sliceInner(start, end);\n }\n capture(items) {\n let end = this.sp + 1;\n let start = end - items;\n return this.stack.sliceInner(start, end);\n }\n reset() {\n this.stack.reset();\n }\n toArray() {\n return this.stack.sliceInner(this.fp, this.sp + 1);\n }\n }\n function isImmediate(value) {\n let type = typeof value;\n if (value === null || value === undefined) return true;\n switch (type) {\n case 'boolean':\n case 'undefined':\n return true;\n case 'number':\n // not an integer\n if (value % 1 !== 0) return false;\n let abs = Math.abs(value);\n // too big\n if (abs > HI) return false;\n return true;\n default:\n return false;\n }\n }\n function encodeSmi(primitive) {\n if (primitive < 0) {\n return Math.abs(primitive) << 3 | 4 /* NEGATIVE */;\n } else {\n return primitive << 3 | 0 /* NUMBER */;\n }\n }\n function encodeImmediate(primitive) {\n switch (typeof primitive) {\n case 'number':\n return encodeSmi(primitive);\n case 'boolean':\n return primitive ? 11 /* True */ : 3 /* False */;\n case 'object':\n // assume null\n return 19 /* Null */;\n case 'undefined':\n return 27 /* Undef */;\n default:\n throw (0, _util.unreachable)();\n }\n }\n function decodeSmi(smi) {\n switch (smi & 0b111) {\n case 0 /* NUMBER */:\n return smi >> 3;\n case 4 /* NEGATIVE */:\n return -(smi >> 3);\n default:\n throw (0, _util.unreachable)();\n }\n }\n function decodeImmediate(immediate) {\n switch (immediate) {\n case 3 /* False */:\n return false;\n case 11 /* True */:\n return true;\n case 19 /* Null */:\n return null;\n case 27 /* Undef */:\n return undefined;\n default:\n return decodeSmi(immediate);\n }\n }\n\n class UpdatingVM {\n constructor(env, program, { alwaysRevalidate = false }) {\n this.frameStack = new _util.Stack();\n this.env = env;\n this.constants = program.constants;\n this.dom = env.getDOM();\n this.alwaysRevalidate = alwaysRevalidate;\n }\n execute(opcodes, handler) {\n let { frameStack } = this;\n this.try(opcodes, handler);\n while (true) {\n if (frameStack.isEmpty()) break;\n let opcode = this.frame.nextStatement();\n if (opcode === null) {\n this.frameStack.pop();\n continue;\n }\n opcode.evaluate(this);\n }\n }\n get frame() {\n return this.frameStack.current;\n }\n goto(op) {\n this.frame.goto(op);\n }\n try(ops, handler) {\n this.frameStack.push(new UpdatingVMFrame(ops, handler));\n }\n throw() {\n this.frame.handleException();\n this.frameStack.pop();\n }\n }\n class BlockOpcode extends UpdatingOpcode {\n constructor(start, state, runtime, bounds$$1, children) {\n super();\n this.start = start;\n this.state = state;\n this.runtime = runtime;\n this.type = 'block';\n this.next = null;\n this.prev = null;\n this.children = children;\n this.bounds = bounds$$1;\n }\n parentElement() {\n return this.bounds.parentElement();\n }\n firstNode() {\n return this.bounds.firstNode();\n }\n lastNode() {\n return this.bounds.lastNode();\n }\n evaluate(vm) {\n vm.try(this.children, null);\n }\n destroy() {\n this.bounds.destroy();\n }\n didDestroy() {\n this.runtime.env.didDestroy(this.bounds);\n }\n }\n class TryOpcode extends BlockOpcode {\n constructor(start, state, runtime, bounds$$1, children) {\n super(start, state, runtime, bounds$$1, children);\n this.type = 'try';\n this.tag = this._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n }\n didInitializeChildren() {\n this._tag.inner.update((0, _reference.combineSlice)(this.children));\n }\n evaluate(vm) {\n vm.try(this.children, this);\n }\n handleException() {\n let { state, bounds: bounds$$1, children, start, prev, next, runtime } = this;\n children.clear();\n let elementStack = NewElementBuilder.resume(runtime.env, bounds$$1, bounds$$1.reset(runtime.env));\n let vm = VM.resume(state, runtime, elementStack);\n let updating = new _util.LinkedList();\n vm.execute(start, vm => {\n vm.stack = EvaluationStack.restore(state.stack);\n vm.updatingOpcodeStack.push(updating);\n vm.updateWith(this);\n vm.updatingOpcodeStack.push(children);\n });\n this.prev = prev;\n this.next = next;\n }\n }\n class ListRevalidationDelegate {\n constructor(opcode, marker) {\n this.opcode = opcode;\n this.marker = marker;\n this.didInsert = false;\n this.didDelete = false;\n this.map = opcode.map;\n this.updating = opcode['children'];\n }\n insert(key, item, memo, before) {\n let { map, opcode, updating } = this;\n let nextSibling = null;\n let reference = null;\n if (typeof before === 'string') {\n reference = map[before];\n nextSibling = reference['bounds'].firstNode();\n } else {\n nextSibling = this.marker;\n }\n let vm = opcode.vmForInsertion(nextSibling);\n let tryOpcode = null;\n let { start } = opcode;\n vm.execute(start, vm => {\n map[key] = tryOpcode = vm.iterate(memo, item);\n vm.updatingOpcodeStack.push(new _util.LinkedList());\n vm.updateWith(tryOpcode);\n vm.updatingOpcodeStack.push(tryOpcode.children);\n });\n updating.insertBefore(tryOpcode, reference);\n this.didInsert = true;\n }\n retain(_key, _item, _memo) {}\n move(key, _item, _memo, before) {\n let { map, updating } = this;\n let entry = map[key];\n let reference = map[before] || null;\n if (typeof before === 'string') {\n move(entry, reference.firstNode());\n } else {\n move(entry, this.marker);\n }\n updating.remove(entry);\n updating.insertBefore(entry, reference);\n }\n delete(key) {\n let { map } = this;\n let opcode = map[key];\n opcode.didDestroy();\n clear(opcode);\n this.updating.remove(opcode);\n delete map[key];\n this.didDelete = true;\n }\n done() {\n this.opcode.didInitializeChildren(this.didInsert || this.didDelete);\n }\n }\n class ListBlockOpcode extends BlockOpcode {\n constructor(start, state, runtime, bounds$$1, children, artifacts) {\n super(start, state, runtime, bounds$$1, children);\n this.type = 'list-block';\n this.map = (0, _util.dict)();\n this.lastIterated = _reference.INITIAL;\n this.artifacts = artifacts;\n let _tag = this._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([artifacts.tag, _tag]);\n }\n didInitializeChildren(listDidChange = true) {\n this.lastIterated = this.artifacts.tag.value();\n if (listDidChange) {\n this._tag.inner.update((0, _reference.combineSlice)(this.children));\n }\n }\n evaluate(vm) {\n let { artifacts, lastIterated } = this;\n if (!artifacts.tag.validate(lastIterated)) {\n let { bounds: bounds$$1 } = this;\n let { dom } = vm;\n let marker = dom.createComment('');\n dom.insertAfter(bounds$$1.parentElement(), marker, bounds$$1.lastNode());\n let target = new ListRevalidationDelegate(this, marker);\n let synchronizer = new _reference.IteratorSynchronizer({ target, artifacts });\n synchronizer.sync();\n this.parentElement().removeChild(marker);\n }\n // Run now-updated updating opcodes\n super.evaluate(vm);\n }\n vmForInsertion(nextSibling) {\n let { bounds: bounds$$1, state, runtime } = this;\n let elementStack = NewElementBuilder.forInitialRender(runtime.env, {\n element: bounds$$1.parentElement(),\n nextSibling\n });\n return VM.resume(state, runtime, elementStack);\n }\n }\n class UpdatingVMFrame {\n constructor(ops, exceptionHandler) {\n this.ops = ops;\n this.exceptionHandler = exceptionHandler;\n this.current = ops.head();\n }\n goto(op) {\n this.current = op;\n }\n nextStatement() {\n let { current, ops } = this;\n if (current) this.current = ops.nextNode(current);\n return current;\n }\n handleException() {\n if (this.exceptionHandler) {\n this.exceptionHandler.handleException();\n }\n }\n }\n\n class RenderResult {\n constructor(env, program, updating, bounds$$1) {\n this.env = env;\n this.program = program;\n this.updating = updating;\n this.bounds = bounds$$1;\n }\n rerender({ alwaysRevalidate = false } = { alwaysRevalidate: false }) {\n let { env, program, updating } = this;\n let vm = new UpdatingVM(env, program, { alwaysRevalidate });\n vm.execute(updating, this);\n }\n parentElement() {\n return this.bounds.parentElement();\n }\n firstNode() {\n return this.bounds.firstNode();\n }\n lastNode() {\n return this.bounds.lastNode();\n }\n handleException() {\n throw 'this should never happen';\n }\n destroy() {\n this.bounds.destroy();\n clear(this.bounds);\n }\n }\n\n class Arguments {\n constructor() {\n this.stack = null;\n this.positional = new PositionalArguments();\n this.named = new NamedArguments();\n this.blocks = new BlockArguments();\n }\n empty(stack) {\n let base = stack.sp + 1;\n this.named.empty(stack, base);\n this.positional.empty(stack, base);\n this.blocks.empty(stack, base);\n return this;\n }\n setup(stack, names, blockNames, positionalCount, synthetic) {\n this.stack = stack;\n /*\n | ... | blocks | positional | named |\n | ... | b0 b1 | p0 p1 p2 p3 | n0 n1 |\n index | ... | 4/5/6 7/8/9 | 10 11 12 13 | 14 15 |\n ^ ^ ^ ^\n bbase pbase nbase sp\n */\n let named = this.named;\n let namedCount = names.length;\n let namedBase = stack.sp - namedCount + 1;\n named.setup(stack, namedBase, namedCount, names, synthetic);\n let positional = this.positional;\n let positionalBase = namedBase - positionalCount;\n positional.setup(stack, positionalBase, positionalCount);\n let blocks = this.blocks;\n let blocksCount = blockNames.length;\n let blocksBase = positionalBase - blocksCount * 3;\n blocks.setup(stack, blocksBase, blocksCount, blockNames);\n }\n get tag() {\n return (0, _reference.combineTagged)([this.positional, this.named]);\n }\n get base() {\n return this.blocks.base;\n }\n get length() {\n return this.positional.length + this.named.length + this.blocks.length * 3;\n }\n at(pos) {\n return this.positional.at(pos);\n }\n realloc(offset) {\n let { stack } = this;\n if (offset > 0 && stack !== null) {\n let { positional, named } = this;\n let newBase = positional.base + offset;\n let length = positional.length + named.length;\n for (let i = length - 1; i >= 0; i--) {\n stack.copy(i + positional.base, i + newBase);\n }\n positional.base += offset;\n named.base += offset;\n stack.sp += offset;\n }\n }\n capture() {\n let positional = this.positional.length === 0 ? EMPTY_POSITIONAL : this.positional.capture();\n let named = this.named.length === 0 ? EMPTY_NAMED : this.named.capture();\n return {\n tag: this.tag,\n length: this.length,\n positional,\n named\n };\n }\n clear() {\n let { stack, length } = this;\n if (length > 0 && stack !== null) stack.pop(length);\n }\n }\n class PositionalArguments {\n constructor() {\n this.base = 0;\n this.length = 0;\n this.stack = null;\n this._tag = null;\n this._references = null;\n }\n empty(stack, base) {\n this.stack = stack;\n this.base = base;\n this.length = 0;\n this._tag = _reference.CONSTANT_TAG;\n this._references = _util.EMPTY_ARRAY;\n }\n setup(stack, base, length) {\n this.stack = stack;\n this.base = base;\n this.length = length;\n if (length === 0) {\n this._tag = _reference.CONSTANT_TAG;\n this._references = _util.EMPTY_ARRAY;\n } else {\n this._tag = null;\n this._references = null;\n }\n }\n get tag() {\n let tag = this._tag;\n if (!tag) {\n tag = this._tag = (0, _reference.combineTagged)(this.references);\n }\n return tag;\n }\n at(position) {\n let { base, length, stack } = this;\n if (position < 0 || position >= length) {\n return UNDEFINED_REFERENCE;\n }\n return stack.get(position, base);\n }\n capture() {\n return new CapturedPositionalArguments(this.tag, this.references);\n }\n prepend(other) {\n let additions = other.length;\n if (additions > 0) {\n let { base, length, stack } = this;\n this.base = base = base - additions;\n this.length = length + additions;\n for (let i = 0; i < additions; i++) {\n stack.set(other.at(i), i, base);\n }\n this._tag = null;\n this._references = null;\n }\n }\n get references() {\n let references = this._references;\n if (!references) {\n let { stack, base, length } = this;\n references = this._references = stack.sliceArray(base, base + length);\n }\n return references;\n }\n }\n class CapturedPositionalArguments {\n constructor(tag, references, length = references.length) {\n this.tag = tag;\n this.references = references;\n this.length = length;\n }\n static empty() {\n return new CapturedPositionalArguments(_reference.CONSTANT_TAG, _util.EMPTY_ARRAY, 0);\n }\n at(position) {\n return this.references[position];\n }\n value() {\n return this.references.map(this.valueOf);\n }\n get(name) {\n let { references, length } = this;\n if (name === 'length') {\n return PrimitiveReference.create(length);\n } else {\n let idx = parseInt(name, 10);\n if (idx < 0 || idx >= length) {\n return UNDEFINED_REFERENCE;\n } else {\n return references[idx];\n }\n }\n }\n valueOf(reference) {\n return reference.value();\n }\n }\n class NamedArguments {\n constructor() {\n this.base = 0;\n this.length = 0;\n this._references = null;\n this._names = _util.EMPTY_ARRAY;\n this._atNames = _util.EMPTY_ARRAY;\n }\n empty(stack, base) {\n this.stack = stack;\n this.base = base;\n this.length = 0;\n this._references = _util.EMPTY_ARRAY;\n this._names = _util.EMPTY_ARRAY;\n this._atNames = _util.EMPTY_ARRAY;\n }\n setup(stack, base, length, names, synthetic) {\n this.stack = stack;\n this.base = base;\n this.length = length;\n if (length === 0) {\n this._references = _util.EMPTY_ARRAY;\n this._names = _util.EMPTY_ARRAY;\n this._atNames = _util.EMPTY_ARRAY;\n } else {\n this._references = null;\n if (synthetic) {\n this._names = names;\n this._atNames = null;\n } else {\n this._names = null;\n this._atNames = names;\n }\n }\n }\n get tag() {\n return (0, _reference.combineTagged)(this.references);\n }\n get names() {\n let names = this._names;\n if (!names) {\n names = this._names = this._atNames.map(this.toSyntheticName);\n }\n return names;\n }\n get atNames() {\n let atNames = this._atNames;\n if (!atNames) {\n atNames = this._atNames = this._names.map(this.toAtName);\n }\n return atNames;\n }\n has(name) {\n return this.names.indexOf(name) !== -1;\n }\n get(name, synthetic = true) {\n let { base, stack } = this;\n let names = synthetic ? this.names : this.atNames;\n let idx = names.indexOf(name);\n if (idx === -1) {\n return UNDEFINED_REFERENCE;\n }\n return stack.get(idx, base);\n }\n capture() {\n return new CapturedNamedArguments(this.tag, this.names, this.references);\n }\n merge(other) {\n let { length: extras } = other;\n if (extras > 0) {\n let { names, length, stack } = this;\n let { names: extraNames } = other;\n if (Object.isFrozen(names) && names.length === 0) {\n names = [];\n }\n for (let i = 0; i < extras; i++) {\n let name = extraNames[i];\n let idx = names.indexOf(name);\n if (idx === -1) {\n length = names.push(name);\n stack.push(other.references[i]);\n }\n }\n this.length = length;\n this._references = null;\n this._names = names;\n this._atNames = null;\n }\n }\n get references() {\n let references = this._references;\n if (!references) {\n let { base, length, stack } = this;\n references = this._references = stack.sliceArray(base, base + length);\n }\n return references;\n }\n toSyntheticName(name) {\n return name.slice(1);\n }\n toAtName(name) {\n return `@${name}`;\n }\n }\n class CapturedNamedArguments {\n constructor(tag, names, references) {\n this.tag = tag;\n this.names = names;\n this.references = references;\n this.length = names.length;\n this._map = null;\n }\n get map() {\n let map = this._map;\n if (!map) {\n let { names, references } = this;\n map = this._map = (0, _util.dict)();\n for (let i = 0; i < names.length; i++) {\n let name = names[i];\n map[name] = references[i];\n }\n }\n return map;\n }\n has(name) {\n return this.names.indexOf(name) !== -1;\n }\n get(name) {\n let { names, references } = this;\n let idx = names.indexOf(name);\n if (idx === -1) {\n return UNDEFINED_REFERENCE;\n } else {\n return references[idx];\n }\n }\n value() {\n let { names, references } = this;\n let out = (0, _util.dict)();\n for (let i = 0; i < names.length; i++) {\n let name = names[i];\n out[name] = references[i].value();\n }\n return out;\n }\n }\n class BlockArguments {\n constructor() {\n this.internalValues = null;\n this.internalTag = null;\n this.names = _util.EMPTY_ARRAY;\n this.length = 0;\n this.base = 0;\n }\n empty(stack, base) {\n this.stack = stack;\n this.names = _util.EMPTY_ARRAY;\n this.base = base;\n this.length = 0;\n this.internalTag = _reference.CONSTANT_TAG;\n this.internalValues = _util.EMPTY_ARRAY;\n }\n setup(stack, base, length, names) {\n this.stack = stack;\n this.names = names;\n this.base = base;\n this.length = length;\n if (length === 0) {\n this.internalTag = _reference.CONSTANT_TAG;\n this.internalValues = _util.EMPTY_ARRAY;\n } else {\n this.internalTag = null;\n this.internalValues = null;\n }\n }\n get values() {\n let values = this.internalValues;\n if (!values) {\n let { base, length, stack } = this;\n values = this.internalValues = stack.sliceArray(base, base + length * 3);\n }\n return values;\n }\n has(name) {\n return this.names.indexOf(name) !== -1;\n }\n get(name) {\n let { base, stack, names } = this;\n let idx = names.indexOf(name);\n if (names.indexOf(name) === -1) {\n return null;\n }\n let table = stack.get(idx * 3, base);\n let scope = stack.get(idx * 3 + 1, base); // FIXME(mmun): shouldn't need to cast this\n let handle = stack.get(idx * 3 + 2, base);\n return handle === null ? null : [handle, scope, table];\n }\n capture() {\n return new CapturedBlockArguments(this.names, this.values);\n }\n }\n class CapturedBlockArguments {\n constructor(names, values) {\n this.names = names;\n this.values = values;\n this.length = names.length;\n }\n has(name) {\n return this.names.indexOf(name) !== -1;\n }\n get(name) {\n let idx = this.names.indexOf(name);\n if (idx === -1) return null;\n return [this.values[idx * 3 + 2], this.values[idx * 3 + 1], this.values[idx * 3]];\n }\n }\n const EMPTY_NAMED = new CapturedNamedArguments(_reference.CONSTANT_TAG, _util.EMPTY_ARRAY, _util.EMPTY_ARRAY);\n const EMPTY_POSITIONAL = new CapturedPositionalArguments(_reference.CONSTANT_TAG, _util.EMPTY_ARRAY);\n const EMPTY_ARGS = {\n tag: _reference.CONSTANT_TAG,\n length: 0,\n positional: EMPTY_POSITIONAL,\n named: EMPTY_NAMED\n };\n\n class VM {\n constructor(runtime, scope, dynamicScope, elementStack) {\n this.runtime = runtime;\n this.elementStack = elementStack;\n this.dynamicScopeStack = new _util.Stack();\n this.scopeStack = new _util.Stack();\n this.updatingOpcodeStack = new _util.Stack();\n this.cacheGroups = new _util.Stack();\n this.listBlockStack = new _util.Stack();\n this.s0 = null;\n this.s1 = null;\n this.t0 = null;\n this.t1 = null;\n this.v0 = null;\n this.heap = this.program.heap;\n this.constants = this.program.constants;\n this.elementStack = elementStack;\n this.scopeStack.push(scope);\n this.dynamicScopeStack.push(dynamicScope);\n this.args = new Arguments();\n this.inner = new LowLevelVM(EvaluationStack.empty(), this.heap, runtime.program, {\n debugBefore: opcode => {\n return APPEND_OPCODES.debugBefore(this, opcode, opcode.type);\n },\n debugAfter: (opcode, state) => {\n APPEND_OPCODES.debugAfter(this, opcode, opcode.type, state);\n }\n });\n }\n get stack() {\n return this.inner.stack;\n }\n set stack(value) {\n this.inner.stack = value;\n }\n /* Registers */\n set currentOpSize(value) {\n this.inner.currentOpSize = value;\n }\n get currentOpSize() {\n return this.inner.currentOpSize;\n }\n get pc() {\n return this.inner.pc;\n }\n set pc(value) {\n\n this.inner.pc = value;\n }\n get ra() {\n return this.inner.ra;\n }\n set ra(value) {\n this.inner.ra = value;\n }\n get fp() {\n return this.stack.fp;\n }\n set fp(fp) {\n this.stack.fp = fp;\n }\n get sp() {\n return this.stack.sp;\n }\n set sp(sp) {\n this.stack.sp = sp;\n }\n // Fetch a value from a register onto the stack\n fetch(register) {\n this.stack.push(this[_vm2.Register[register]]);\n }\n // Load a value from the stack into a register\n load(register) {\n this[_vm2.Register[register]] = this.stack.pop();\n }\n // Fetch a value from a register\n fetchValue(register) {\n return this[_vm2.Register[register]];\n }\n // Load a value into a register\n loadValue(register, value) {\n this[_vm2.Register[register]] = value;\n }\n /**\n * Migrated to Inner\n */\n // Start a new frame and save $ra and $fp on the stack\n pushFrame() {\n this.inner.pushFrame();\n }\n // Restore $ra, $sp and $fp\n popFrame() {\n this.inner.popFrame();\n }\n // Jump to an address in `program`\n goto(offset) {\n this.inner.goto(offset);\n }\n // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)\n call(handle) {\n this.inner.call(handle);\n }\n // Put a specific `program` address in $ra\n returnTo(offset) {\n this.inner.returnTo(offset);\n }\n // Return to the `program` address stored in $ra\n return() {\n this.inner.return();\n }\n /**\n * End of migrated.\n */\n static initial(program, env, self, dynamicScope, elementStack, handle) {\n let scopeSize = program.heap.scopesizeof(handle);\n let scope = Scope.root(self, scopeSize);\n let vm = new VM({ program, env }, scope, dynamicScope, elementStack);\n vm.pc = vm.heap.getaddr(handle);\n vm.updatingOpcodeStack.push(new _util.LinkedList());\n return vm;\n }\n static empty(program, env, elementStack) {\n let dynamicScope = {\n get() {\n return UNDEFINED_REFERENCE;\n },\n set() {\n return UNDEFINED_REFERENCE;\n },\n child() {\n return dynamicScope;\n }\n };\n let vm = new VM({ program, env }, Scope.root(UNDEFINED_REFERENCE, 0), dynamicScope, elementStack);\n vm.updatingOpcodeStack.push(new _util.LinkedList());\n return vm;\n }\n static resume({ scope, dynamicScope }, runtime, stack) {\n return new VM(runtime, scope, dynamicScope, stack);\n }\n get program() {\n return this.runtime.program;\n }\n get env() {\n return this.runtime.env;\n }\n capture(args) {\n return {\n dynamicScope: this.dynamicScope(),\n scope: this.scope(),\n stack: this.stack.capture(args)\n };\n }\n beginCacheGroup() {\n this.cacheGroups.push(this.updating().tail());\n }\n commitCacheGroup() {\n // JumpIfNotModified(END)\n // (head)\n // (....)\n // (tail)\n // DidModify\n // END: Noop\n let END = new LabelOpcode('END');\n let opcodes = this.updating();\n let marker = this.cacheGroups.pop();\n let head = marker ? opcodes.nextNode(marker) : opcodes.head();\n let tail = opcodes.tail();\n let tag = (0, _reference.combineSlice)(new _util.ListSlice(head, tail));\n let guard = new JumpIfNotModifiedOpcode(tag, END);\n opcodes.insertBefore(guard, head);\n opcodes.append(new DidModifyOpcode(guard));\n opcodes.append(END);\n }\n enter(args) {\n let updating = new _util.LinkedList();\n let state = this.capture(args);\n let tracker = this.elements().pushUpdatableBlock();\n let tryOpcode = new TryOpcode(this.heap.gethandle(this.pc), state, this.runtime, tracker, updating);\n this.didEnter(tryOpcode);\n }\n iterate(memo, value) {\n let stack = this.stack;\n stack.push(value);\n stack.push(memo);\n let state = this.capture(2);\n let tracker = this.elements().pushUpdatableBlock();\n // let ip = this.ip;\n // this.ip = end + 4;\n // this.frames.push(ip);\n return new TryOpcode(this.heap.gethandle(this.pc), state, this.runtime, tracker, new _util.LinkedList());\n }\n enterItem(key, opcode) {\n this.listBlock().map[key] = opcode;\n this.didEnter(opcode);\n }\n enterList(relativeStart) {\n let updating = new _util.LinkedList();\n let state = this.capture(0);\n let tracker = this.elements().pushBlockList(updating);\n let artifacts = this.stack.peek().artifacts;\n let addr = this.pc + relativeStart - this.currentOpSize;\n let start = this.heap.gethandle(addr);\n let opcode = new ListBlockOpcode(start, state, this.runtime, tracker, updating, artifacts);\n this.listBlockStack.push(opcode);\n this.didEnter(opcode);\n }\n didEnter(opcode) {\n this.updateWith(opcode);\n this.updatingOpcodeStack.push(opcode.children);\n }\n exit() {\n this.elements().popBlock();\n this.updatingOpcodeStack.pop();\n let parent = this.updating().tail();\n parent.didInitializeChildren();\n }\n exitList() {\n this.exit();\n this.listBlockStack.pop();\n }\n updateWith(opcode) {\n this.updating().append(opcode);\n }\n listBlock() {\n return this.listBlockStack.current;\n }\n updating() {\n return this.updatingOpcodeStack.current;\n }\n elements() {\n return this.elementStack;\n }\n scope() {\n return this.scopeStack.current;\n }\n dynamicScope() {\n return this.dynamicScopeStack.current;\n }\n pushChildScope() {\n this.scopeStack.push(this.scope().child());\n }\n pushDynamicScope() {\n let child = this.dynamicScope().child();\n this.dynamicScopeStack.push(child);\n return child;\n }\n pushRootScope(size, bindCaller) {\n let scope = Scope.sized(size);\n if (bindCaller) scope.bindCallerScope(this.scope());\n this.scopeStack.push(scope);\n return scope;\n }\n pushScope(scope) {\n this.scopeStack.push(scope);\n }\n popScope() {\n this.scopeStack.pop();\n }\n popDynamicScope() {\n this.dynamicScopeStack.pop();\n }\n newDestroyable(d) {\n this.elements().didAddDestroyable(d);\n }\n /// SCOPE HELPERS\n getSelf() {\n return this.scope().getSelf();\n }\n referenceForSymbol(symbol) {\n return this.scope().getSymbol(symbol);\n }\n /// EXECUTION\n execute(start, initialize) {\n this.pc = this.heap.getaddr(start);\n if (initialize) initialize(this);\n let result;\n while (true) {\n result = this.next();\n if (result.done) break;\n }\n return result.value;\n }\n next() {\n let { env, program, updatingOpcodeStack, elementStack } = this;\n let opcode = this.inner.nextStatement();\n let result;\n if (opcode !== null) {\n this.inner.evaluateOuter(opcode, this);\n result = { done: false, value: null };\n } else {\n // Unload the stack\n this.stack.reset();\n result = {\n done: true,\n value: new RenderResult(env, program, updatingOpcodeStack.pop(), elementStack.popBlock())\n };\n }\n return result;\n }\n bindDynamicScope(names) {\n let scope = this.dynamicScope();\n for (let i = names.length - 1; i >= 0; i--) {\n let name = this.constants.getString(names[i]);\n scope.set(name, this.stack.pop());\n }\n }\n }\n\n class TemplateIteratorImpl {\n constructor(vm) {\n this.vm = vm;\n }\n next() {\n return this.vm.next();\n }\n }\n function render(program, env, self, dynamicScope, builder, handle) {\n let vm = VM.initial(program, env, self, dynamicScope, builder, handle);\n return new TemplateIteratorImpl(vm);\n }\n\n class DynamicVarReference {\n constructor(scope, nameRef) {\n this.scope = scope;\n this.nameRef = nameRef;\n let varTag = this.varTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([nameRef.tag, varTag]);\n }\n value() {\n return this.getVar().value();\n }\n get(key) {\n return this.getVar().get(key);\n }\n getVar() {\n let name = String(this.nameRef.value());\n let ref = this.scope.get(name);\n this.varTag.inner.update(ref.tag);\n return ref;\n }\n }\n function getDynamicVar(vm, args) {\n let scope = vm.dynamicScope();\n let nameRef = args.positional.at(0);\n return new DynamicVarReference(scope, nameRef);\n }\n\n /** @internal */\n const DEFAULT_CAPABILITIES = {\n dynamicLayout: true,\n dynamicTag: true,\n prepareArgs: true,\n createArgs: true,\n attributeHook: false,\n elementHook: false,\n dynamicScope: true,\n createCaller: false,\n updateHook: true,\n createInstance: true\n };\n const MINIMAL_CAPABILITIES = {\n dynamicLayout: false,\n dynamicTag: false,\n prepareArgs: false,\n createArgs: false,\n attributeHook: false,\n elementHook: false,\n dynamicScope: false,\n createCaller: false,\n updateHook: false,\n createInstance: false\n };\n\n class RehydratingCursor extends Cursor {\n constructor(element, nextSibling, startingBlockDepth) {\n super(element, nextSibling);\n this.startingBlockDepth = startingBlockDepth;\n this.candidate = null;\n this.injectedOmittedNode = false;\n this.openBlockDepth = startingBlockDepth - 1;\n }\n }\n class RehydrateBuilder extends NewElementBuilder {\n // private candidate: Option = null;\n constructor(env, parentNode, nextSibling) {\n super(env, parentNode, nextSibling);\n this.unmatchedAttributes = null;\n this.blockDepth = 0;\n if (nextSibling) throw new Error('Rehydration with nextSibling not supported');\n let node = this.currentCursor.element.firstChild;\n while (node !== null) {\n if (isComment(node) && (0, _util.isSerializationFirstNode)(node)) {\n break;\n }\n node = node.nextSibling;\n }\n\n this.candidate = node;\n }\n get currentCursor() {\n return this.cursorStack.current;\n }\n get candidate() {\n if (this.currentCursor) {\n return this.currentCursor.candidate;\n }\n return null;\n }\n set candidate(node) {\n this.currentCursor.candidate = node;\n }\n pushElement(element, nextSibling) {\n let { blockDepth = 0 } = this;\n let cursor = new RehydratingCursor(element, nextSibling, blockDepth);\n let currentCursor = this.currentCursor;\n if (currentCursor) {\n if (currentCursor.candidate) {\n /**\n *
    <--------------- currentCursor.element\n * \n *
    <--------------- currentCursor.candidate -> cursor.element\n * <- currentCursor.candidate.firstChild -> cursor.candidate\n * Foo\n * \n *
    \n * <-- becomes currentCursor.candidate\n */\n // where to rehydrate from if we are in rehydration mode\n cursor.candidate = element.firstChild;\n // where to continue when we pop\n currentCursor.candidate = element.nextSibling;\n }\n }\n this.cursorStack.push(cursor);\n }\n clearMismatch(candidate) {\n let current = candidate;\n let currentCursor = this.currentCursor;\n if (currentCursor !== null) {\n let openBlockDepth = currentCursor.openBlockDepth;\n if (openBlockDepth >= currentCursor.startingBlockDepth) {\n while (current && !(isComment(current) && getCloseBlockDepth(current) === openBlockDepth)) {\n current = this.remove(current);\n }\n } else {\n while (current !== null) {\n current = this.remove(current);\n }\n }\n // current cursor parentNode should be openCandidate if element\n // or openCandidate.parentNode if comment\n currentCursor.nextSibling = current;\n // disable rehydration until we popElement or closeBlock for openBlockDepth\n currentCursor.candidate = null;\n }\n }\n __openBlock() {\n let { currentCursor } = this;\n if (currentCursor === null) return;\n let blockDepth = this.blockDepth;\n this.blockDepth++;\n let { candidate } = currentCursor;\n if (candidate === null) return;\n if (isComment(candidate) && getOpenBlockDepth(candidate) === blockDepth) {\n currentCursor.candidate = this.remove(candidate);\n currentCursor.openBlockDepth = blockDepth;\n } else {\n this.clearMismatch(candidate);\n }\n }\n __closeBlock() {\n let { currentCursor } = this;\n if (currentCursor === null) return;\n // openBlock is the last rehydrated open block\n let openBlockDepth = currentCursor.openBlockDepth;\n // this currently is the expected next open block depth\n this.blockDepth--;\n let { candidate } = currentCursor;\n // rehydrating\n if (candidate !== null) {\n\n if (isComment(candidate) && getCloseBlockDepth(candidate) === openBlockDepth) {\n currentCursor.candidate = this.remove(candidate);\n currentCursor.openBlockDepth--;\n } else {\n this.clearMismatch(candidate);\n }\n // if the openBlockDepth matches the blockDepth we just closed to\n // then restore rehydration\n }\n if (currentCursor.openBlockDepth === this.blockDepth) {\n\n currentCursor.candidate = this.remove(currentCursor.nextSibling);\n currentCursor.openBlockDepth--;\n }\n }\n __appendNode(node) {\n let { candidate } = this;\n // This code path is only used when inserting precisely one node. It needs more\n // comparison logic, but we can probably lean on the cases where this code path\n // is actually used.\n if (candidate) {\n return candidate;\n } else {\n return super.__appendNode(node);\n }\n }\n __appendHTML(html) {\n let candidateBounds = this.markerBounds();\n if (candidateBounds) {\n let first = candidateBounds.firstNode();\n let last = candidateBounds.lastNode();\n let newBounds = bounds(this.element, first.nextSibling, last.previousSibling);\n let possibleEmptyMarker = this.remove(first);\n this.remove(last);\n if (possibleEmptyMarker !== null && isEmpty$1(possibleEmptyMarker)) {\n this.candidate = this.remove(possibleEmptyMarker);\n if (this.candidate !== null) {\n this.clearMismatch(this.candidate);\n }\n }\n return newBounds;\n } else {\n return super.__appendHTML(html);\n }\n }\n remove(node) {\n let element = node.parentNode;\n let next = node.nextSibling;\n element.removeChild(node);\n return next;\n }\n markerBounds() {\n let _candidate = this.candidate;\n if (_candidate && isMarker(_candidate)) {\n let first = _candidate;\n let last = first.nextSibling;\n while (last && !isMarker(last)) {\n last = last.nextSibling;\n }\n return bounds(this.element, first, last);\n } else {\n return null;\n }\n }\n __appendText(string) {\n let { candidate } = this;\n if (candidate) {\n if (isTextNode(candidate)) {\n if (candidate.nodeValue !== string) {\n candidate.nodeValue = string;\n }\n this.candidate = candidate.nextSibling;\n return candidate;\n } else if (candidate && (isSeparator(candidate) || isEmpty$1(candidate))) {\n this.candidate = candidate.nextSibling;\n this.remove(candidate);\n return this.__appendText(string);\n } else if (isEmpty$1(candidate)) {\n let next = this.remove(candidate);\n this.candidate = next;\n let text = this.dom.createTextNode(string);\n this.dom.insertBefore(this.element, text, next);\n return text;\n } else {\n this.clearMismatch(candidate);\n return super.__appendText(string);\n }\n } else {\n return super.__appendText(string);\n }\n }\n __appendComment(string) {\n let _candidate = this.candidate;\n if (_candidate && isComment(_candidate)) {\n if (_candidate.nodeValue !== string) {\n _candidate.nodeValue = string;\n }\n this.candidate = _candidate.nextSibling;\n return _candidate;\n } else if (_candidate) {\n this.clearMismatch(_candidate);\n }\n return super.__appendComment(string);\n }\n __openElement(tag) {\n let _candidate = this.candidate;\n if (_candidate && isElement(_candidate) && isSameNodeType(_candidate, tag)) {\n this.unmatchedAttributes = [].slice.call(_candidate.attributes);\n return _candidate;\n } else if (_candidate) {\n if (isElement(_candidate) && _candidate.tagName === 'TBODY') {\n this.pushElement(_candidate, null);\n this.currentCursor.injectedOmittedNode = true;\n return this.__openElement(tag);\n }\n this.clearMismatch(_candidate);\n }\n return super.__openElement(tag);\n }\n __setAttribute(name, value, namespace) {\n let unmatched = this.unmatchedAttributes;\n if (unmatched) {\n let attr = findByName(unmatched, name);\n if (attr) {\n if (attr.value !== value) {\n attr.value = value;\n }\n unmatched.splice(unmatched.indexOf(attr), 1);\n return;\n }\n }\n return super.__setAttribute(name, value, namespace);\n }\n __setProperty(name, value) {\n let unmatched = this.unmatchedAttributes;\n if (unmatched) {\n let attr = findByName(unmatched, name);\n if (attr) {\n if (attr.value !== value) {\n attr.value = value;\n }\n unmatched.splice(unmatched.indexOf(attr), 1);\n return;\n }\n }\n return super.__setProperty(name, value);\n }\n __flushElement(parent, constructing) {\n let { unmatchedAttributes: unmatched } = this;\n if (unmatched) {\n for (let i = 0; i < unmatched.length; i++) {\n this.constructing.removeAttribute(unmatched[i].name);\n }\n this.unmatchedAttributes = null;\n } else {\n super.__flushElement(parent, constructing);\n }\n }\n willCloseElement() {\n let { candidate, currentCursor } = this;\n if (candidate !== null) {\n this.clearMismatch(candidate);\n }\n if (currentCursor && currentCursor.injectedOmittedNode) {\n this.popElement();\n }\n super.willCloseElement();\n }\n getMarker(element, guid) {\n let marker = element.querySelector(`script[glmr=\"${guid}\"]`);\n if (marker) {\n return marker;\n }\n throw new Error('Cannot find serialized cursor for `in-element`');\n }\n __pushRemoteElement(element, cursorId, nextSibling = null) {\n let marker = this.getMarker(element, cursorId);\n if (marker.parentNode === element) {\n let currentCursor = this.currentCursor;\n let candidate = currentCursor.candidate;\n this.pushElement(element, nextSibling);\n currentCursor.candidate = candidate;\n this.candidate = this.remove(marker);\n let tracker = new RemoteBlockTracker(element);\n this.pushBlockTracker(tracker, true);\n }\n }\n didAppendBounds(bounds$$1) {\n super.didAppendBounds(bounds$$1);\n if (this.candidate) {\n let last = bounds$$1.lastNode();\n this.candidate = last && last.nextSibling;\n }\n return bounds$$1;\n }\n }\n function isTextNode(node) {\n return node.nodeType === 3;\n }\n function isComment(node) {\n return node.nodeType === 8;\n }\n function getOpenBlockDepth(node) {\n let boundsDepth = node.nodeValue.match(/^%\\+b:(\\d+)%$/);\n if (boundsDepth && boundsDepth[1]) {\n return Number(boundsDepth[1]);\n } else {\n return null;\n }\n }\n function getCloseBlockDepth(node) {\n let boundsDepth = node.nodeValue.match(/^%\\-b:(\\d+)%$/);\n if (boundsDepth && boundsDepth[1]) {\n return Number(boundsDepth[1]);\n } else {\n return null;\n }\n }\n function isElement(node) {\n return node.nodeType === 1;\n }\n function isMarker(node) {\n return node.nodeType === 8 && node.nodeValue === '%glmr%';\n }\n function isSeparator(node) {\n return node.nodeType === 8 && node.nodeValue === '%|%';\n }\n function isEmpty$1(node) {\n return node.nodeType === 8 && node.nodeValue === '% %';\n }\n function isSameNodeType(candidate, tag) {\n if (candidate.namespaceURI === SVG_NAMESPACE$1) {\n return candidate.tagName === tag;\n }\n return candidate.tagName === tag.toUpperCase();\n }\n function findByName(array, name) {\n for (let i = 0; i < array.length; i++) {\n let attr = array[i];\n if (attr.name === name) return attr;\n }\n return undefined;\n }\n function rehydrationBuilder(env, cursor) {\n return RehydrateBuilder.forInitialRender(env, cursor);\n }\n\n exports.renderMain = render;\n exports.NULL_REFERENCE = NULL_REFERENCE;\n exports.UNDEFINED_REFERENCE = UNDEFINED_REFERENCE;\n exports.PrimitiveReference = PrimitiveReference;\n exports.ConditionalReference = ConditionalReference;\n exports.setDebuggerCallback = setDebuggerCallback;\n exports.resetDebuggerCallback = resetDebuggerCallback;\n exports.getDynamicVar = getDynamicVar;\n exports.LowLevelVM = VM;\n exports.UpdatingVM = UpdatingVM;\n exports.RenderResult = RenderResult;\n exports.SimpleDynamicAttribute = SimpleDynamicAttribute;\n exports.DynamicAttribute = DynamicAttribute;\n exports.EMPTY_ARGS = EMPTY_ARGS;\n exports.Scope = Scope;\n exports.Environment = Environment;\n exports.DefaultEnvironment = DefaultEnvironment;\n exports.DEFAULT_CAPABILITIES = DEFAULT_CAPABILITIES;\n exports.MINIMAL_CAPABILITIES = MINIMAL_CAPABILITIES;\n exports.CurriedComponentDefinition = CurriedComponentDefinition;\n exports.isCurriedComponentDefinition = isCurriedComponentDefinition;\n exports.curry = curry;\n exports.DOMChanges = helper$1;\n exports.SVG_NAMESPACE = SVG_NAMESPACE$1;\n exports.IDOMChanges = DOMChanges;\n exports.DOMTreeConstruction = DOMTreeConstruction;\n exports.isWhitespace = isWhitespace;\n exports.insertHTMLBefore = insertHTMLBefore;\n exports.normalizeProperty = normalizeProperty;\n exports.NewElementBuilder = NewElementBuilder;\n exports.clientBuilder = clientBuilder;\n exports.rehydrationBuilder = rehydrationBuilder;\n exports.RehydrateBuilder = RehydrateBuilder;\n exports.ConcreteBounds = ConcreteBounds;\n exports.Cursor = Cursor;\n exports.capabilityFlagsFrom = capabilityFlagsFrom;\n exports.hasCapability = hasCapability;\n});","enifed('@glimmer/syntax', ['exports', 'simple-html-tokenizer', '@glimmer/util', 'handlebars'], function (exports, _simpleHtmlTokenizer, _util, _handlebars) {\n 'use strict';\n\n exports.__esModule = true;\n exports.printLiteral = exports.isLiteral = exports.SyntaxError = exports.print = exports.Walker = exports.traverse = exports.cannotReplaceOrRemoveInKeyHandlerYet = exports.cannotReplaceNode = exports.cannotRemoveNode = exports.TraversalError = exports.builders = exports.preprocess = exports.AST = undefined;\n\n\n function buildMustache(path, params, hash, raw, loc) {\n if (typeof path === 'string') {\n path = buildPath(path);\n }\n return {\n type: 'MustacheStatement',\n path,\n params: params || [],\n hash: hash || buildHash([]),\n escaped: !raw,\n loc: buildLoc(loc || null)\n };\n }\n function buildBlock(path, params, hash, program, inverse, loc) {\n return {\n type: 'BlockStatement',\n path: buildPath(path),\n params: params || [],\n hash: hash || buildHash([]),\n program: program || null,\n inverse: inverse || null,\n loc: buildLoc(loc || null)\n };\n }\n function buildElementModifier(path, params, hash, loc) {\n return {\n type: 'ElementModifierStatement',\n path: buildPath(path),\n params: params || [],\n hash: hash || buildHash([]),\n loc: buildLoc(loc || null)\n };\n }\n function buildPartial(name, params, hash, indent, loc) {\n return {\n type: 'PartialStatement',\n name: name,\n params: params || [],\n hash: hash || buildHash([]),\n indent: indent || '',\n strip: { open: false, close: false },\n loc: buildLoc(loc || null)\n };\n }\n function buildComment(value, loc) {\n return {\n type: 'CommentStatement',\n value: value,\n loc: buildLoc(loc || null)\n };\n }\n function buildMustacheComment(value, loc) {\n return {\n type: 'MustacheCommentStatement',\n value: value,\n loc: buildLoc(loc || null)\n };\n }\n function buildConcat(parts, loc) {\n return {\n type: 'ConcatStatement',\n parts: parts || [],\n loc: buildLoc(loc || null)\n };\n }\n function buildElement(tag, attributes, modifiers, children, comments, blockParams, loc) {\n // this is used for backwards compat prior to `blockParams` being added to the AST\n if (Array.isArray(comments)) {\n if (isBlockParms(comments)) {\n blockParams = comments;\n comments = [];\n } else if (isLoc(blockParams)) {\n loc = blockParams;\n blockParams = [];\n }\n } else if (isLoc(comments)) {\n // this is used for backwards compat prior to `comments` being added to the AST\n loc = comments;\n comments = [];\n } else if (isLoc(blockParams)) {\n loc = blockParams;\n blockParams = [];\n }\n // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST\n let selfClosing = false;\n if (typeof tag === 'object') {\n selfClosing = tag.selfClosing;\n tag = tag.name;\n }\n return {\n type: 'ElementNode',\n tag: tag || '',\n selfClosing: selfClosing,\n attributes: attributes || [],\n blockParams: blockParams || [],\n modifiers: modifiers || [],\n comments: comments || [],\n children: children || [],\n loc: buildLoc(loc || null)\n };\n }\n function buildAttr(name, value, loc) {\n return {\n type: 'AttrNode',\n name: name,\n value: value,\n loc: buildLoc(loc || null)\n };\n }\n function buildText(chars, loc) {\n return {\n type: 'TextNode',\n chars: chars || '',\n loc: buildLoc(loc || null)\n };\n }\n // Expressions\n function buildSexpr(path, params, hash, loc) {\n return {\n type: 'SubExpression',\n path: buildPath(path),\n params: params || [],\n hash: hash || buildHash([]),\n loc: buildLoc(loc || null)\n };\n }\n function buildPath(original, loc) {\n if (typeof original !== 'string') return original;\n let parts = original.split('.');\n let thisHead = false;\n if (parts[0] === 'this') {\n thisHead = true;\n parts = parts.slice(1);\n }\n return {\n type: 'PathExpression',\n original,\n this: thisHead,\n parts,\n data: false,\n loc: buildLoc(loc || null)\n };\n }\n function buildLiteral(type, value, loc) {\n return {\n type,\n value,\n original: value,\n loc: buildLoc(loc || null)\n };\n }\n // Miscellaneous\n function buildHash(pairs, loc) {\n return {\n type: 'Hash',\n pairs: pairs || [],\n loc: buildLoc(loc || null)\n };\n }\n function buildPair(key, value, loc) {\n return {\n type: 'HashPair',\n key: key,\n value,\n loc: buildLoc(loc || null)\n };\n }\n function buildProgram(body, blockParams, loc) {\n return {\n type: 'Program',\n body: body || [],\n blockParams: blockParams || [],\n loc: buildLoc(loc || null)\n };\n }\n function buildSource(source) {\n return source || null;\n }\n function buildPosition(line, column) {\n return {\n line,\n column\n };\n }\n const SYNTHETIC = {\n source: '(synthetic)',\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 }\n };\n function buildLoc(...args) {\n if (args.length === 1) {\n let loc = args[0];\n if (loc && typeof loc === 'object') {\n return {\n source: buildSource(loc.source),\n start: buildPosition(loc.start.line, loc.start.column),\n end: buildPosition(loc.end.line, loc.end.column)\n };\n } else {\n return SYNTHETIC;\n }\n } else {\n let [startLine, startColumn, endLine, endColumn, source] = args;\n return {\n source: buildSource(source),\n start: buildPosition(startLine, startColumn),\n end: buildPosition(endLine, endColumn)\n };\n }\n }\n function isBlockParms(arr) {\n return arr[0] === 'string';\n }\n function isLoc(item) {\n return !Array.isArray(item);\n }\n var b = {\n mustache: buildMustache,\n block: buildBlock,\n partial: buildPartial,\n comment: buildComment,\n mustacheComment: buildMustacheComment,\n element: buildElement,\n elementModifier: buildElementModifier,\n attr: buildAttr,\n text: buildText,\n sexpr: buildSexpr,\n path: buildPath,\n concat: buildConcat,\n hash: buildHash,\n pair: buildPair,\n literal: buildLiteral,\n program: buildProgram,\n loc: buildLoc,\n pos: buildPosition,\n string: literal('StringLiteral'),\n boolean: literal('BooleanLiteral'),\n number: literal('NumberLiteral'),\n undefined() {\n return buildLiteral('UndefinedLiteral', undefined);\n },\n null() {\n return buildLiteral('NullLiteral', null);\n }\n };\n function literal(type) {\n return function (value) {\n return buildLiteral(type, value);\n };\n }\n\n /**\n * Subclass of `Error` with additional information\n * about location of incorrect markup.\n */\n const SyntaxError = function () {\n SyntaxError.prototype = Object.create(Error.prototype);\n SyntaxError.prototype.constructor = SyntaxError;\n function SyntaxError(message, location) {\n let error = Error.call(this, message);\n this.message = message;\n this.stack = error.stack;\n this.location = location;\n }\n return SyntaxError;\n }();\n\n // Regex to validate the identifier for block parameters.\n // Based on the ID validation regex in Handlebars.\n let ID_INVERSE_PATTERN = /[!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]/;\n // Checks the element's attributes to see if it uses block params.\n // If it does, registers the block params with the program and\n // removes the corresponding attributes from the element.\n function parseElementBlockParams(element) {\n let params = parseBlockParams(element);\n if (params) element.blockParams = params;\n }\n function parseBlockParams(element) {\n let l = element.attributes.length;\n let attrNames = [];\n for (let i = 0; i < l; i++) {\n attrNames.push(element.attributes[i].name);\n }\n let asIndex = attrNames.indexOf('as');\n if (asIndex !== -1 && l > asIndex && attrNames[asIndex + 1].charAt(0) === '|') {\n // Some basic validation, since we're doing the parsing ourselves\n let paramsString = attrNames.slice(asIndex).join(' ');\n if (paramsString.charAt(paramsString.length - 1) !== '|' || paramsString.match(/\\|/g).length !== 2) {\n throw new SyntaxError(\"Invalid block parameters syntax: '\" + paramsString + \"'\", element.loc);\n }\n let params = [];\n for (let i = asIndex + 1; i < l; i++) {\n let param = attrNames[i].replace(/\\|/g, '');\n if (param !== '') {\n if (ID_INVERSE_PATTERN.test(param)) {\n throw new SyntaxError(\"Invalid identifier for block parameters: '\" + param + \"' in '\" + paramsString + \"'\", element.loc);\n }\n params.push(param);\n }\n }\n if (params.length === 0) {\n throw new SyntaxError(\"Cannot use zero block parameters: '\" + paramsString + \"'\", element.loc);\n }\n element.attributes = element.attributes.slice(0, asIndex);\n return params;\n }\n return null;\n }\n function childrenFor(node) {\n switch (node.type) {\n case 'Program':\n return node.body;\n case 'ElementNode':\n return node.children;\n }\n }\n function appendChild(parent, node) {\n childrenFor(parent).push(node);\n }\n function isLiteral(path) {\n return path.type === 'StringLiteral' || path.type === 'BooleanLiteral' || path.type === 'NumberLiteral' || path.type === 'NullLiteral' || path.type === 'UndefinedLiteral';\n }\n function printLiteral(literal) {\n if (literal.type === 'UndefinedLiteral') {\n return 'undefined';\n } else {\n return JSON.stringify(literal.value);\n }\n }\n\n const entityParser = new _simpleHtmlTokenizer.EntityParser(_simpleHtmlTokenizer.HTML5NamedCharRefs);\n class Parser {\n constructor(source) {\n this.elementStack = [];\n this.currentAttribute = null;\n this.currentNode = null;\n this.tokenizer = new _simpleHtmlTokenizer.EventedTokenizer(this, entityParser);\n this.source = source.split(/(?:\\r\\n?|\\n)/g);\n }\n get currentAttr() {\n return this.currentAttribute;\n }\n get currentTag() {\n let node = this.currentNode;\n\n return node;\n }\n get currentStartTag() {\n let node = this.currentNode;\n\n return node;\n }\n get currentEndTag() {\n let node = this.currentNode;\n\n return node;\n }\n get currentComment() {\n let node = this.currentNode;\n\n return node;\n }\n get currentData() {\n let node = this.currentNode;\n\n return node;\n }\n acceptNode(node) {\n return this[node.type](node);\n }\n currentElement() {\n return this.elementStack[this.elementStack.length - 1];\n }\n sourceForNode(node, endNode) {\n let firstLine = node.loc.start.line - 1;\n let currentLine = firstLine - 1;\n let firstColumn = node.loc.start.column;\n let string = [];\n let line;\n let lastLine;\n let lastColumn;\n if (endNode) {\n lastLine = endNode.loc.end.line - 1;\n lastColumn = endNode.loc.end.column;\n } else {\n lastLine = node.loc.end.line - 1;\n lastColumn = node.loc.end.column;\n }\n while (currentLine < lastLine) {\n currentLine++;\n line = this.source[currentLine];\n if (currentLine === firstLine) {\n if (firstLine === lastLine) {\n string.push(line.slice(firstColumn, lastColumn));\n } else {\n string.push(line.slice(firstColumn));\n }\n } else if (currentLine === lastLine) {\n string.push(line.slice(0, lastColumn));\n } else {\n string.push(line);\n }\n }\n return string.join('\\n');\n }\n }\n\n class HandlebarsNodeVisitors extends Parser {\n constructor() {\n super(...arguments);\n this.cursorCount = 0;\n }\n cursor() {\n return `%cursor:${this.cursorCount++}%`;\n }\n Program(program) {\n let body = [];\n this.cursorCount = 0;\n let node = b.program(body, program.blockParams, program.loc);\n let i,\n l = program.body.length;\n this.elementStack.push(node);\n if (l === 0) {\n return this.elementStack.pop();\n }\n for (i = 0; i < l; i++) {\n this.acceptNode(program.body[i]);\n }\n // Ensure that that the element stack is balanced properly.\n let poppedNode = this.elementStack.pop();\n if (poppedNode !== node) {\n let elementNode = poppedNode;\n throw new SyntaxError('Unclosed element `' + elementNode.tag + '` (on line ' + elementNode.loc.start.line + ').', elementNode.loc);\n }\n return node;\n }\n BlockStatement(block) {\n if (this.tokenizer['state'] === 'comment') {\n this.appendToCommentData(this.sourceForNode(block));\n return;\n }\n if (this.tokenizer['state'] !== 'comment' && this.tokenizer['state'] !== 'data' && this.tokenizer['state'] !== 'beforeData') {\n throw new SyntaxError('A block may only be used inside an HTML element or another block.', block.loc);\n }\n let { path, params, hash } = acceptCallNodes(this, block);\n let program = this.Program(block.program);\n let inverse = block.inverse ? this.Program(block.inverse) : null;\n if (path.original === 'in-element') {\n hash = addInElementHash(this.cursor(), hash, block.loc);\n }\n let node = b.block(path, params, hash, program, inverse, block.loc);\n let parentProgram = this.currentElement();\n appendChild(parentProgram, node);\n }\n MustacheStatement(rawMustache) {\n let { tokenizer } = this;\n if (tokenizer.state === 'comment') {\n this.appendToCommentData(this.sourceForNode(rawMustache));\n return;\n }\n let mustache;\n let { escaped, loc } = rawMustache;\n if (rawMustache.path.type.match(/Literal$/)) {\n mustache = {\n type: 'MustacheStatement',\n path: this.acceptNode(rawMustache.path),\n params: [],\n hash: b.hash(),\n escaped,\n loc\n };\n } else {\n let { path, params, hash } = acceptCallNodes(this, rawMustache);\n mustache = b.mustache(path, params, hash, !escaped, loc);\n }\n switch (tokenizer.state) {\n // Tag helpers\n case \"tagOpen\" /* tagOpen */:\n case \"tagName\" /* tagName */:\n throw new SyntaxError(`Cannot use mustaches in an elements tagname: \\`${this.sourceForNode(rawMustache, rawMustache.path)}\\` at L${loc.start.line}:C${loc.start.column}`, mustache.loc);\n case \"beforeAttributeName\" /* beforeAttributeName */:\n addElementModifier(this.currentStartTag, mustache);\n break;\n case \"attributeName\" /* attributeName */:\n case \"afterAttributeName\" /* afterAttributeName */:\n this.beginAttributeValue(false);\n this.finishAttributeValue();\n addElementModifier(this.currentStartTag, mustache);\n tokenizer.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n break;\n case \"afterAttributeValueQuoted\" /* afterAttributeValueQuoted */:\n addElementModifier(this.currentStartTag, mustache);\n tokenizer.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n break;\n // Attribute values\n case \"beforeAttributeValue\" /* beforeAttributeValue */:\n this.beginAttributeValue(false);\n appendDynamicAttributeValuePart(this.currentAttribute, mustache);\n tokenizer.transitionTo(\"attributeValueUnquoted\" /* attributeValueUnquoted */);\n break;\n case \"attributeValueDoubleQuoted\" /* attributeValueDoubleQuoted */:\n case \"attributeValueSingleQuoted\" /* attributeValueSingleQuoted */:\n case \"attributeValueUnquoted\" /* attributeValueUnquoted */:\n appendDynamicAttributeValuePart(this.currentAttribute, mustache);\n break;\n // TODO: Only append child when the tokenizer state makes\n // sense to do so, otherwise throw an error.\n default:\n appendChild(this.currentElement(), mustache);\n }\n return mustache;\n }\n ContentStatement(content) {\n updateTokenizerLocation(this.tokenizer, content);\n this.tokenizer.tokenizePart(content.value);\n this.tokenizer.flushData();\n }\n CommentStatement(rawComment) {\n let { tokenizer } = this;\n if (tokenizer.state === \"comment\" /* comment */) {\n this.appendToCommentData(this.sourceForNode(rawComment));\n return null;\n }\n let { value, loc } = rawComment;\n let comment = b.mustacheComment(value, loc);\n switch (tokenizer.state) {\n case \"beforeAttributeName\" /* beforeAttributeName */:\n this.currentStartTag.comments.push(comment);\n break;\n case \"beforeData\" /* beforeData */:\n case \"data\" /* data */:\n appendChild(this.currentElement(), comment);\n break;\n default:\n throw new SyntaxError(`Using a Handlebars comment when in the \\`${tokenizer['state']}\\` state is not supported: \"${comment.value}\" on line ${loc.start.line}:${loc.start.column}`, rawComment.loc);\n }\n return comment;\n }\n PartialStatement(partial) {\n let { loc } = partial;\n throw new SyntaxError(`Handlebars partials are not supported: \"${this.sourceForNode(partial, partial.name)}\" at L${loc.start.line}:C${loc.start.column}`, partial.loc);\n }\n PartialBlockStatement(partialBlock) {\n let { loc } = partialBlock;\n throw new SyntaxError(`Handlebars partial blocks are not supported: \"${this.sourceForNode(partialBlock, partialBlock.name)}\" at L${loc.start.line}:C${loc.start.column}`, partialBlock.loc);\n }\n Decorator(decorator) {\n let { loc } = decorator;\n throw new SyntaxError(`Handlebars decorators are not supported: \"${this.sourceForNode(decorator, decorator.path)}\" at L${loc.start.line}:C${loc.start.column}`, decorator.loc);\n }\n DecoratorBlock(decoratorBlock) {\n let { loc } = decoratorBlock;\n throw new SyntaxError(`Handlebars decorator blocks are not supported: \"${this.sourceForNode(decoratorBlock, decoratorBlock.path)}\" at L${loc.start.line}:C${loc.start.column}`, decoratorBlock.loc);\n }\n SubExpression(sexpr) {\n let { path, params, hash } = acceptCallNodes(this, sexpr);\n return b.sexpr(path, params, hash, sexpr.loc);\n }\n PathExpression(path) {\n let { original, loc } = path;\n let parts;\n if (original.indexOf('/') !== -1) {\n if (original.slice(0, 2) === './') {\n throw new SyntaxError(`Using \"./\" is not supported in Glimmer and unnecessary: \"${path.original}\" on line ${loc.start.line}.`, path.loc);\n }\n if (original.slice(0, 3) === '../') {\n throw new SyntaxError(`Changing context using \"../\" is not supported in Glimmer: \"${path.original}\" on line ${loc.start.line}.`, path.loc);\n }\n if (original.indexOf('.') !== -1) {\n throw new SyntaxError(`Mixing '.' and '/' in paths is not supported in Glimmer; use only '.' to separate property paths: \"${path.original}\" on line ${loc.start.line}.`, path.loc);\n }\n parts = [path.parts.join('/')];\n } else if (original === '.') {\n let locationInfo = `L${loc.start.line}:C${loc.start.column}`;\n throw new SyntaxError(`'.' is not a supported path in Glimmer; check for a path with a trailing '.' at ${locationInfo}.`, path.loc);\n } else {\n parts = path.parts;\n }\n let thisHead = false;\n // This is to fix a bug in the Handlebars AST where the path expressions in\n // `{{this.foo}}` (and similarly `{{foo-bar this.foo named=this.foo}}` etc)\n // are simply turned into `{{foo}}`. The fix is to push it back onto the\n // parts array and let the runtime see the difference. However, we cannot\n // simply use the string `this` as it means literally the property called\n // \"this\" in the current context (it can be expressed in the syntax as\n // `{{[this]}}`, where the square bracket are generally for this kind of\n // escaping – such as `{{foo.[\"bar.baz\"]}}` would mean lookup a property\n // named literally \"bar.baz\" on `this.foo`). By convention, we use `null`\n // for this purpose.\n if (original.match(/^this(\\..+)?$/)) {\n thisHead = true;\n }\n return {\n type: 'PathExpression',\n original: path.original,\n this: thisHead,\n parts,\n data: path.data,\n loc: path.loc\n };\n }\n Hash(hash) {\n let pairs = [];\n for (let i = 0; i < hash.pairs.length; i++) {\n let pair = hash.pairs[i];\n pairs.push(b.pair(pair.key, this.acceptNode(pair.value), pair.loc));\n }\n return b.hash(pairs, hash.loc);\n }\n StringLiteral(string) {\n return b.literal('StringLiteral', string.value, string.loc);\n }\n BooleanLiteral(boolean) {\n return b.literal('BooleanLiteral', boolean.value, boolean.loc);\n }\n NumberLiteral(number) {\n return b.literal('NumberLiteral', number.value, number.loc);\n }\n UndefinedLiteral(undef) {\n return b.literal('UndefinedLiteral', undefined, undef.loc);\n }\n NullLiteral(nul) {\n return b.literal('NullLiteral', null, nul.loc);\n }\n }\n function calculateRightStrippedOffsets(original, value) {\n if (value === '') {\n // if it is empty, just return the count of newlines\n // in original\n return {\n lines: original.split('\\n').length - 1,\n columns: 0\n };\n }\n // otherwise, return the number of newlines prior to\n // `value`\n let difference = original.split(value)[0];\n let lines = difference.split(/\\n/);\n let lineCount = lines.length - 1;\n return {\n lines: lineCount,\n columns: lines[lineCount].length\n };\n }\n function updateTokenizerLocation(tokenizer, content) {\n let line = content.loc.start.line;\n let column = content.loc.start.column;\n let offsets = calculateRightStrippedOffsets(content.original, content.value);\n line = line + offsets.lines;\n if (offsets.lines) {\n column = offsets.columns;\n } else {\n column = column + offsets.columns;\n }\n tokenizer.line = line;\n tokenizer.column = column;\n }\n function acceptCallNodes(compiler, node) {\n let path = compiler.PathExpression(node.path);\n let params = node.params ? node.params.map(e => compiler.acceptNode(e)) : [];\n let hash = node.hash ? compiler.Hash(node.hash) : b.hash();\n return { path, params, hash };\n }\n function addElementModifier(element, mustache) {\n let { path, params, hash, loc } = mustache;\n if (isLiteral(path)) {\n let modifier = `{{${printLiteral(path)}}}`;\n let tag = `<${element.name} ... ${modifier} ...`;\n throw new SyntaxError(`In ${tag}, ${modifier} is not a valid modifier: \"${path.original}\" on line ${loc && loc.start.line}.`, mustache.loc);\n }\n let modifier = b.elementModifier(path, params, hash, loc);\n element.modifiers.push(modifier);\n }\n function addInElementHash(cursor, hash, loc) {\n let hasNextSibling = false;\n hash.pairs.forEach(pair => {\n if (pair.key === 'guid') {\n throw new SyntaxError('Cannot pass `guid` from user space', loc);\n }\n if (pair.key === 'nextSibling') {\n hasNextSibling = true;\n }\n });\n let guid = b.literal('StringLiteral', cursor);\n let guidPair = b.pair('guid', guid);\n hash.pairs.unshift(guidPair);\n if (!hasNextSibling) {\n let nullLiteral = b.literal('NullLiteral', null);\n let nextSibling = b.pair('nextSibling', nullLiteral);\n hash.pairs.push(nextSibling);\n }\n return hash;\n }\n function appendDynamicAttributeValuePart(attribute, part) {\n attribute.isDynamic = true;\n attribute.parts.push(part);\n }\n\n // ensure stays in sync with typing\n // ParentNode and ChildKey types are derived from VisitorKeysMap\n const visitorKeys = {\n Program: ['body'],\n MustacheStatement: ['path', 'params', 'hash'],\n BlockStatement: ['path', 'params', 'hash', 'program', 'inverse'],\n ElementModifierStatement: ['path', 'params', 'hash'],\n PartialStatement: ['name', 'params', 'hash'],\n CommentStatement: [],\n MustacheCommentStatement: [],\n ElementNode: ['attributes', 'modifiers', 'children', 'comments'],\n AttrNode: ['value'],\n TextNode: [],\n ConcatStatement: ['parts'],\n SubExpression: ['path', 'params', 'hash'],\n PathExpression: [],\n StringLiteral: [],\n BooleanLiteral: [],\n NumberLiteral: [],\n NullLiteral: [],\n UndefinedLiteral: [],\n Hash: ['pairs'],\n HashPair: ['value']\n };\n\n const TraversalError = function () {\n TraversalError.prototype = Object.create(Error.prototype);\n TraversalError.prototype.constructor = TraversalError;\n function TraversalError(message, node, parent, key) {\n let error = Error.call(this, message);\n this.key = key;\n this.message = message;\n this.node = node;\n this.parent = parent;\n this.stack = error.stack;\n }\n return TraversalError;\n }();\n function cannotRemoveNode(node, parent, key) {\n return new TraversalError('Cannot remove a node unless it is part of an array', node, parent, key);\n }\n function cannotReplaceNode(node, parent, key) {\n return new TraversalError('Cannot replace a node with multiple nodes unless it is part of an array', node, parent, key);\n }\n function cannotReplaceOrRemoveInKeyHandlerYet(node, key) {\n return new TraversalError('Replacing and removing in key handlers is not yet supported.', node, null, key);\n }\n\n function getEnterFunction(handler) {\n return typeof handler === 'function' ? handler : handler.enter;\n }\n function getExitFunction(handler) {\n return typeof handler !== 'function' ? handler.exit : undefined;\n }\n function getKeyHandler(handler, key) {\n let keyVisitor = typeof handler !== 'function' ? handler.keys : undefined;\n if (keyVisitor === undefined) return;\n let keyHandler = keyVisitor[key];\n if (keyHandler !== undefined) {\n // widen specific key to all keys\n return keyHandler;\n }\n return keyVisitor.All;\n }\n function getNodeHandler(visitor, nodeType) {\n let handler = visitor[nodeType];\n if (handler !== undefined) {\n // widen specific Node to all nodes\n return handler;\n }\n return visitor.All;\n }\n function visitNode(visitor, node) {\n let handler = getNodeHandler(visitor, node.type);\n let enter;\n let exit;\n if (handler !== undefined) {\n enter = getEnterFunction(handler);\n exit = getExitFunction(handler);\n }\n let result;\n if (enter !== undefined) {\n result = enter(node);\n }\n if (result !== undefined && result !== null) {\n if (JSON.stringify(node) === JSON.stringify(result)) {\n result = undefined;\n } else if (Array.isArray(result)) {\n return visitArray(visitor, result) || result;\n } else {\n return visitNode(visitor, result) || result;\n }\n }\n if (result === undefined) {\n let keys = visitorKeys[node.type];\n for (let i = 0; i < keys.length; i++) {\n // we know if it has child keys we can widen to a ParentNode\n visitKey(visitor, handler, node, keys[i]);\n }\n if (exit !== undefined) {\n result = exit(node);\n }\n }\n return result;\n }\n function visitKey(visitor, handler, node, key) {\n let value = node[key];\n if (!value) {\n return;\n }\n let keyEnter;\n let keyExit;\n if (handler !== undefined) {\n let keyHandler = getKeyHandler(handler, key);\n if (keyHandler !== undefined) {\n keyEnter = getEnterFunction(keyHandler);\n keyExit = getExitFunction(keyHandler);\n }\n }\n if (keyEnter !== undefined) {\n if (keyEnter(node, key) !== undefined) {\n throw cannotReplaceOrRemoveInKeyHandlerYet(node, key);\n }\n }\n if (Array.isArray(value)) {\n visitArray(visitor, value);\n } else {\n let result = visitNode(visitor, value);\n if (result !== undefined) {\n assignKey(node, key, result);\n }\n }\n if (keyExit !== undefined) {\n if (keyExit(node, key) !== undefined) {\n throw cannotReplaceOrRemoveInKeyHandlerYet(node, key);\n }\n }\n }\n function visitArray(visitor, array) {\n for (let i = 0; i < array.length; i++) {\n let result = visitNode(visitor, array[i]);\n if (result !== undefined) {\n i += spliceArray(array, i, result) - 1;\n }\n }\n }\n function assignKey(node, key, result) {\n if (result === null) {\n throw cannotRemoveNode(node[key], node, key);\n } else if (Array.isArray(result)) {\n if (result.length === 1) {\n node[key] = result[0];\n } else {\n if (result.length === 0) {\n throw cannotRemoveNode(node[key], node, key);\n } else {\n throw cannotReplaceNode(node[key], node, key);\n }\n }\n } else {\n node[key] = result;\n }\n }\n function spliceArray(array, index, result) {\n if (result === null) {\n array.splice(index, 1);\n return 0;\n } else if (Array.isArray(result)) {\n array.splice(index, 1, ...result);\n return result.length;\n } else {\n array.splice(index, 1, result);\n return 1;\n }\n }\n function traverse(node, visitor) {\n visitNode(visitor, node);\n }\n\n const ATTR_VALUE_REGEX_TEST = /[\\xA0\"&]/;\n const ATTR_VALUE_REGEX_REPLACE = new RegExp(ATTR_VALUE_REGEX_TEST.source, 'g');\n const TEXT_REGEX_TEST = /[\\xA0&<>]/;\n const TEXT_REGEX_REPLACE = new RegExp(TEXT_REGEX_TEST.source, 'g');\n function attrValueReplacer(char) {\n switch (char.charCodeAt(0)) {\n case 160 /* NBSP */:\n return ' ';\n case 34 /* QUOT */:\n return '"';\n case 38 /* AMP */:\n return '&';\n default:\n return char;\n }\n }\n function textReplacer(char) {\n switch (char.charCodeAt(0)) {\n case 160 /* NBSP */:\n return ' ';\n case 38 /* AMP */:\n return '&';\n case 60 /* LT */:\n return '<';\n case 62 /* GT */:\n return '>';\n default:\n return char;\n }\n }\n function escapeAttrValue(attrValue) {\n if (ATTR_VALUE_REGEX_TEST.test(attrValue)) {\n return attrValue.replace(ATTR_VALUE_REGEX_REPLACE, attrValueReplacer);\n }\n return attrValue;\n }\n function escapeText(text) {\n if (TEXT_REGEX_TEST.test(text)) {\n return text.replace(TEXT_REGEX_REPLACE, textReplacer);\n }\n return text;\n }\n\n function unreachable() {\n throw new Error('unreachable');\n }\n function build(ast) {\n if (!ast) {\n return '';\n }\n const output = [];\n switch (ast.type) {\n case 'Program':\n {\n const chainBlock = ast['chained'] && ast.body[0];\n if (chainBlock) {\n chainBlock['chained'] = true;\n }\n const body = buildEach(ast.body).join('');\n output.push(body);\n }\n break;\n case 'ElementNode':\n output.push('<', ast.tag);\n if (ast.attributes.length) {\n output.push(' ', buildEach(ast.attributes).join(' '));\n }\n if (ast.modifiers.length) {\n output.push(' ', buildEach(ast.modifiers).join(' '));\n }\n if (ast.comments.length) {\n output.push(' ', buildEach(ast.comments).join(' '));\n }\n if (ast.blockParams.length) {\n output.push(' ', 'as', ' ', `|${ast.blockParams.join(' ')}|`);\n }\n if (voidMap[ast.tag]) {\n if (ast.selfClosing) {\n output.push(' /');\n }\n output.push('>');\n } else {\n output.push('>');\n output.push.apply(output, buildEach(ast.children));\n output.push('');\n }\n break;\n case 'AttrNode':\n if (ast.value.type === 'TextNode') {\n if (ast.value.chars !== '') {\n output.push(ast.name, '=');\n output.push('\"', escapeAttrValue(ast.value.chars), '\"');\n } else {\n output.push(ast.name);\n }\n } else {\n output.push(ast.name, '=');\n // ast.value is mustache or concat\n output.push(build(ast.value));\n }\n break;\n case 'ConcatStatement':\n output.push('\"');\n ast.parts.forEach(node => {\n if (node.type === 'TextNode') {\n output.push(escapeAttrValue(node.chars));\n } else {\n output.push(build(node));\n }\n });\n output.push('\"');\n break;\n case 'TextNode':\n output.push(escapeText(ast.chars));\n break;\n case 'MustacheStatement':\n {\n output.push(compactJoin(['{{', pathParams(ast), '}}']));\n }\n break;\n case 'MustacheCommentStatement':\n {\n output.push(compactJoin(['{{!--', ast.value, '--}}']));\n }\n break;\n case 'ElementModifierStatement':\n {\n output.push(compactJoin(['{{', pathParams(ast), '}}']));\n }\n break;\n case 'PathExpression':\n output.push(ast.original);\n break;\n case 'SubExpression':\n {\n output.push('(', pathParams(ast), ')');\n }\n break;\n case 'BooleanLiteral':\n output.push(ast.value ? 'true' : 'false');\n break;\n case 'BlockStatement':\n {\n const lines = [];\n if (ast['chained']) {\n lines.push(['{{else ', pathParams(ast), '}}'].join(''));\n } else {\n lines.push(openBlock(ast));\n }\n lines.push(build(ast.program));\n if (ast.inverse) {\n if (!ast.inverse['chained']) {\n lines.push('{{else}}');\n }\n lines.push(build(ast.inverse));\n }\n if (!ast['chained']) {\n lines.push(closeBlock(ast));\n }\n output.push(lines.join(''));\n }\n break;\n case 'PartialStatement':\n {\n output.push(compactJoin(['{{>', pathParams(ast), '}}']));\n }\n break;\n case 'CommentStatement':\n {\n output.push(compactJoin(['']));\n }\n break;\n case 'StringLiteral':\n {\n output.push(`\"${ast.value}\"`);\n }\n break;\n case 'NumberLiteral':\n {\n output.push(String(ast.value));\n }\n break;\n case 'UndefinedLiteral':\n {\n output.push('undefined');\n }\n break;\n case 'NullLiteral':\n {\n output.push('null');\n }\n break;\n case 'Hash':\n {\n output.push(ast.pairs.map(pair => {\n return build(pair);\n }).join(' '));\n }\n break;\n case 'HashPair':\n {\n output.push(`${ast.key}=${build(ast.value)}`);\n }\n break;\n }\n return output.join('');\n }\n function compact(array) {\n const newArray = [];\n array.forEach(a => {\n if (typeof a !== 'undefined' && a !== null && a !== '') {\n newArray.push(a);\n }\n });\n return newArray;\n }\n function buildEach(asts) {\n return asts.map(build);\n }\n function pathParams(ast) {\n let path;\n switch (ast.type) {\n case 'MustacheStatement':\n case 'SubExpression':\n case 'ElementModifierStatement':\n case 'BlockStatement':\n if (isLiteral(ast.path)) {\n return String(ast.path.value);\n }\n path = build(ast.path);\n break;\n case 'PartialStatement':\n path = build(ast.name);\n break;\n default:\n return unreachable();\n }\n return compactJoin([path, buildEach(ast.params).join(' '), build(ast.hash)], ' ');\n }\n function compactJoin(array, delimiter) {\n return compact(array).join(delimiter || '');\n }\n function blockParams(block) {\n const params = block.program.blockParams;\n if (params.length) {\n return ` as |${params.join(' ')}|`;\n }\n return null;\n }\n function openBlock(block) {\n return ['{{#', pathParams(block), blockParams(block), '}}'].join('');\n }\n function closeBlock(block) {\n return ['{{/', build(block.path), '}}'].join('');\n }\n\n class Walker {\n constructor(order) {\n this.order = order;\n this.stack = [];\n }\n visit(node, callback) {\n if (!node) {\n return;\n }\n this.stack.push(node);\n if (this.order === 'post') {\n this.children(node, callback);\n callback(node, this);\n } else {\n callback(node, this);\n this.children(node, callback);\n }\n this.stack.pop();\n }\n children(node, callback) {\n let visitor = visitors[node.type];\n if (visitor) {\n visitor(this, node, callback);\n }\n }\n }\n let visitors = {\n Program(walker, node, callback) {\n for (let i = 0; i < node.body.length; i++) {\n walker.visit(node.body[i], callback);\n }\n },\n ElementNode(walker, node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n walker.visit(node.children[i], callback);\n }\n },\n BlockStatement(walker, node, callback) {\n walker.visit(node.program, callback);\n walker.visit(node.inverse || null, callback);\n }\n };\n\n const voidMap = Object.create(null);\n let voidTagNames = 'area base br col command embed hr img input keygen link meta param source track wbr';\n voidTagNames.split(' ').forEach(tagName => {\n voidMap[tagName] = true;\n });\n class TokenizerEventHandlers extends HandlebarsNodeVisitors {\n constructor() {\n super(...arguments);\n this.tagOpenLine = 0;\n this.tagOpenColumn = 0;\n }\n reset() {\n this.currentNode = null;\n }\n // Comment\n beginComment() {\n this.currentNode = b.comment('');\n this.currentNode.loc = {\n source: null,\n start: b.pos(this.tagOpenLine, this.tagOpenColumn),\n end: null\n };\n }\n appendToCommentData(char) {\n this.currentComment.value += char;\n }\n finishComment() {\n this.currentComment.loc.end = b.pos(this.tokenizer.line, this.tokenizer.column);\n appendChild(this.currentElement(), this.currentComment);\n }\n // Data\n beginData() {\n this.currentNode = b.text();\n this.currentNode.loc = {\n source: null,\n start: b.pos(this.tokenizer.line, this.tokenizer.column),\n end: null\n };\n }\n appendToData(char) {\n this.currentData.chars += char;\n }\n finishData() {\n this.currentData.loc.end = b.pos(this.tokenizer.line, this.tokenizer.column);\n appendChild(this.currentElement(), this.currentData);\n }\n // Tags - basic\n tagOpen() {\n this.tagOpenLine = this.tokenizer.line;\n this.tagOpenColumn = this.tokenizer.column;\n }\n beginStartTag() {\n this.currentNode = {\n type: 'StartTag',\n name: '',\n attributes: [],\n modifiers: [],\n comments: [],\n selfClosing: false,\n loc: SYNTHETIC\n };\n }\n beginEndTag() {\n this.currentNode = {\n type: 'EndTag',\n name: '',\n attributes: [],\n modifiers: [],\n comments: [],\n selfClosing: false,\n loc: SYNTHETIC\n };\n }\n finishTag() {\n let { line, column } = this.tokenizer;\n let tag = this.currentTag;\n tag.loc = b.loc(this.tagOpenLine, this.tagOpenColumn, line, column);\n if (tag.type === 'StartTag') {\n this.finishStartTag();\n if (voidMap[tag.name] || tag.selfClosing) {\n this.finishEndTag(true);\n }\n } else if (tag.type === 'EndTag') {\n this.finishEndTag(false);\n }\n }\n finishStartTag() {\n let { name, attributes, modifiers, comments, selfClosing } = this.currentStartTag;\n let loc = b.loc(this.tagOpenLine, this.tagOpenColumn);\n let element = b.element({ name, selfClosing }, attributes, modifiers, [], comments, [], loc);\n this.elementStack.push(element);\n }\n finishEndTag(isVoid) {\n let tag = this.currentTag;\n let element = this.elementStack.pop();\n let parent = this.currentElement();\n validateEndTag(tag, element, isVoid);\n element.loc.end.line = this.tokenizer.line;\n element.loc.end.column = this.tokenizer.column;\n parseElementBlockParams(element);\n appendChild(parent, element);\n }\n markTagAsSelfClosing() {\n this.currentTag.selfClosing = true;\n }\n // Tags - name\n appendToTagName(char) {\n this.currentTag.name += char;\n }\n // Tags - attributes\n beginAttribute() {\n let tag = this.currentTag;\n if (tag.type === 'EndTag') {\n throw new SyntaxError(`Invalid end tag: closing tag must not have attributes, ` + `in \\`${tag.name}\\` (on line ${this.tokenizer.line}).`, tag.loc);\n }\n this.currentAttribute = {\n name: '',\n parts: [],\n isQuoted: false,\n isDynamic: false,\n start: b.pos(this.tokenizer.line, this.tokenizer.column),\n valueStartLine: 0,\n valueStartColumn: 0\n };\n }\n appendToAttributeName(char) {\n this.currentAttr.name += char;\n }\n beginAttributeValue(isQuoted) {\n this.currentAttr.isQuoted = isQuoted;\n this.currentAttr.valueStartLine = this.tokenizer.line;\n this.currentAttr.valueStartColumn = this.tokenizer.column;\n }\n appendToAttributeValue(char) {\n let parts = this.currentAttr.parts;\n let lastPart = parts[parts.length - 1];\n if (lastPart && lastPart.type === 'TextNode') {\n lastPart.chars += char;\n // update end location for each added char\n lastPart.loc.end.line = this.tokenizer.line;\n lastPart.loc.end.column = this.tokenizer.column;\n } else {\n // initially assume the text node is a single char\n let loc = b.loc(this.tokenizer.line, this.tokenizer.column, this.tokenizer.line, this.tokenizer.column);\n // correct for `\\n` as first char\n if (char === '\\n') {\n loc.start.line -= 1;\n loc.start.column = lastPart ? lastPart.loc.end.column : this.currentAttr.valueStartColumn;\n }\n let text = b.text(char, loc);\n parts.push(text);\n }\n }\n finishAttributeValue() {\n let { name, parts, isQuoted, isDynamic, valueStartLine, valueStartColumn } = this.currentAttr;\n let value = assembleAttributeValue(parts, isQuoted, isDynamic, this.tokenizer.line);\n value.loc = b.loc(valueStartLine, valueStartColumn, this.tokenizer.line, this.tokenizer.column);\n let loc = b.loc(this.currentAttr.start.line, this.currentAttr.start.column, this.tokenizer.line, this.tokenizer.column);\n let attribute = b.attr(name, value, loc);\n this.currentStartTag.attributes.push(attribute);\n }\n reportSyntaxError(message) {\n throw new SyntaxError(`Syntax error at line ${this.tokenizer.line} col ${this.tokenizer.column}: ${message}`, b.loc(this.tokenizer.line, this.tokenizer.column));\n }\n }\n function assembleAttributeValue(parts, isQuoted, isDynamic, line) {\n if (isDynamic) {\n if (isQuoted) {\n return assembleConcatenatedValue(parts);\n } else {\n if (parts.length === 1 || parts.length === 2 && parts[1].type === 'TextNode' && parts[1].chars === '/') {\n return parts[0];\n } else {\n throw new SyntaxError(`An unquoted attribute value must be a string or a mustache, ` + `preceeded by whitespace or a '=' character, and ` + `followed by whitespace, a '>' character, or '/>' (on line ${line})`, b.loc(line, 0));\n }\n }\n } else {\n return parts.length > 0 ? parts[0] : b.text('');\n }\n }\n function assembleConcatenatedValue(parts) {\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n if (part.type !== 'MustacheStatement' && part.type !== 'TextNode') {\n throw new SyntaxError('Unsupported node in quoted attribute value: ' + part['type'], part.loc);\n }\n }\n return b.concat(parts);\n }\n function validateEndTag(tag, element, selfClosing) {\n let error;\n if (voidMap[tag.name] && !selfClosing) {\n // EngTag is also called by StartTag for void and self-closing tags (i.e.\n // or
    , so we need to check for that here. Otherwise, we would\n // throw an error for those cases.\n error = 'Invalid end tag ' + formatEndTagInfo(tag) + ' (void elements cannot have end tags).';\n } else if (element.tag === undefined) {\n error = 'Closing tag ' + formatEndTagInfo(tag) + ' without an open tag.';\n } else if (element.tag !== tag.name) {\n error = 'Closing tag ' + formatEndTagInfo(tag) + ' did not match last open tag `' + element.tag + '` (on line ' + element.loc.start.line + ').';\n }\n if (error) {\n throw new SyntaxError(error, element.loc);\n }\n }\n function formatEndTagInfo(tag) {\n return '`' + tag.name + '` (on line ' + tag.loc.end.line + ')';\n }\n const syntax = {\n parse: preprocess,\n builders: b,\n print: build,\n traverse,\n Walker\n };\n function preprocess(html, options) {\n let ast = typeof html === 'object' ? html : (0, _handlebars.parse)(html);\n let program = new TokenizerEventHandlers(html).acceptNode(ast);\n if (options && options.plugins && options.plugins.ast) {\n for (let i = 0, l = options.plugins.ast.length; i < l; i++) {\n let transform = options.plugins.ast[i];\n let env = (0, _util.assign)({}, options, { syntax }, { plugins: undefined });\n let pluginResult = transform(env);\n traverse(program, pluginResult.visitor);\n }\n }\n return program;\n }\n\n var nodes = /*#__PURE__*/Object.freeze({});\n\n // used by ember-compiler\n\n exports.AST = nodes;\n exports.preprocess = preprocess;\n exports.builders = b;\n exports.TraversalError = TraversalError;\n exports.cannotRemoveNode = cannotRemoveNode;\n exports.cannotReplaceNode = cannotReplaceNode;\n exports.cannotReplaceOrRemoveInKeyHandlerYet = cannotReplaceOrRemoveInKeyHandlerYet;\n exports.traverse = traverse;\n exports.Walker = Walker;\n exports.print = build;\n exports.SyntaxError = SyntaxError;\n exports.isLiteral = isLiteral;\n exports.printLiteral = printLiteral;\n});","enifed('@glimmer/util', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n function unwrap(val) {\n if (val === null || val === undefined) throw new Error(`Expected value to be present`);\n return val;\n }\n function expect(val, message) {\n if (val === null || val === undefined) throw new Error(message);\n return val;\n }\n function unreachable(message = 'unreachable') {\n return new Error(message);\n }\n\n // import Logger from './logger';\n // let alreadyWarned = false;\n function debugAssert(test, msg) {\n // if (!alreadyWarned) {\n // alreadyWarned = true;\n // Logger.warn(\"Don't leave debug assertions on in public builds\");\n // }\n if (!test) {\n throw new Error(msg || 'assertion failure');\n }\n }\n\n const { keys: objKeys } = Object;\n function assign(obj) {\n for (let i = 1; i < arguments.length; i++) {\n let assignment = arguments[i];\n if (assignment === null || typeof assignment !== 'object') continue;\n let keys = objKeys(assignment);\n for (let j = 0; j < keys.length; j++) {\n let key = keys[j];\n obj[key] = assignment[key];\n }\n }\n return obj;\n }\n function fillNulls(count) {\n let arr = new Array(count);\n for (let i = 0; i < count; i++) {\n arr[i] = null;\n }\n return arr;\n }\n\n let GUID = 0;\n function initializeGuid(object) {\n return object._guid = ++GUID;\n }\n function ensureGuid(object) {\n return object._guid || initializeGuid(object);\n }\n\n const SERIALIZATION_FIRST_NODE_STRING = '%+b:0%';\n function isSerializationFirstNode(node) {\n return node.nodeValue === SERIALIZATION_FIRST_NODE_STRING;\n }\n\n function dict() {\n return Object.create(null);\n }\n class DictSet {\n constructor() {\n this.dict = dict();\n }\n add(obj) {\n if (typeof obj === 'string') this.dict[obj] = obj;else this.dict[ensureGuid(obj)] = obj;\n return this;\n }\n delete(obj) {\n if (typeof obj === 'string') delete this.dict[obj];else if (obj._guid) delete this.dict[obj._guid];\n }\n }\n class Stack {\n constructor() {\n this.stack = [];\n this.current = null;\n }\n get size() {\n return this.stack.length;\n }\n push(item) {\n this.current = item;\n this.stack.push(item);\n }\n pop() {\n let item = this.stack.pop();\n let len = this.stack.length;\n this.current = len === 0 ? null : this.stack[len - 1];\n return item === undefined ? null : item;\n }\n isEmpty() {\n return this.stack.length === 0;\n }\n }\n\n class ListNode {\n constructor(value) {\n this.next = null;\n this.prev = null;\n this.value = value;\n }\n }\n class LinkedList {\n constructor() {\n this.clear();\n }\n head() {\n return this._head;\n }\n tail() {\n return this._tail;\n }\n clear() {\n this._head = this._tail = null;\n }\n toArray() {\n let out = [];\n this.forEachNode(n => out.push(n));\n return out;\n }\n nextNode(node) {\n return node.next;\n }\n forEachNode(callback) {\n let node = this._head;\n while (node !== null) {\n callback(node);\n node = node.next;\n }\n }\n insertBefore(node, reference = null) {\n if (reference === null) return this.append(node);\n if (reference.prev) reference.prev.next = node;else this._head = node;\n node.prev = reference.prev;\n node.next = reference;\n reference.prev = node;\n return node;\n }\n append(node) {\n let tail = this._tail;\n if (tail) {\n tail.next = node;\n node.prev = tail;\n node.next = null;\n } else {\n this._head = node;\n }\n return this._tail = node;\n }\n remove(node) {\n if (node.prev) node.prev.next = node.next;else this._head = node.next;\n if (node.next) node.next.prev = node.prev;else this._tail = node.prev;\n return node;\n }\n }\n class ListSlice {\n constructor(head, tail) {\n this._head = head;\n this._tail = tail;\n }\n forEachNode(callback) {\n let node = this._head;\n while (node !== null) {\n callback(node);\n node = this.nextNode(node);\n }\n }\n head() {\n return this._head;\n }\n tail() {\n return this._tail;\n }\n toArray() {\n let out = [];\n this.forEachNode(n => out.push(n));\n return out;\n }\n nextNode(node) {\n if (node === this._tail) return null;\n return node.next;\n }\n }\n const EMPTY_SLICE = new ListSlice(null, null);\n\n const EMPTY_ARRAY = Object.freeze([]);\n\n exports.assert = debugAssert;\n exports.assign = assign;\n exports.fillNulls = fillNulls;\n exports.ensureGuid = ensureGuid;\n exports.initializeGuid = initializeGuid;\n exports.isSerializationFirstNode = isSerializationFirstNode;\n exports.SERIALIZATION_FIRST_NODE_STRING = SERIALIZATION_FIRST_NODE_STRING;\n exports.Stack = Stack;\n exports.DictSet = DictSet;\n exports.dict = dict;\n exports.EMPTY_SLICE = EMPTY_SLICE;\n exports.LinkedList = LinkedList;\n exports.ListNode = ListNode;\n exports.ListSlice = ListSlice;\n exports.EMPTY_ARRAY = EMPTY_ARRAY;\n exports.unwrap = unwrap;\n exports.expect = expect;\n exports.unreachable = unreachable;\n});","enifed(\"@glimmer/vm\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n /**\n * Registers\n *\n * For the most part, these follows MIPS naming conventions, however the\n * register numbers are different.\n */\n var Register;\n (function (Register) {\n // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit\n Register[Register[\"pc\"] = 0] = \"pc\";\n // $1 or $ra (return address): pointer into `program` for the return\n Register[Register[\"ra\"] = 1] = \"ra\";\n // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack\n Register[Register[\"fp\"] = 2] = \"fp\";\n // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack\n Register[Register[\"sp\"] = 3] = \"sp\";\n // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers\n Register[Register[\"s0\"] = 4] = \"s0\";\n Register[Register[\"s1\"] = 5] = \"s1\";\n // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers\n Register[Register[\"t0\"] = 6] = \"t0\";\n Register[Register[\"t1\"] = 7] = \"t1\";\n // $8 or $v0 (return value)\n Register[Register[\"v0\"] = 8] = \"v0\";\n })(Register || (exports.Register = Register = {}));\n\n exports.Register = Register;\n});","enifed(\"@glimmer/wire-format\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n var Opcodes;\n (function (Opcodes) {\n // Statements\n Opcodes[Opcodes[\"Text\"] = 0] = \"Text\";\n Opcodes[Opcodes[\"Append\"] = 1] = \"Append\";\n Opcodes[Opcodes[\"Comment\"] = 2] = \"Comment\";\n Opcodes[Opcodes[\"Modifier\"] = 3] = \"Modifier\";\n Opcodes[Opcodes[\"Block\"] = 4] = \"Block\";\n Opcodes[Opcodes[\"Component\"] = 5] = \"Component\";\n Opcodes[Opcodes[\"DynamicComponent\"] = 6] = \"DynamicComponent\";\n Opcodes[Opcodes[\"OpenElement\"] = 7] = \"OpenElement\";\n Opcodes[Opcodes[\"OpenSplattedElement\"] = 8] = \"OpenSplattedElement\";\n Opcodes[Opcodes[\"FlushElement\"] = 9] = \"FlushElement\";\n Opcodes[Opcodes[\"CloseElement\"] = 10] = \"CloseElement\";\n Opcodes[Opcodes[\"StaticAttr\"] = 11] = \"StaticAttr\";\n Opcodes[Opcodes[\"DynamicAttr\"] = 12] = \"DynamicAttr\";\n Opcodes[Opcodes[\"AttrSplat\"] = 13] = \"AttrSplat\";\n Opcodes[Opcodes[\"Yield\"] = 14] = \"Yield\";\n Opcodes[Opcodes[\"Partial\"] = 15] = \"Partial\";\n Opcodes[Opcodes[\"DynamicArg\"] = 16] = \"DynamicArg\";\n Opcodes[Opcodes[\"StaticArg\"] = 17] = \"StaticArg\";\n Opcodes[Opcodes[\"TrustingAttr\"] = 18] = \"TrustingAttr\";\n Opcodes[Opcodes[\"Debugger\"] = 19] = \"Debugger\";\n Opcodes[Opcodes[\"ClientSideStatement\"] = 20] = \"ClientSideStatement\";\n // Expressions\n Opcodes[Opcodes[\"Unknown\"] = 21] = \"Unknown\";\n Opcodes[Opcodes[\"Get\"] = 22] = \"Get\";\n Opcodes[Opcodes[\"MaybeLocal\"] = 23] = \"MaybeLocal\";\n Opcodes[Opcodes[\"HasBlock\"] = 24] = \"HasBlock\";\n Opcodes[Opcodes[\"HasBlockParams\"] = 25] = \"HasBlockParams\";\n Opcodes[Opcodes[\"Undefined\"] = 26] = \"Undefined\";\n Opcodes[Opcodes[\"Helper\"] = 27] = \"Helper\";\n Opcodes[Opcodes[\"Concat\"] = 28] = \"Concat\";\n Opcodes[Opcodes[\"ClientSideExpression\"] = 29] = \"ClientSideExpression\";\n })(Opcodes || (exports.Ops = Opcodes = {}));\n\n function is(variant) {\n return function (value) {\n return Array.isArray(value) && value[0] === variant;\n };\n }\n // Statements\n const isFlushElement = is(Opcodes.FlushElement);\n const isAttrSplat = is(Opcodes.AttrSplat);\n function isAttribute(val) {\n return val[0] === Opcodes.StaticAttr || val[0] === Opcodes.DynamicAttr || val[0] === Opcodes.TrustingAttr;\n }\n function isArgument(val) {\n return val[0] === Opcodes.StaticArg || val[0] === Opcodes.DynamicArg;\n }\n // Expressions\n const isGet = is(Opcodes.Get);\n const isMaybeLocal = is(Opcodes.MaybeLocal);\n\n exports.is = is;\n exports.isFlushElement = isFlushElement;\n exports.isAttrSplat = isAttrSplat;\n exports.isAttribute = isAttribute;\n exports.isArgument = isArgument;\n exports.isGet = isGet;\n exports.isMaybeLocal = isMaybeLocal;\n exports.Ops = Opcodes;\n});","enifed('backburner', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n const SET_TIMEOUT = setTimeout;\n const NOOP = () => {};\n function buildPlatform(flush) {\n let next;\n let clearNext = NOOP;\n if (typeof MutationObserver === 'function') {\n let iterations = 0;\n let observer = new MutationObserver(flush);\n let node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n next = () => {\n iterations = ++iterations % 2;\n node.data = '' + iterations;\n return iterations;\n };\n } else if (typeof Promise === 'function') {\n const autorunPromise = Promise.resolve();\n next = () => autorunPromise.then(flush);\n } else {\n next = () => SET_TIMEOUT(flush, 0);\n }\n return {\n setTimeout(fn, ms) {\n return setTimeout(fn, ms);\n },\n clearTimeout(timerId) {\n return clearTimeout(timerId);\n },\n now() {\n return Date.now();\n },\n next,\n clearNext\n };\n }\n\n const NUMBER = /\\d+/;\n const TIMERS_OFFSET = 6;\n function isCoercableNumber(suspect) {\n let type = typeof suspect;\n return type === 'number' && suspect === suspect || type === 'string' && NUMBER.test(suspect);\n }\n function getOnError(options) {\n return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];\n }\n function findItem(target, method, collection) {\n let index = -1;\n for (let i = 0, l = collection.length; i < l; i += 4) {\n if (collection[i] === target && collection[i + 1] === method) {\n index = i;\n break;\n }\n }\n return index;\n }\n function findTimerItem(target, method, collection) {\n let index = -1;\n for (let i = 2, l = collection.length; i < l; i += 6) {\n if (collection[i] === target && collection[i + 1] === method) {\n index = i - 2;\n break;\n }\n }\n return index;\n }\n function getQueueItems(items, queueItemLength, queueItemPositionOffset = 0) {\n let queueItems = [];\n for (let i = 0; i < items.length; i += queueItemLength) {\n let maybeError = items[i + 3 /* stack */ + queueItemPositionOffset];\n let queueItem = {\n target: items[i + 0 /* target */ + queueItemPositionOffset],\n method: items[i + 1 /* method */ + queueItemPositionOffset],\n args: items[i + 2 /* args */ + queueItemPositionOffset],\n stack: maybeError !== undefined && 'stack' in maybeError ? maybeError.stack : ''\n };\n queueItems.push(queueItem);\n }\n return queueItems;\n }\n\n function binarySearch(time, timers) {\n let start = 0;\n let end = timers.length - TIMERS_OFFSET;\n let middle;\n let l;\n while (start < end) {\n // since timers is an array of pairs 'l' will always\n // be an integer\n l = (end - start) / TIMERS_OFFSET;\n // compensate for the index in case even number\n // of pairs inside timers\n middle = start + l - l % TIMERS_OFFSET;\n if (time >= timers[middle]) {\n start = middle + TIMERS_OFFSET;\n } else {\n end = middle;\n }\n }\n return time >= timers[start] ? start + TIMERS_OFFSET : start;\n }\n\n const QUEUE_ITEM_LENGTH = 4;\n class Queue {\n constructor(name, options = {}, globalOptions = {}) {\n this._queueBeingFlushed = [];\n this.targetQueues = new Map();\n this.index = 0;\n this._queue = [];\n this.name = name;\n this.options = options;\n this.globalOptions = globalOptions;\n }\n stackFor(index) {\n if (index < this._queue.length) {\n let entry = this._queue[index * 3 + QUEUE_ITEM_LENGTH];\n if (entry) {\n return entry.stack;\n } else {\n return null;\n }\n }\n }\n flush(sync) {\n let { before, after } = this.options;\n let target;\n let method;\n let args;\n let errorRecordedForStack;\n this.targetQueues.clear();\n if (this._queueBeingFlushed.length === 0) {\n this._queueBeingFlushed = this._queue;\n this._queue = [];\n }\n if (before !== undefined) {\n before();\n }\n let invoke;\n let queueItems = this._queueBeingFlushed;\n if (queueItems.length > 0) {\n let onError = getOnError(this.globalOptions);\n invoke = onError ? this.invokeWithOnError : this.invoke;\n for (let i = this.index; i < queueItems.length; i += QUEUE_ITEM_LENGTH) {\n this.index += QUEUE_ITEM_LENGTH;\n method = queueItems[i + 1];\n // method could have been nullified / canceled during flush\n if (method !== null) {\n //\n // ** Attention intrepid developer **\n //\n // To find out the stack of this task when it was scheduled onto\n // the run loop, add the following to your app.js:\n //\n // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.\n //\n // Once that is in place, when you are at a breakpoint and navigate\n // here in the stack explorer, you can look at `errorRecordedForStack.stack`,\n // which will be the captured stack when this job was scheduled.\n //\n // One possible long-term solution is the following Chrome issue:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=332624\n //\n target = queueItems[i];\n args = queueItems[i + 2];\n errorRecordedForStack = queueItems[i + 3]; // Debugging assistance\n invoke(target, method, args, onError, errorRecordedForStack);\n }\n if (this.index !== this._queueBeingFlushed.length && this.globalOptions.mustYield && this.globalOptions.mustYield()) {\n return 1 /* Pause */;\n }\n }\n }\n if (after !== undefined) {\n after();\n }\n this._queueBeingFlushed.length = 0;\n this.index = 0;\n if (sync !== false && this._queue.length > 0) {\n // check if new items have been added\n this.flush(true);\n }\n }\n hasWork() {\n return this._queueBeingFlushed.length > 0 || this._queue.length > 0;\n }\n cancel({ target, method }) {\n let queue = this._queue;\n let targetQueueMap = this.targetQueues.get(target);\n if (targetQueueMap !== undefined) {\n targetQueueMap.delete(method);\n }\n let index = findItem(target, method, queue);\n if (index > -1) {\n queue.splice(index, QUEUE_ITEM_LENGTH);\n return true;\n }\n // if not found in current queue\n // could be in the queue that is being flushed\n queue = this._queueBeingFlushed;\n index = findItem(target, method, queue);\n if (index > -1) {\n queue[index + 1] = null;\n return true;\n }\n return false;\n }\n push(target, method, args, stack) {\n this._queue.push(target, method, args, stack);\n return {\n queue: this,\n target,\n method\n };\n }\n pushUnique(target, method, args, stack) {\n let localQueueMap = this.targetQueues.get(target);\n if (localQueueMap === undefined) {\n localQueueMap = new Map();\n this.targetQueues.set(target, localQueueMap);\n }\n let index = localQueueMap.get(method);\n if (index === undefined) {\n let queueIndex = this._queue.push(target, method, args, stack) - QUEUE_ITEM_LENGTH;\n localQueueMap.set(method, queueIndex);\n } else {\n let queue = this._queue;\n queue[index + 2] = args; // replace args\n queue[index + 3] = stack; // replace stack\n }\n return {\n queue: this,\n target,\n method\n };\n }\n _getDebugInfo(debugEnabled) {\n if (debugEnabled) {\n let debugInfo = getQueueItems(this._queue, QUEUE_ITEM_LENGTH);\n return debugInfo;\n }\n return undefined;\n }\n invoke(target, method, args /*, onError, errorRecordedForStack */) {\n if (args === undefined) {\n method.call(target);\n } else {\n method.apply(target, args);\n }\n }\n invokeWithOnError(target, method, args, onError, errorRecordedForStack) {\n try {\n if (args === undefined) {\n method.call(target);\n } else {\n method.apply(target, args);\n }\n } catch (error) {\n onError(error, errorRecordedForStack);\n }\n }\n }\n\n class DeferredActionQueues {\n constructor(queueNames = [], options) {\n this.queues = {};\n this.queueNameIndex = 0;\n this.queueNames = queueNames;\n queueNames.reduce(function (queues, queueName) {\n queues[queueName] = new Queue(queueName, options[queueName], options);\n return queues;\n }, this.queues);\n }\n /**\n * @method schedule\n * @param {String} queueName\n * @param {Any} target\n * @param {Any} method\n * @param {Any} args\n * @param {Boolean} onceFlag\n * @param {Any} stack\n * @return queue\n */\n schedule(queueName, target, method, args, onceFlag, stack) {\n let queues = this.queues;\n let queue = queues[queueName];\n if (queue === undefined) {\n throw new Error(`You attempted to schedule an action in a queue (${queueName}) that doesn\\'t exist`);\n }\n if (method === undefined || method === null) {\n throw new Error(`You attempted to schedule an action in a queue (${queueName}) for a method that doesn\\'t exist`);\n }\n this.queueNameIndex = 0;\n if (onceFlag) {\n return queue.pushUnique(target, method, args, stack);\n } else {\n return queue.push(target, method, args, stack);\n }\n }\n /**\n * DeferredActionQueues.flush() calls Queue.flush()\n *\n * @method flush\n * @param {Boolean} fromAutorun\n */\n flush(fromAutorun = false) {\n let queue;\n let queueName;\n let numberOfQueues = this.queueNames.length;\n while (this.queueNameIndex < numberOfQueues) {\n queueName = this.queueNames[this.queueNameIndex];\n queue = this.queues[queueName];\n if (queue.hasWork() === false) {\n this.queueNameIndex++;\n if (fromAutorun && this.queueNameIndex < numberOfQueues) {\n return 1 /* Pause */;\n }\n } else {\n if (queue.flush(false /* async */) === 1 /* Pause */) {\n return 1 /* Pause */;\n }\n }\n }\n }\n /**\n * Returns debug information for the current queues.\n *\n * @method _getDebugInfo\n * @param {Boolean} debugEnabled\n * @returns {IDebugInfo | undefined}\n */\n _getDebugInfo(debugEnabled) {\n if (debugEnabled) {\n let debugInfo = {};\n let queue;\n let queueName;\n let numberOfQueues = this.queueNames.length;\n let i = 0;\n while (i < numberOfQueues) {\n queueName = this.queueNames[i];\n queue = this.queues[queueName];\n debugInfo[queueName] = queue._getDebugInfo(debugEnabled);\n i++;\n }\n return debugInfo;\n }\n return;\n }\n }\n\n function iteratorDrain(fn) {\n let iterator = fn();\n let result = iterator.next();\n while (result.done === false) {\n result.value();\n result = iterator.next();\n }\n }\n\n const noop = function () {};\n const DISABLE_SCHEDULE = Object.freeze([]);\n function parseArgs() {\n let length = arguments.length;\n let args;\n let method;\n let target;\n if (length === 0) {} else if (length === 1) {\n target = null;\n method = arguments[0];\n } else {\n let argsIndex = 2;\n let methodOrTarget = arguments[0];\n let methodOrArgs = arguments[1];\n let type = typeof methodOrArgs;\n if (type === 'function') {\n target = methodOrTarget;\n method = methodOrArgs;\n } else if (methodOrTarget !== null && type === 'string' && methodOrArgs in methodOrTarget) {\n target = methodOrTarget;\n method = target[methodOrArgs];\n } else if (typeof methodOrTarget === 'function') {\n argsIndex = 1;\n target = null;\n method = methodOrTarget;\n }\n if (length > argsIndex) {\n let len = length - argsIndex;\n args = new Array(len);\n for (let i = 0; i < len; i++) {\n args[i] = arguments[i + argsIndex];\n }\n }\n }\n return [target, method, args];\n }\n function parseTimerArgs() {\n let [target, method, args] = parseArgs(...arguments);\n let wait = 0;\n let length = args !== undefined ? args.length : 0;\n if (length > 0) {\n let last = args[length - 1];\n if (isCoercableNumber(last)) {\n wait = parseInt(args.pop(), 10);\n }\n }\n return [target, method, args, wait];\n }\n function parseDebounceArgs() {\n let target;\n let method;\n let isImmediate;\n let args;\n let wait;\n if (arguments.length === 2) {\n method = arguments[0];\n wait = arguments[1];\n target = null;\n } else {\n [target, method, args] = parseArgs(...arguments);\n if (args === undefined) {\n wait = 0;\n } else {\n wait = args.pop();\n if (!isCoercableNumber(wait)) {\n isImmediate = wait === true;\n wait = args.pop();\n }\n }\n }\n wait = parseInt(wait, 10);\n return [target, method, args, wait, isImmediate];\n }\n let UUID = 0;\n let beginCount = 0;\n let endCount = 0;\n let beginEventCount = 0;\n let endEventCount = 0;\n let runCount = 0;\n let joinCount = 0;\n let deferCount = 0;\n let scheduleCount = 0;\n let scheduleIterableCount = 0;\n let deferOnceCount = 0;\n let scheduleOnceCount = 0;\n let setTimeoutCount = 0;\n let laterCount = 0;\n let throttleCount = 0;\n let debounceCount = 0;\n let cancelTimersCount = 0;\n let cancelCount = 0;\n let autorunsCreatedCount = 0;\n let autorunsCompletedCount = 0;\n let deferredActionQueuesCreatedCount = 0;\n let nestedDeferredActionQueuesCreated = 0;\n class Backburner {\n constructor(queueNames, options) {\n this.DEBUG = false;\n this.currentInstance = null;\n this.instanceStack = [];\n this._eventCallbacks = {\n end: [],\n begin: []\n };\n this._timerTimeoutId = null;\n this._timers = [];\n this._autorun = null;\n this._autorunStack = null;\n this.queueNames = queueNames;\n this.options = options || {};\n if (typeof this.options.defaultQueue === 'string') {\n this._defaultQueue = this.options.defaultQueue;\n } else {\n this._defaultQueue = this.queueNames[0];\n }\n this._onBegin = this.options.onBegin || noop;\n this._onEnd = this.options.onEnd || noop;\n this._boundRunExpiredTimers = this._runExpiredTimers.bind(this);\n this._boundAutorunEnd = () => {\n autorunsCompletedCount++;\n // if the autorun was already flushed, do nothing\n if (this._autorun === null) {\n return;\n }\n this._autorun = null;\n this._autorunStack = null;\n this._end(true /* fromAutorun */);\n };\n let builder = this.options._buildPlatform || buildPlatform;\n this._platform = builder(this._boundAutorunEnd);\n }\n get counters() {\n return {\n begin: beginCount,\n end: endCount,\n events: {\n begin: beginEventCount,\n end: endEventCount\n },\n autoruns: {\n created: autorunsCreatedCount,\n completed: autorunsCompletedCount\n },\n run: runCount,\n join: joinCount,\n defer: deferCount,\n schedule: scheduleCount,\n scheduleIterable: scheduleIterableCount,\n deferOnce: deferOnceCount,\n scheduleOnce: scheduleOnceCount,\n setTimeout: setTimeoutCount,\n later: laterCount,\n throttle: throttleCount,\n debounce: debounceCount,\n cancelTimers: cancelTimersCount,\n cancel: cancelCount,\n loops: {\n total: deferredActionQueuesCreatedCount,\n nested: nestedDeferredActionQueuesCreated\n }\n };\n }\n get defaultQueue() {\n return this._defaultQueue;\n }\n /*\n @method begin\n @return instantiated class DeferredActionQueues\n */\n begin() {\n beginCount++;\n let options = this.options;\n let previousInstance = this.currentInstance;\n let current;\n if (this._autorun !== null) {\n current = previousInstance;\n this._cancelAutorun();\n } else {\n if (previousInstance !== null) {\n nestedDeferredActionQueuesCreated++;\n this.instanceStack.push(previousInstance);\n }\n deferredActionQueuesCreatedCount++;\n current = this.currentInstance = new DeferredActionQueues(this.queueNames, options);\n beginEventCount++;\n this._trigger('begin', current, previousInstance);\n }\n this._onBegin(current, previousInstance);\n return current;\n }\n end() {\n endCount++;\n this._end(false);\n }\n on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError(`Callback must be a function`);\n }\n let callbacks = this._eventCallbacks[eventName];\n if (callbacks !== undefined) {\n callbacks.push(callback);\n } else {\n throw new TypeError(`Cannot on() event ${eventName} because it does not exist`);\n }\n }\n off(eventName, callback) {\n let callbacks = this._eventCallbacks[eventName];\n if (!eventName || callbacks === undefined) {\n throw new TypeError(`Cannot off() event ${eventName} because it does not exist`);\n }\n let callbackFound = false;\n if (callback) {\n for (let i = 0; i < callbacks.length; i++) {\n if (callbacks[i] === callback) {\n callbackFound = true;\n callbacks.splice(i, 1);\n i--;\n }\n }\n }\n if (!callbackFound) {\n throw new TypeError(`Cannot off() callback that does not exist`);\n }\n }\n run() {\n runCount++;\n let [target, method, args] = parseArgs(...arguments);\n return this._run(target, method, args);\n }\n join() {\n joinCount++;\n let [target, method, args] = parseArgs(...arguments);\n return this._join(target, method, args);\n }\n /**\n * @deprecated please use schedule instead.\n */\n defer(queueName, target, method, ...args) {\n deferCount++;\n return this.schedule(queueName, target, method, ...args);\n }\n schedule(queueName, ..._args) {\n scheduleCount++;\n let [target, method, args] = parseArgs(..._args);\n let stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, target, method, args, false, stack);\n }\n /*\n Defer the passed iterable of functions to run inside the specified queue.\n @method scheduleIterable\n @param {String} queueName\n @param {Iterable} an iterable of functions to execute\n @return method result\n */\n scheduleIterable(queueName, iterable) {\n scheduleIterableCount++;\n let stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, null, iteratorDrain, [iterable], false, stack);\n }\n /**\n * @deprecated please use scheduleOnce instead.\n */\n deferOnce(queueName, target, method, ...args) {\n deferOnceCount++;\n return this.scheduleOnce(queueName, target, method, ...args);\n }\n scheduleOnce(queueName, ..._args) {\n scheduleOnceCount++;\n let [target, method, args] = parseArgs(..._args);\n let stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, target, method, args, true, stack);\n }\n setTimeout() {\n setTimeoutCount++;\n return this.later(...arguments);\n }\n later() {\n laterCount++;\n let [target, method, args, wait] = parseTimerArgs(...arguments);\n return this._later(target, method, args, wait);\n }\n throttle() {\n throttleCount++;\n let [target, method, args, wait, isImmediate = true] = parseDebounceArgs(...arguments);\n let index = findTimerItem(target, method, this._timers);\n let timerId;\n if (index === -1) {\n timerId = this._later(target, method, isImmediate ? DISABLE_SCHEDULE : args, wait);\n if (isImmediate) {\n this._join(target, method, args);\n }\n } else {\n timerId = this._timers[index + 1];\n let argIndex = index + 4;\n if (this._timers[argIndex] !== DISABLE_SCHEDULE) {\n this._timers[argIndex] = args;\n }\n }\n return timerId;\n }\n debounce() {\n debounceCount++;\n let [target, method, args, wait, isImmediate = false] = parseDebounceArgs(...arguments);\n let _timers = this._timers;\n let index = findTimerItem(target, method, _timers);\n let timerId;\n if (index === -1) {\n timerId = this._later(target, method, isImmediate ? DISABLE_SCHEDULE : args, wait);\n if (isImmediate) {\n this._join(target, method, args);\n }\n } else {\n let executeAt = this._platform.now() + wait;\n let argIndex = index + 4;\n if (_timers[argIndex] === DISABLE_SCHEDULE) {\n args = DISABLE_SCHEDULE;\n }\n timerId = _timers[index + 1];\n let i = binarySearch(executeAt, _timers);\n if (index + TIMERS_OFFSET === i) {\n _timers[index] = executeAt;\n _timers[argIndex] = args;\n } else {\n let stack = this._timers[index + 5];\n this._timers.splice(i, 0, executeAt, timerId, target, method, args, stack);\n this._timers.splice(index, TIMERS_OFFSET);\n }\n if (index === 0) {\n this._reinstallTimerTimeout();\n }\n }\n return timerId;\n }\n cancelTimers() {\n cancelTimersCount++;\n this._clearTimerTimeout();\n this._timers = [];\n this._cancelAutorun();\n }\n hasTimers() {\n return this._timers.length > 0 || this._autorun !== null;\n }\n cancel(timer) {\n cancelCount++;\n if (timer === null || timer === undefined) {\n return false;\n }\n let timerType = typeof timer;\n if (timerType === 'number') {\n // we're cancelling a setTimeout or throttle or debounce\n return this._cancelLaterTimer(timer);\n } else if (timerType === 'object' && timer.queue && timer.method) {\n // we're cancelling a deferOnce\n return timer.queue.cancel(timer);\n }\n return false;\n }\n ensureInstance() {\n this._ensureInstance();\n }\n /**\n * Returns debug information related to the current instance of Backburner\n *\n * @method getDebugInfo\n * @returns {Object | undefined} Will return and Object containing debug information if\n * the DEBUG flag is set to true on the current instance of Backburner, else undefined.\n */\n getDebugInfo() {\n if (this.DEBUG) {\n return {\n autorun: this._autorunStack,\n counters: this.counters,\n timers: getQueueItems(this._timers, TIMERS_OFFSET, 2),\n instanceStack: [this.currentInstance, ...this.instanceStack].map(deferredActionQueue => deferredActionQueue && deferredActionQueue._getDebugInfo(this.DEBUG))\n };\n }\n return undefined;\n }\n _end(fromAutorun) {\n let currentInstance = this.currentInstance;\n let nextInstance = null;\n if (currentInstance === null) {\n throw new Error(`end called without begin`);\n }\n // Prevent double-finally bug in Safari 6.0.2 and iOS 6\n // This bug appears to be resolved in Safari 6.0.5 and iOS 7\n let finallyAlreadyCalled = false;\n let result;\n try {\n result = currentInstance.flush(fromAutorun);\n } finally {\n if (!finallyAlreadyCalled) {\n finallyAlreadyCalled = true;\n if (result === 1 /* Pause */) {\n this._scheduleAutorun();\n } else {\n this.currentInstance = null;\n if (this.instanceStack.length > 0) {\n nextInstance = this.instanceStack.pop();\n this.currentInstance = nextInstance;\n }\n this._trigger('end', currentInstance, nextInstance);\n this._onEnd(currentInstance, nextInstance);\n }\n }\n }\n }\n _join(target, method, args) {\n if (this.currentInstance === null) {\n return this._run(target, method, args);\n }\n if (target === undefined && args === undefined) {\n return method();\n } else {\n return method.apply(target, args);\n }\n }\n _run(target, method, args) {\n let onError = getOnError(this.options);\n this.begin();\n if (onError) {\n try {\n return method.apply(target, args);\n } catch (error) {\n onError(error);\n } finally {\n this.end();\n }\n } else {\n try {\n return method.apply(target, args);\n } finally {\n this.end();\n }\n }\n }\n _cancelAutorun() {\n if (this._autorun !== null) {\n this._platform.clearNext(this._autorun);\n this._autorun = null;\n this._autorunStack = null;\n }\n }\n _later(target, method, args, wait) {\n let stack = this.DEBUG ? new Error() : undefined;\n let executeAt = this._platform.now() + wait;\n let id = UUID++;\n if (this._timers.length === 0) {\n this._timers.push(executeAt, id, target, method, args, stack);\n this._installTimerTimeout();\n } else {\n // find position to insert\n let i = binarySearch(executeAt, this._timers);\n this._timers.splice(i, 0, executeAt, id, target, method, args, stack);\n // always reinstall since it could be out of sync\n this._reinstallTimerTimeout();\n }\n return id;\n }\n _cancelLaterTimer(timer) {\n for (let i = 1; i < this._timers.length; i += TIMERS_OFFSET) {\n if (this._timers[i] === timer) {\n this._timers.splice(i - 1, TIMERS_OFFSET);\n if (i === 1) {\n this._reinstallTimerTimeout();\n }\n return true;\n }\n }\n return false;\n }\n /**\n Trigger an event. Supports up to two arguments. Designed around\n triggering transition events from one run loop instance to the\n next, which requires an argument for the instance and then\n an argument for the next instance.\n @private\n @method _trigger\n @param {String} eventName\n @param {any} arg1\n @param {any} arg2\n */\n _trigger(eventName, arg1, arg2) {\n let callbacks = this._eventCallbacks[eventName];\n if (callbacks !== undefined) {\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](arg1, arg2);\n }\n }\n }\n _runExpiredTimers() {\n this._timerTimeoutId = null;\n if (this._timers.length > 0) {\n this.begin();\n this._scheduleExpiredTimers();\n this.end();\n }\n }\n _scheduleExpiredTimers() {\n let timers = this._timers;\n let i = 0;\n let l = timers.length;\n let defaultQueue = this._defaultQueue;\n let n = this._platform.now();\n for (; i < l; i += TIMERS_OFFSET) {\n let executeAt = timers[i];\n if (executeAt > n) {\n break;\n }\n let args = timers[i + 4];\n if (args !== DISABLE_SCHEDULE) {\n let target = timers[i + 2];\n let method = timers[i + 3];\n let stack = timers[i + 5];\n this.currentInstance.schedule(defaultQueue, target, method, args, false, stack);\n }\n }\n timers.splice(0, i);\n this._installTimerTimeout();\n }\n _reinstallTimerTimeout() {\n this._clearTimerTimeout();\n this._installTimerTimeout();\n }\n _clearTimerTimeout() {\n if (this._timerTimeoutId === null) {\n return;\n }\n this._platform.clearTimeout(this._timerTimeoutId);\n this._timerTimeoutId = null;\n }\n _installTimerTimeout() {\n if (this._timers.length === 0) {\n return;\n }\n let minExpiresAt = this._timers[0];\n let n = this._platform.now();\n let wait = Math.max(0, minExpiresAt - n);\n this._timerTimeoutId = this._platform.setTimeout(this._boundRunExpiredTimers, wait);\n }\n _ensureInstance() {\n let currentInstance = this.currentInstance;\n if (currentInstance === null) {\n this._autorunStack = this.DEBUG ? new Error() : undefined;\n currentInstance = this.begin();\n this._scheduleAutorun();\n }\n return currentInstance;\n }\n _scheduleAutorun() {\n autorunsCreatedCount++;\n const next = this._platform.next;\n this._autorun = next();\n }\n }\n Backburner.Queue = Queue;\n\n exports.default = Backburner;\n exports.buildPlatform = buildPlatform;\n});","enifed(\"dag-map\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n /**\n * A topologically ordered map of key/value pairs with a simple API for adding constraints.\n *\n * Edges can forward reference keys that have not been added yet (the forward reference will\n * map the key to undefined).\n */\n var DAG = function () {\n function DAG() {\n this._vertices = new Vertices();\n }\n /**\n * Adds a key/value pair with dependencies on other key/value pairs.\n *\n * @public\n * @param key The key of the vertex to be added.\n * @param value The value of that vertex.\n * @param before A key or array of keys of the vertices that must\n * be visited before this vertex.\n * @param after An string or array of strings with the keys of the\n * vertices that must be after this vertex is visited.\n */\n DAG.prototype.add = function (key, value, before, after) {\n if (!key) throw new Error('argument `key` is required');\n var vertices = this._vertices;\n var v = vertices.add(key);\n v.val = value;\n if (before) {\n if (typeof before === \"string\") {\n vertices.addEdge(v, vertices.add(before));\n } else {\n for (var i = 0; i < before.length; i++) {\n vertices.addEdge(v, vertices.add(before[i]));\n }\n }\n }\n if (after) {\n if (typeof after === \"string\") {\n vertices.addEdge(vertices.add(after), v);\n } else {\n for (var i = 0; i < after.length; i++) {\n vertices.addEdge(vertices.add(after[i]), v);\n }\n }\n }\n };\n /**\n * @deprecated please use add.\n */\n DAG.prototype.addEdges = function (key, value, before, after) {\n this.add(key, value, before, after);\n };\n /**\n * Visits key/value pairs in topological order.\n *\n * @public\n * @param callback The function to be invoked with each key/value.\n */\n DAG.prototype.each = function (callback) {\n this._vertices.walk(callback);\n };\n /**\n * @deprecated please use each.\n */\n DAG.prototype.topsort = function (callback) {\n this.each(callback);\n };\n return DAG;\n }();\n exports.default = DAG;\n\n /** @private */\n var Vertices = function () {\n function Vertices() {\n this.length = 0;\n this.stack = new IntStack();\n this.path = new IntStack();\n this.result = new IntStack();\n }\n Vertices.prototype.add = function (key) {\n if (!key) throw new Error(\"missing key\");\n var l = this.length | 0;\n var vertex;\n for (var i = 0; i < l; i++) {\n vertex = this[i];\n if (vertex.key === key) return vertex;\n }\n this.length = l + 1;\n return this[l] = {\n idx: l,\n key: key,\n val: undefined,\n out: false,\n flag: false,\n length: 0\n };\n };\n Vertices.prototype.addEdge = function (v, w) {\n this.check(v, w.key);\n var l = w.length | 0;\n for (var i = 0; i < l; i++) {\n if (w[i] === v.idx) return;\n }\n w.length = l + 1;\n w[l] = v.idx;\n v.out = true;\n };\n Vertices.prototype.walk = function (cb) {\n this.reset();\n for (var i = 0; i < this.length; i++) {\n var vertex = this[i];\n if (vertex.out) continue;\n this.visit(vertex, \"\");\n }\n this.each(this.result, cb);\n };\n Vertices.prototype.check = function (v, w) {\n if (v.key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + w);\n }\n // quick check\n if (v.length === 0) return;\n // shallow check\n for (var i = 0; i < v.length; i++) {\n var key = this[v[i]].key;\n if (key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + v.key + \" <- \" + w);\n }\n }\n // deep check\n this.reset();\n this.visit(v, w);\n if (this.path.length > 0) {\n var msg_1 = \"cycle detected: \" + w;\n this.each(this.path, function (key) {\n msg_1 += \" <- \" + key;\n });\n throw new Error(msg_1);\n }\n };\n Vertices.prototype.reset = function () {\n this.stack.length = 0;\n this.path.length = 0;\n this.result.length = 0;\n for (var i = 0, l = this.length; i < l; i++) {\n this[i].flag = false;\n }\n };\n Vertices.prototype.visit = function (start, search) {\n var _a = this,\n stack = _a.stack,\n path = _a.path,\n result = _a.result;\n stack.push(start.idx);\n while (stack.length) {\n var index = stack.pop() | 0;\n if (index >= 0) {\n // enter\n var vertex = this[index];\n if (vertex.flag) continue;\n vertex.flag = true;\n path.push(index);\n if (search === vertex.key) break;\n // push exit\n stack.push(~index);\n this.pushIncoming(vertex);\n } else {\n // exit\n path.pop();\n result.push(~index);\n }\n }\n };\n Vertices.prototype.pushIncoming = function (incomming) {\n var stack = this.stack;\n for (var i = incomming.length - 1; i >= 0; i--) {\n var index = incomming[i];\n if (!this[index].flag) {\n stack.push(index);\n }\n }\n };\n Vertices.prototype.each = function (indices, cb) {\n for (var i = 0, l = indices.length; i < l; i++) {\n var vertex = this[indices[i]];\n cb(vertex.key, vertex.val);\n }\n };\n return Vertices;\n }();\n /** @private */\n var IntStack = function () {\n function IntStack() {\n this.length = 0;\n }\n IntStack.prototype.push = function (n) {\n this[this.length++] = n | 0;\n };\n IntStack.prototype.pop = function () {\n return this[--this.length] | 0;\n };\n return IntStack;\n }();\n});","enifed('ember-babel', ['exports', '@glimmer/env'], function (exports, _env) {\n 'use strict';\n\n exports.__esModule = true;\n exports.possibleConstructorReturn = undefined;\n exports.classCallCheck = classCallCheck;\n exports.inherits = inherits;\n exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;\n exports.createClass = createClass;\n\n\n const create = Object.create;\n const setPrototypeOf = Object.setPrototypeOf;\n const defineProperty = Object.defineProperty;\n\n function classCallCheck(instance, Constructor) {\n if (_env.DEBUG) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n }\n\n function inherits(subClass, superClass) {\n if (_env.DEBUG) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n }\n }\n subClass.prototype = create(superClass === null ? null : superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass !== null) setPrototypeOf(subClass, superClass);\n }\n\n function taggedTemplateLiteralLoose(strings, raw) {\n strings.raw = raw;\n return strings;\n }\n\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ('value' in descriptor) descriptor.writable = true;\n defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function createClass(Constructor, protoProps, staticProps) {\n if (protoProps !== undefined) defineProperties(Constructor.prototype, protoProps);\n if (staticProps !== undefined) defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n const possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {\n if (_env.DEBUG) {\n if (!self) {\n throw new ReferenceError(`this hasn't been initialized - super() hasn't been called`);\n }\n }\n return call !== null && typeof call === 'object' || typeof call === 'function' ? call : self;\n };\n});","enifed('ember-template-compiler/index', ['exports', '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', '@ember/-internals/environment', '@ember/canary-features', 'ember/version', 'ember-template-compiler/lib/compat', 'ember-template-compiler/lib/system/bootstrap', 'ember-template-compiler/lib/system/initializer'], function (exports, _precompile, _compile, _compileOptions, _index, _environment, _canaryFeatures, _version, _compat) {\n 'use strict';\n\n exports.__esModule = true;\n exports.defaultPlugins = exports.unregisterPlugin = exports.registerPlugin = exports.compileOptions = exports.compile = exports.precompile = exports._Ember = undefined;\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, 'registerPlugin', {\n enumerable: true,\n get: function () {\n return _compileOptions.registerPlugin;\n }\n });\n Object.defineProperty(exports, 'unregisterPlugin', {\n enumerable: true,\n get: function () {\n return _compileOptions.unregisterPlugin;\n }\n });\n Object.defineProperty(exports, 'defaultPlugins', {\n enumerable: true,\n get: function () {\n return _index.default;\n }\n });\n const _Ember = exports._Ember = typeof _environment.context.imports.Ember === 'object' && _environment.context.imports.Ember || {};\n // private API used by ember-cli-htmlbars to setup ENV and FEATURES\n if (!_Ember.ENV) {\n _Ember.ENV = _environment.ENV;\n }\n if (!_Ember.FEATURES) {\n _Ember.FEATURES = _canaryFeatures.FEATURES;\n }\n if (!_Ember.VERSION) {\n _Ember.VERSION = _version.default;\n }\n // used for adding Ember.Handlebars.compile for backwards compat\n\n (0, _compat.default)(_Ember);\n // used to bootstrap templates\n\n // add domTemplates initializer (only does something if `ember-template-compiler`\n // is loaded already)\n});","enifed('ember-template-compiler/lib/compat', ['exports', 'ember-template-compiler/lib/system/compile', 'ember-template-compiler/lib/system/compile-options', 'ember-template-compiler/lib/system/precompile'], function (exports, _compile, _compileOptions, _precompile) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = setupGlobal;\n function setupGlobal(Ember) {\n let EmberHandlebars = Ember.Handlebars;\n if (!EmberHandlebars) {\n Ember.Handlebars = EmberHandlebars = {};\n }\n let EmberHTMLBars = Ember.HTMLBars;\n if (!EmberHTMLBars) {\n Ember.HTMLBars = EmberHTMLBars = {};\n }\n EmberHTMLBars.precompile = EmberHandlebars.precompile = _precompile.default;\n EmberHTMLBars.compile = EmberHandlebars.compile = _compile.default;\n EmberHTMLBars.registerPlugin = _compileOptions.registerPlugin;\n }\n});","enifed('ember-template-compiler/lib/plugins/assert-if-helper-without-arguments', ['exports', '@ember/debug', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _debug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = assertIfHelperWithoutArguments;\n function assertIfHelperWithoutArguments(env) {\n let { moduleName } = env.meta;\n return {\n name: 'assert-if-helper-without-arguments',\n visitor: {\n BlockStatement(node) {\n if (isInvalidBlockIf(node)) {\n (0, _debug.assert)(`${blockAssertMessage(node.path.original)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`);\n }\n },\n MustacheStatement(node) {\n if (isInvalidInlineIf(node)) {\n (0, _debug.assert)(`${inlineAssertMessage(node.path.original)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`);\n }\n },\n SubExpression(node) {\n if (isInvalidInlineIf(node)) {\n (0, _debug.assert)(`${inlineAssertMessage(node.path.original)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`);\n }\n }\n }\n };\n }\n function blockAssertMessage(original) {\n return `#${original} requires a single argument.`;\n }\n function inlineAssertMessage(original) {\n return `The inline form of the '${original}' helper expects two or three arguments.`;\n }\n function isInvalidInlineIf(node) {\n return node.path.original === 'if' && (!node.params || node.params.length < 2 || node.params.length > 3);\n }\n function isInvalidBlockIf(node) {\n return node.path.original === 'if' && (!node.params || node.params.length !== 1);\n }\n});","enifed('ember-template-compiler/lib/plugins/assert-input-helper-without-block', ['exports', '@ember/debug', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _debug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = errorOnInputWithContent;\n function errorOnInputWithContent(env) {\n let { moduleName } = env.meta;\n return {\n name: 'assert-input-helper-without-block',\n visitor: {\n BlockStatement(node) {\n if (node.path.original !== 'input') {\n return;\n }\n (0, _debug.assert)(assertMessage(moduleName, node));\n }\n }\n };\n }\n function assertMessage(moduleName, node) {\n let sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n return `The {{input}} helper cannot be used in block form. ${sourceInformation}`;\n }\n});","enifed('ember-template-compiler/lib/plugins/assert-local-variable-shadowing-helper-invocation', ['exports', '@ember/debug', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _debug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = assertLocalVariableShadowingHelperInvocation;\n function assertLocalVariableShadowingHelperInvocation(env) {\n let { moduleName } = env.meta;\n let locals = [];\n return {\n name: 'assert-local-variable-shadowing-helper-invocation',\n visitor: {\n BlockStatement: {\n enter(node) {\n locals.push(node.program.blockParams);\n },\n exit() {\n locals.pop();\n }\n },\n ElementNode: {\n enter(node) {\n locals.push(node.blockParams);\n },\n exit() {\n locals.pop();\n }\n },\n SubExpression(node) {\n (0, _debug.assert)(`${messageFor(node)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`, !isLocalVariable(node.path, locals));\n },\n ElementModifierStatement(node) {\n // The ElementNode get visited first, but modifiers are more of a sibling\n // than a child in the lexical scope (we aren't evaluated in its \"block\")\n // so any locals introduced by the last element doesn't count\n (0, _debug.assert)(`${messageFor(node)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`, !isLocalVariable(node.path, locals.slice(0, -1)));\n }\n }\n };\n }\n function isLocalVariable(node, locals) {\n return !node.this && hasLocalVariable(node.parts[0], locals);\n }\n function hasLocalVariable(name, locals) {\n return locals.some(names => names.indexOf(name) !== -1);\n }\n function messageFor(node) {\n let type = isSubExpression(node) ? 'helper' : 'modifier';\n let name = node.path.parts[0];\n return `Cannot invoke the \\`${name}\\` ${type} because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict.`;\n }\n function isSubExpression(node) {\n return node.type === 'SubExpression';\n }\n});","enifed('ember-template-compiler/lib/plugins/assert-reserved-named-arguments', ['exports', '@ember/canary-features', '@ember/debug', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _canaryFeatures, _debug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = assertReservedNamedArguments;\n\n const RESERVED = ['@arguments', '@args', '@block', '@else'];\n let isReserved, assertMessage;\n function assertReservedNamedArguments(env) {\n let { moduleName } = env.meta;\n return {\n name: 'assert-reserved-named-arguments',\n visitor: {\n PathExpression({ original, loc }) {\n if (isReserved(original)) {\n (0, _debug.assert)(`${assertMessage(original)} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`);\n }\n }\n }\n };\n }\n if (_canaryFeatures.EMBER_GLIMMER_NAMED_ARGUMENTS) {\n isReserved = name => RESERVED.indexOf(name) !== -1 || !!name.match(/^@[^a-z]/);\n assertMessage = name => `'${name}' is reserved.`;\n } else {\n isReserved = name => name[0] === '@';\n assertMessage = name => `'${name}' is not a valid path.`;\n }\n});","enifed('ember-template-compiler/lib/plugins/assert-splattribute-expression', ['exports', '@ember/canary-features', '@ember/debug', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _canaryFeatures, _debug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = assertSplattributeExpressions;\n function assertSplattributeExpressions(env) {\n let { moduleName } = env.meta;\n return {\n name: 'assert-splattribute-expressions',\n visitor: {\n AttrNode({ name, loc }) {\n if (!_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION && name === '...attributes') {\n (0, _debug.assert)(`${errorMessage()} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`);\n }\n },\n PathExpression({ original, loc }) {\n if (original === '...attributes') {\n (0, _debug.assert)(`${errorMessage()} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`);\n }\n }\n }\n };\n }\n function errorMessage() {\n if (_canaryFeatures.EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION) {\n return `Using \"...attributes\" can only be used in the element position e.g.
    . It cannot be used as a path.`;\n }\n return `...attributes is an invalid path`;\n }\n});","enifed('ember-template-compiler/lib/plugins/deprecate-send-action', ['exports', '@ember/debug', '@ember/deprecated-features', 'ember-template-compiler/lib/system/calculate-location-display'], function (exports, _debug, _deprecatedFeatures, _calculateLocationDisplay) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = deprecateSendAction;\n\n const EVENTS = ['insert-newline', 'enter', 'escape-press', 'focus-in', 'focus-out', 'key-press', 'key-up', 'key-down'];\n function deprecateSendAction(env) {\n if (_deprecatedFeatures.SEND_ACTION) {\n let { moduleName } = env.meta;\n let deprecationMessage = (node, evName, action) => {\n let sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n return `Please refactor \\`{{input ${evName}=\"${action}\"}}\\` to \\`{{input ${evName}=(action \"${action}\")}}\\. ${sourceInformation}`;\n };\n return {\n name: 'deprecate-send-action',\n visitor: {\n MustacheStatement(node) {\n if (node.path.original !== 'input') {\n return;\n }\n node.hash.pairs.forEach(pair => {\n if (EVENTS.indexOf(pair.key) > -1 && pair.value.type === 'StringLiteral') {\n (0, _debug.deprecate)(deprecationMessage(node, pair.key, pair.value.original), false, {\n id: 'ember-component.send-action',\n until: '4.0.0',\n url: 'https://emberjs.com/deprecations/v3.x#toc_ember-component-send-action'\n });\n }\n });\n }\n }\n };\n }\n return;\n }\n});","enifed('ember-template-compiler/lib/plugins/index', ['exports', 'ember-template-compiler/lib/plugins/assert-if-helper-without-arguments', 'ember-template-compiler/lib/plugins/assert-input-helper-without-block', 'ember-template-compiler/lib/plugins/assert-local-variable-shadowing-helper-invocation', 'ember-template-compiler/lib/plugins/assert-reserved-named-arguments', 'ember-template-compiler/lib/plugins/assert-splattribute-expression', 'ember-template-compiler/lib/plugins/deprecate-send-action', 'ember-template-compiler/lib/plugins/transform-action-syntax', 'ember-template-compiler/lib/plugins/transform-angle-bracket-components', 'ember-template-compiler/lib/plugins/transform-attrs-into-args', 'ember-template-compiler/lib/plugins/transform-component-invocation', 'ember-template-compiler/lib/plugins/transform-each-in-into-each', 'ember-template-compiler/lib/plugins/transform-has-block-syntax', 'ember-template-compiler/lib/plugins/transform-in-element', 'ember-template-compiler/lib/plugins/transform-inline-link-to', 'ember-template-compiler/lib/plugins/transform-input-type-syntax', 'ember-template-compiler/lib/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings', 'ember-template-compiler/lib/plugins/transform-top-level-components', '@ember/deprecated-features'], function (exports, _assertIfHelperWithoutArguments, _assertInputHelperWithoutBlock, _assertLocalVariableShadowingHelperInvocation, _assertReservedNamedArguments, _assertSplattributeExpression, _deprecateSendAction, _transformActionSyntax, _transformAngleBracketComponents, _transformAttrsIntoArgs, _transformComponentInvocation, _transformEachInIntoEach, _transformHasBlockSyntax, _transformInElement, _transformInlineLinkTo, _transformInputTypeSyntax, _transformOldClassBindingSyntax, _transformQuotedBindingsIntoJustBindings, _transformTopLevelComponents, _deprecatedFeatures) {\n 'use strict';\n\n exports.__esModule = true;\n\n const transforms = [_transformComponentInvocation.default, _transformAngleBracketComponents.default, _transformTopLevelComponents.default, _transformInlineLinkTo.default, _transformOldClassBindingSyntax.default, _transformQuotedBindingsIntoJustBindings.default, _assertReservedNamedArguments.default, _transformActionSyntax.default, _transformInputTypeSyntax.default, _transformAttrsIntoArgs.default, _transformEachInIntoEach.default, _transformHasBlockSyntax.default, _assertLocalVariableShadowingHelperInvocation.default, _assertInputHelperWithoutBlock.default, _transformInElement.default, _assertIfHelperWithoutArguments.default, _assertSplattributeExpression.default];\n if (_deprecatedFeatures.SEND_ACTION) {\n transforms.push(_deprecateSendAction.default);\n }\n exports.default = Object.freeze(transforms);\n});","enifed('ember-template-compiler/lib/plugins/transform-action-syntax', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = transformActionSyntax;\n /**\n @module ember\n */\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n \n `, {\n moduleName: 'my-app/templates/components/special-button.hbs'\n }));\n }\n\n [`@test booting multiple applications can properly handle events`](assert) {\n let actions = [];\n this.addFactoriesToResolver(actions, this.resolver);\n this.addFactoriesToResolver(actions, this.secondResolver);\n\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\n assert.deepEqual(actions, ['#two', '#one']);\n });\n }\n });\n});","enifed('ember/tests/production_build_test', ['@glimmer/env', '@ember/debug', 'internal-test-helpers'], function (_env, _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 (!_env.DEBUG) {\n assert.expect(1);\n\n try {\n (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 (!_env.DEBUG) {\n let fired = false;\n (0, _debug.runInDebug)(() => fired = true);\n\n assert.equal(fired, false, 'runInDebug callback should not be ran');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('ember/tests/reexports_test', ['ember/index', '@ember/canary-features', 'internal-test-helpers', '@ember/-internals/views'], function (_index, _canaryFeatures, _internalTestHelpers, _views) {\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 let [path, moduleId, exportName] = reexport;\n\n // default path === exportName if none present\n if (!exportName) {\n exportName = path;\n }\n\n (0, _internalTestHelpers.confirmExport)(_index.default, assert, path, moduleId, exportName, `Ember.${path} exports correctly`);\n });\n }\n\n ['@test Ember.String.isHTMLSafe exports correctly'](assert) {\n (0, _internalTestHelpers.confirmExport)(_index.default, assert, 'String.isHTMLSafe', '@ember/-internals/glimmer', 'isHTMLSafe');\n }\n\n ['@test Ember.EXTEND_PROTOTYPES is present (but deprecated)'](assert) {\n expectDeprecation(() => {\n assert.strictEqual(_index.default.ENV.EXTEND_PROTOTYPES, _index.default.EXTEND_PROTOTYPES, 'Ember.EXTEND_PROTOTYPES exists');\n }, /EXTEND_PROTOTYPES is deprecated/);\n }\n\n '@test Ember.FEATURES is exported'(assert) {\n for (let 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 let allExports = [\n // @ember/-internals/environment\n ['ENV', '@ember/-internals/environment', { get: 'getENV' }], ['lookup', '@ember/-internals/environment', { get: 'getLookup', set: 'setLookup' }], ['getOwner', '@ember/application', 'getOwner'], ['setOwner', '@ember/application', 'setOwner'], ['assign', '@ember/polyfills'],\n\n // @ember/-internals/utils\n ['GUID_KEY', '@ember/-internals/utils'], ['uuid', '@ember/-internals/utils'], ['generateGuid', '@ember/-internals/utils'], ['guidFor', '@ember/-internals/utils'], ['inspect', '@ember/-internals/utils'], ['makeArray', '@ember/-internals/utils'], ['canInvoke', '@ember/-internals/utils'], ['tryInvoke', '@ember/-internals/utils'], ['wrap', '@ember/-internals/utils'], ['NAME_KEY', '@ember/-internals/utils'],\n\n // @ember/-internals/container\n ['Registry', '@ember/-internals/container', 'Registry'], ['Container', '@ember/-internals/container', 'Container'],\n\n // @ember/debug\n ['deprecateFunc', '@ember/debug'], ['deprecate', '@ember/debug'], ['assert', '@ember/debug'], ['warn', '@ember/debug'], ['debug', '@ember/debug'], ['runInDebug', '@ember/debug'], ['Debug.registerDeprecationHandler', '@ember/debug', 'registerDeprecationHandler'], ['Debug.registerWarnHandler', '@ember/debug', 'registerWarnHandler'], ['Error', '@ember/error', 'default'],\n\n // @ember/-internals/metal\n ['computed', '@ember/-internals/metal', '_globalsComputed'], ['computed.alias', '@ember/-internals/metal', 'alias'], ['ComputedProperty', '@ember/-internals/metal'], ['cacheFor', '@ember/-internals/metal', 'getCachedValueFor'], ['merge', '@ember/polyfills'], ['instrument', '@ember/instrumentation'], ['subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.instrument', '@ember/instrumentation', 'instrument'], ['Instrumentation.subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.unsubscribe', '@ember/instrumentation', 'unsubscribe'], ['Instrumentation.reset', '@ember/instrumentation', 'reset'], ['testing', '@ember/debug', { get: 'isTesting', set: 'setTesting' }], ['onerror', '@ember/-internals/error-handling', { get: 'getOnerror', set: 'setOnerror' }], ['FEATURES.isEnabled', '@ember/canary-features', 'isEnabled'], ['meta', '@ember/-internals/meta'], ['get', '@ember/-internals/metal'], ['set', '@ember/-internals/metal'], ['_getPath', '@ember/-internals/metal'], ['getWithDefault', '@ember/-internals/metal'], ['trySet', '@ember/-internals/metal'], ['_Cache', '@ember/-internals/utils', 'Cache'], ['on', '@ember/-internals/metal'], ['addListener', '@ember/-internals/metal'], ['removeListener', '@ember/-internals/metal'], ['sendEvent', '@ember/-internals/metal'], ['hasListeners', '@ember/-internals/metal'], ['isNone', '@ember/-internals/metal'], ['isEmpty', '@ember/-internals/metal'], ['isBlank', '@ember/-internals/metal'], ['isPresent', '@ember/-internals/metal'], ['_Backburner', 'backburner', 'default'], ['run', '@ember/runloop', '_globalsRun'], ['run.backburner', '@ember/runloop', 'backburner'], ['run.begin', '@ember/runloop', 'begin'], ['run.bind', '@ember/runloop', 'bind'], ['run.cancel', '@ember/runloop', 'cancel'], ['run.debounce', '@ember/runloop', 'debounce'], ['run.end', '@ember/runloop', 'end'], ['run.hasScheduledTimers', '@ember/runloop', 'hasScheduledTimers'], ['run.join', '@ember/runloop', 'join'], ['run.later', '@ember/runloop', 'later'], ['run.next', '@ember/runloop', 'next'], ['run.once', '@ember/runloop', 'once'], ['run.schedule', '@ember/runloop', 'schedule'], ['run.scheduleOnce', '@ember/runloop', 'scheduleOnce'], ['run.throttle', '@ember/runloop', 'throttle'], ['run.currentRunLoop', '@ember/runloop', { get: 'getCurrentRunLoop' }], ['run.cancelTimers', '@ember/runloop', 'cancelTimers'], ['propertyWillChange', '@ember/-internals/metal'], ['propertyDidChange', '@ember/-internals/metal'], ['notifyPropertyChange', '@ember/-internals/metal'], ['overrideChains', '@ember/-internals/metal'], ['beginPropertyChanges', '@ember/-internals/metal'], ['endPropertyChanges', '@ember/-internals/metal'], ['changeProperties', '@ember/-internals/metal'], ['platform.defineProperty', null, { value: true }], ['platform.hasPropertyAccessors', null, { value: true }], ['defineProperty', '@ember/-internals/metal'], ['watchKey', '@ember/-internals/metal'], ['unwatchKey', '@ember/-internals/metal'], ['removeChainWatcher', '@ember/-internals/metal'], ['_ChainNode', '@ember/-internals/metal', 'ChainNode'], ['finishChains', '@ember/-internals/metal'], ['watchPath', '@ember/-internals/metal'], ['unwatchPath', '@ember/-internals/metal'], ['watch', '@ember/-internals/metal'], ['isWatching', '@ember/-internals/metal'], ['unwatch', '@ember/-internals/metal'], ['destroy', '@ember/-internals/meta', 'deleteMeta'], ['libraries', '@ember/-internals/metal'], ['OrderedSet', '@ember/map/lib/ordered-set', 'default'], ['Map', '@ember/map', 'default'], ['MapWithDefault', '@ember/map/with-default', 'default'], ['getProperties', '@ember/-internals/metal'], ['setProperties', '@ember/-internals/metal'], ['expandProperties', '@ember/-internals/metal'], ['addObserver', '@ember/-internals/metal'], ['removeObserver', '@ember/-internals/metal'], ['aliasMethod', '@ember/-internals/metal'], ['observer', '@ember/-internals/metal'], ['mixin', '@ember/-internals/metal'], ['Mixin', '@ember/-internals/metal'],\n\n // @ember/-internals/console\n ['Logger', '@ember/-internals/console', 'default'],\n\n // @ember/-internals/views\n !_views.jQueryDisabled && ['$', '@ember/-internals/views', 'jQuery'], ['ViewUtils.isSimpleClick', '@ember/-internals/views', 'isSimpleClick'], ['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'], ['TextSupport', '@ember/-internals/views'], ['ComponentLookup', '@ember/-internals/views'], ['EventDispatcher', '@ember/-internals/views'],\n\n // @ember/-internals/glimmer\n ['Component', '@ember/-internals/glimmer', 'Component'], ['Helper', '@ember/-internals/glimmer', 'Helper'], ['Helper.helper', '@ember/-internals/glimmer', 'helper'], ['Checkbox', '@ember/-internals/glimmer', 'Checkbox'], ['LinkComponent', '@ember/-internals/glimmer', 'LinkComponent'], ['TextArea', '@ember/-internals/glimmer', 'TextArea'], ['TextField', '@ember/-internals/glimmer', 'TextField'], ['TEMPLATES', '@ember/-internals/glimmer', { get: 'getTemplates', set: 'setTemplates' }], ['Handlebars.template', '@ember/-internals/glimmer', 'template'], ['HTMLBars.template', '@ember/-internals/glimmer', 'template'], ['Handlebars.Utils.escapeExpression', '@ember/-internals/glimmer', 'escapeExpression'], ['String.htmlSafe', '@ember/-internals/glimmer', 'htmlSafe'], ['_setComponentManager', '@ember/-internals/glimmer', 'setComponentManager'], ['_componentManagerCapabilities', '@ember/-internals/glimmer', 'capabilities'],\n\n // @ember/-internals/runtime\n ['A', '@ember/-internals/runtime'], ['_RegistryProxyMixin', '@ember/-internals/runtime', 'RegistryProxyMixin'], ['_ContainerProxyMixin', '@ember/-internals/runtime', 'ContainerProxyMixin'], ['Object', '@ember/-internals/runtime'], ['String.loc', '@ember/string', 'loc'], ['String.w', '@ember/string', 'w'], ['String.dasherize', '@ember/string', 'dasherize'], ['String.decamelize', '@ember/string', 'decamelize'], ['String.camelize', '@ember/string', 'camelize'], ['String.classify', '@ember/string', 'classify'], ['String.underscore', '@ember/string', 'underscore'], ['String.capitalize', '@ember/string', 'capitalize'], ['compare', '@ember/-internals/runtime'], ['copy', '@ember/-internals/runtime'], ['isEqual', '@ember/-internals/runtime'], ['inject.controller', '@ember/controller', 'inject'], ['inject.service', '@ember/service', 'inject'], ['Array', '@ember/-internals/runtime'], ['Comparable', '@ember/-internals/runtime'], ['Namespace', '@ember/-internals/runtime'], ['Enumerable', '@ember/-internals/runtime'], ['ArrayProxy', '@ember/-internals/runtime'], ['ObjectProxy', '@ember/-internals/runtime'], ['ActionHandler', '@ember/-internals/runtime'], ['CoreObject', '@ember/-internals/runtime'], ['NativeArray', '@ember/-internals/runtime'], ['Copyable', '@ember/-internals/runtime'], ['MutableEnumerable', '@ember/-internals/runtime'], ['MutableArray', '@ember/-internals/runtime'], ['TargetActionSupport', '@ember/-internals/runtime'], ['Evented', '@ember/-internals/runtime'], ['PromiseProxyMixin', '@ember/-internals/runtime'], ['Observable', '@ember/-internals/runtime'], ['typeOf', '@ember/-internals/runtime'], ['isArray', '@ember/-internals/runtime'], ['Object', '@ember/-internals/runtime'], ['onLoad', '@ember/application'], ['runLoadHooks', '@ember/application'], ['Controller', '@ember/controller', 'default'], ['ControllerMixin', '@ember/controller/lib/controller_mixin', 'default'], ['Service', '@ember/service', 'default'], ['_ProxyMixin', '@ember/-internals/runtime'], ['RSVP', '@ember/-internals/runtime'], ['STRINGS', '@ember/string', { get: '_getStrings', set: '_setStrings' }], ['BOOTED', '@ember/-internals/metal', { get: 'isNamespaceSearchDisabled', set: 'setNamespaceSearchDisabled' }], ['computed.empty', '@ember/object/computed', 'empty'], ['computed.notEmpty', '@ember/object/computed', 'notEmpty'], ['computed.none', '@ember/object/computed', 'none'], ['computed.not', '@ember/object/computed', 'not'], ['computed.bool', '@ember/object/computed', 'bool'], ['computed.match', '@ember/object/computed', 'match'], ['computed.equal', '@ember/object/computed', 'equal'], ['computed.gt', '@ember/object/computed', 'gt'], ['computed.gte', '@ember/object/computed', 'gte'], ['computed.lt', '@ember/object/computed', 'lt'], ['computed.lte', '@ember/object/computed', 'lte'], ['computed.oneWay', '@ember/object/computed', 'oneWay'], ['computed.reads', '@ember/object/computed', 'oneWay'], ['computed.readOnly', '@ember/object/computed', 'readOnly'], ['computed.deprecatingAlias', '@ember/object/computed', 'deprecatingAlias'], ['computed.and', '@ember/object/computed', 'and'], ['computed.or', '@ember/object/computed', 'or'], ['computed.sum', '@ember/object/computed', 'sum'], ['computed.min', '@ember/object/computed', 'min'], ['computed.max', '@ember/object/computed', 'max'], ['computed.map', '@ember/object/computed', 'map'], ['computed.sort', '@ember/object/computed', 'sort'], ['computed.setDiff', '@ember/object/computed', 'setDiff'], ['computed.mapBy', '@ember/object/computed', 'mapBy'], ['computed.filter', '@ember/object/computed', 'filter'], ['computed.filterBy', '@ember/object/computed', 'filterBy'], ['computed.uniq', '@ember/object/computed', 'uniq'], ['computed.uniqBy', '@ember/object/computed', 'uniqBy'], ['computed.union', '@ember/object/computed', 'union'], ['computed.intersect', '@ember/object/computed', 'intersect'], ['computed.collect', '@ember/object/computed', 'collect'],\n\n // @ember/-internals/routing\n ['Location', '@ember/-internals/routing'], ['AutoLocation', '@ember/-internals/routing'], ['HashLocation', '@ember/-internals/routing'], ['HistoryLocation', '@ember/-internals/routing'], ['NoneLocation', '@ember/-internals/routing'], ['controllerFor', '@ember/-internals/routing'], ['generateControllerFactory', '@ember/-internals/routing'], ['generateController', '@ember/-internals/routing'], ['RouterDSL', '@ember/-internals/routing'], ['Router', '@ember/-internals/routing'], ['Route', '@ember/-internals/routing'],\n\n // ember-application\n ['Application', '@ember/application', 'default'], ['ApplicationInstance', '@ember/application/instance', 'default'], ['Engine', '@ember/engine', 'default'], ['EngineInstance', '@ember/engine/instance', 'default'], ['Resolver', '@ember/application/globals-resolver', 'default'], ['DefaultResolver', '@ember/application/globals-resolver', 'default'],\n\n // @ember/-internals/extension-support\n ['DataAdapter', '@ember/-internals/extension-support'], ['ContainerDebugAdapter', '@ember/-internals/extension-support']].filter(Boolean);\n});","enifed('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/-internals/glimmer', '@ember/engine', 'router_js', '@ember/canary-features'], function (_owner, _rsvp, _emberTemplateCompiler, _routing, _controller, _runtime, _internalTestHelpers, _runloop, _metal, _glimmer, _engine, _router_js, _canaryFeatures) {\n 'use strict';\n\n /* eslint-disable no-console */\n let originalConsoleError;\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', '

    Is a silly place

    ');\n this.addTemplate('homepage', '

    Megatroll

    {{model.home}}

    ');\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n originalConsoleError = console.error;\n }\n\n teardown() {\n super.teardown();\n console.error = originalConsoleError;\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n handleURLAborts(assert, path) {\n (0, _runloop.run)(() => {\n let 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 get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n get currentURL() {\n return this.appRouter.get('currentURL');\n }\n\n 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 ['@test warn on URLs not included in the route set']() {\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/what-is-this-i-dont-even');\n }, /'\\/what-is-this-i-dont-even' did not match any routes/);\n });\n }\n\n ['@test The Homepage'](assert) {\n return this.visit('/').then(() => {\n assert.equal(this.currentPath, 'home', 'currently on the home route');\n\n let 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', { path: '/camelot' });\n });\n\n return this.visit('/camelot').then(() => {\n assert.equal(this.currentPath, 'camelot');\n\n let text = this.$('#camelot').text();\n assert.equal(text, 'Is a silly place', 'the camelot template was rendered');\n\n return this.visit('/');\n }).then(() => {\n assert.equal(this.currentPath, 'home');\n\n let text = this.$('.hours').text();\n assert.equal(text, 'Hours', 'the home template was rendered');\n });\n }\n\n [`@test The Homepage with explicit template name in renderTemplate`](assert) {\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('#troll').text();\n assert.equal(text, 'Megatroll', 'the homepage template was rendered');\n });\n }\n\n [`@test an alternate template will pull in an alternate controller`](assert) {\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n this.add('controller:homepage', _controller.default.extend({\n model: {\n home: 'Comes from homepage'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');\n });\n }\n\n [`@test An alternate template will pull in an alternate controller instead of controllerName`](assert) {\n this.add('route:home', _routing.Route.extend({\n controllerName: 'foo',\n renderTemplate() {\n this.render('homepage');\n }\n }));\n this.add('controller:foo', _controller.default.extend({\n model: {\n home: 'Comes from foo'\n }\n }));\n this.add('controller:homepage', _controller.default.extend({\n model: {\n home: 'Comes from homepage'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');\n });\n }\n\n [`@test The template will pull in an alternate controller via key/value`](assert) {\n this.router.map(function () {\n this.route('homepage', { path: '/' });\n });\n\n this.add('route:homepage', _routing.Route.extend({\n renderTemplate() {\n this.render({ controller: 'home' });\n }\n }));\n this.add('controller:home', _controller.default.extend({\n model: {\n home: 'Comes from home.'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from home.', 'the homepage template was rendered from data from the HomeController');\n });\n }\n\n [`@test The Homepage with explicit template name in renderTemplate and controller`](assert) {\n this.add('controller:home', _controller.default.extend({\n model: {\n home: 'YES I AM HOME'\n }\n }));\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'YES I AM HOME', 'The homepage template was rendered');\n });\n }\n\n [`@test Model passed via renderTemplate model is set as controller's model`](assert) {\n this.addTemplate('bio', '

    {{model.name}}

    ');\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('bio', {\n model: { name: 'emberjs' }\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'emberjs', `Passed model was set as controller's model`);\n });\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\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');\n });\n }\n\n ['@test defining templateName allows other templates to be rendered'](assert) {\n this.addTemplate('alert', `
    Invader!
    `);\n this.addTemplate('the_real_home_template', `

    THIS IS THE REAL HOME

    {{outlet 'alert'}}`);\n this.add('route:home', _routing.Route.extend({\n templateName: 'the_real_home_template',\n actions: {\n showAlert() {\n this.render('alert', {\n into: 'home',\n outlet: 'alert'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');\n\n return this.runTask(() => this.appRouter.send('showAlert'));\n }).then(() => {\n let text = this.$('.alert-box').text();\n\n assert.equal(text, 'Invader!', 'Template for alert was rendered into the outlet');\n });\n }\n\n ['@test templateName is still used when calling render with no name and options'](assert) {\n this.addTemplate('alert', `
    Invader!
    `);\n this.addTemplate('home', `

    THIS IS THE REAL HOME

    {{outlet 'alert'}}`);\n\n this.add('route:home', _routing.Route.extend({\n templateName: 'alert',\n renderTemplate() {\n this.render({});\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('.alert-box').text();\n\n assert.equal(text, 'Invader!', 'default templateName was rendered into outlet');\n });\n }\n\n ['@test The Homepage with a `setupController` hook'](assert) {\n this.addTemplate('home', `
      {{#each hours as |entry|}}\n
    • {{entry}}
    • \n {{/each}}\n
    \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 return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\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() {\n // no-op\n // importantly, we are not calling this._super\n }\n }));\n\n this.add('controller:home', _controller.default.extend());\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let homeController = this.applicationInstance.lookup('controller:home');\n\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', '

    {{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\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\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`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController',\n renderTemplate() {\n this.render('alternative_home');\n }\n }));\n\n this.add('controller:myController', _controller.default.extend({\n myValue: 'foo'\n }));\n\n this.addTemplate('alternative_home', '

    alternative home: {{myValue}}

    ');\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n\n assert.equal(text, 'alternative home: 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', { path: '/' });\n });\n\n this.addTemplate('home', '

    home: {{myValue}}

    ');\n\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController'\n }));\n\n this.add('controller:home', _controller.default.extend({\n myValue: 'home'\n }));\n\n this.add('controller:myController', _controller.default.extend({\n myValue: 'myController'\n }));\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n\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', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n setupController() /* controller */{\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 hours as |entry|}}
    • {{entry}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\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', { 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\n this.addTemplate('home', '
      {{#each model as |passage|}}
    • {{passage}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\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', { 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\n this.controllerFor('home').set('hours', model);\n }\n }));\n\n this.addTemplate('home', '
      {{#each hours as |entry|}}
    • {{entry}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\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 controller context by deserializing the params hash`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { 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\n return this.visit('/specials/1').then(() => {\n let text = this.$('p').text();\n\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 let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({ id });\n }\n });\n this.add('model:menu_item', MenuItem);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n this.addTemplate('special', '{{model.id}}');\n\n return this.visit('/specials/1').then(() => {\n this.assertText('1', 'The model was used to render the template');\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', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, resolve;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ 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\n this.addTemplate('special', '

    {{model.id}}

    ');\n this.addTemplate('loading', '

    LOADING!

    ');\n\n let visited = this.visit('/specials/1');\n this.assertText('LOADING!', 'The app is in the loading state');\n\n resolve(menuItem);\n\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', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return { id: id };\n }\n });\n\n this.add('model:menu_item', MenuItem);\n\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\n return this.visit('/specials/1').then(() => {\n let text = this.$('p').text();\n\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', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, promise, resolve;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n promise = new _rsvp.default.Promise(res => resolve = res);\n\n return promise;\n }\n });\n\n this.add('model:menu_item', MenuItem);\n\n this.add('route:special', _routing.Route.extend({\n setup() {\n throw new Error('Setup error');\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 this.handleURLRejectsWith(this, assert, 'specials/1', 'Setup error');\n\n (0, _runloop.run)(() => resolve(menuItem));\n }\n\n [\"@test ApplicationRoute's default error handler can be overridden\"](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, resolve;\n\n let MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n return new _rsvp.default.Promise(res => resolve = res);\n }\n });\n this.add('model:menu_item', MenuItem);\n\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 this.handleURLRejectsWith(this, assert, '/specials/1', 'Setup error');\n\n (0, _runloop.run)(() => resolve(menuItem));\n }\n\n ['@test Moving from one page to another triggers the correct callbacks'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({ id: id });\n }\n });\n this.add('model:menu_item', MenuItem);\n\n this.addTemplate('home', '

    Home

    ');\n this.addTemplate('special', '

    {{model.id}}

    ');\n\n return this.visit('/').then(() => {\n this.assertText('Home', 'The app is now in the initial state');\n\n let promiseContext = MenuItem.create({ 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 let rootSetup = 0;\n let rootRender = 0;\n let rootModel = 0;\n let rootSerialize = 0;\n let menuItem;\n let rootElement;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n return menuItem;\n }\n });\n\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('special', {\n path: '/specials/:menu_item_id',\n resetNamespace: true\n });\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 renderTemplate() {\n rootRender++;\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({ menu_item_id }) {\n return MenuItem.find(menu_item_id);\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\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n\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(rootRender, 1, 'The root render was triggered');\n assert.equal(rootSerialize, 0, 'The root serialize was not called');\n assert.equal(rootModel, 1, 'The root model was called');\n\n let router = this.applicationInstance.lookup('router:main');\n let menuItem = MenuItem.create({ 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(rootRender, 1, 'The root render was not triggered again');\n assert.equal(rootSerialize, 0, 'The root serialize was not called');\n\n // TODO: Should this be changed?\n assert.equal(rootModel, 1, 'The root model was called again');\n\n assert.deepEqual(router.location.path, '/specials/1');\n assert.equal(router.currentPath, 'root.special');\n });\n });\n }\n\n ['@test Events are triggered on the controller if a matching action name is implemented'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let stateIsNotCalled = true;\n\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', '{{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, { name: 'Tom Dale' }, 'an event with context is passed');\n done();\n }\n }\n }));\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events are triggered on the current state when defined in `actions` object'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let 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), { name: 'Tom Dale' }, 'the context is correct');\n done();\n }\n }\n });\n\n this.add('route:home', HomeRoute);\n this.addTemplate('home', '{{model.name}}');\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events defined in `actions` object are triggered on the current state when routes are nested'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n let model = { name: 'Tom Dale' };\n\n let 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), { name: 'Tom Dale' }, 'the context is correct');\n done();\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\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events can be handled by inherited event handlers'](assert) {\n assert.expect(4);\n\n let SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar hander in super route');\n }\n }\n });\n\n let RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar handler in mixin');\n this._super(msg);\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 this.addTemplate('home', `\n Do foo\n Do bar with arg\n Do bar\n `);\n\n return this.visit('/').then(() => {\n let 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 Actions are not triggered on the controller if a matching action name is implemented as a method'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let stateIsNotCalled = true;\n\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, { name: 'Tom Dale' }, 'an event with context is passed');\n done();\n }\n }\n }));\n\n this.addTemplate('home', '{{name}}');\n\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 this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test actions can be triggered with multiple arguments'](assert) {\n let done = assert.async();\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n let model1 = { name: 'Tilde' };\n let model2 = { name: 'Tom Dale' };\n\n let 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), { name: 'Tilde' }, 'the first context is correct');\n assert.deepEqual(Object.assign({}, obj2), { name: 'Tom Dale' }, 'the second context is correct');\n done();\n }\n }\n });\n\n this.add('route:root', RootRoute);\n\n this.add('controller:root.index', _controller.default.extend({\n model1: model1,\n model2: model2\n }));\n\n this.addTemplate('root.index', '{{model1.name}}');\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\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', { path: '/' });\n this.route('foo');\n this.route('bar');\n });\n\n return this.visit('/').then(() => {\n let urlSetCount = 0;\n let 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\n (0, _runloop.run)(function () {\n router.transitionTo('foo');\n router.transitionTo('bar');\n });\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\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('foo', { path: '/foo' });\n this.route('bar', { path: '/bar' });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\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 let setCount = 0;\n let 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', { path: '/' });\n this.route('foo');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(setCount, 1);\n assert.equal(replaceCount, 0);\n\n (0, _runloop.run)(() => router.replaceWith('foo'));\n\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 let setCount = 0;\n\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', { path: '/' });\n this.route('foo');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\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 Route inherits model from parent route'](assert) {\n assert.expect(9);\n\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments');\n\n this.route('shares', { path: '/shares/:share_id', resetNamespace: true }, function () {\n this.route('share');\n });\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n let share1 = {};\n let share2 = {};\n let share3 = {};\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n let shares = {\n 1: share1,\n 2: share2,\n 3: share3\n };\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 /*, transition */) {\n let parent_model = this.modelFor('the-post');\n\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 /*, transition */) {\n let parent_model = this.modelFor('shares');\n\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\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments', { resetNamespace: true }, function () {});\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\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 /*, transition */) {\n let parent_model = this.modelFor('the-post');\n\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\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments', { resetNamespace: true });\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n let currentPost;\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\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 A redirection hook is provided'](assert) {\n this.router.map(function () {\n this.route('choose', { path: '/' });\n this.route('home');\n });\n\n let chooseFollowed = 0;\n let destination = 'home';\n\n this.add('route:choose', _routing.Route.extend({\n redirect() {\n if (destination) {\n this.transitionTo(destination);\n }\n },\n\n setupController() {\n chooseFollowed++;\n }\n }));\n\n return this.visit('/').then(() => {\n let 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.applicationInstance.lookup('controller:application').get('currentPath'), 'home');\n });\n }\n\n ['@test Redirecting from the middle of a route aborts the remainder of the routes'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n this.transitionTo('home');\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 let router = this.applicationInstance.lookup('router:main');\n this.handleURLAborts(assert, '/foo/bar/baz');\n assert.equal(this.applicationInstance.lookup('controller:application').get('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(5);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n let successCount = 0;\n\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n return this.transitionTo('bar.baz').then(function () {\n successCount++;\n });\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.applicationInstance.lookup('controller:application').get('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(4);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { path: 'bar/:id', resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n let model = { id: 2 };\n\n let count = 0;\n\n this.add('route:bar', _routing.Route.extend({\n afterModel() {\n if (count++ > 10) {\n assert.ok(false, 'infinite loop');\n } else {\n this.transitionTo('bar.baz', model);\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.applicationInstance.lookup('controller:application').get('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', { resetNamespace: true }, function () {\n this.route('baz');\n });\n this.route('qux');\n });\n });\n\n this.add('route:foo', _routing.Route.extend({\n actions: {\n goToQux() {\n this.transitionTo('foo.qux');\n }\n }\n }));\n\n return this.visit('/foo/bar/baz').then(() => {\n assert.ok(true, '/foo/bar/baz has been handled');\n let applicationController = this.applicationInstance.lookup('controller:application');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(applicationController.get('currentPath'), 'foo.bar.baz');\n (0, _runloop.run)(() => router.send('goToQux'));\n assert.equal(applicationController.get('currentPath'), 'foo.qux');\n assert.equal(router.get('location').getURL(), '/foo/qux');\n });\n }\n\n ['@test Generated names can be customized when providing routes with dot notation'](assert) {\n assert.expect(4);\n\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', '

    {{name}}Bottom!

    ');\n\n this.router.map(function () {\n this.route('foo', { path: '/top' }, function () {\n this.route('bar', { path: '/middle', resetNamespace: true }, function () {\n this.route('baz', { path: '/bottom' });\n });\n });\n });\n\n this.add('route:foo', _routing.Route.extend({\n renderTemplate() {\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 renderTemplate() {\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\n this.add('controller:bar.baz', _controller.default.extend({\n name: 'BarBaz'\n }));\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let 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\n this.router.map(function () {\n this.route('top', function () {\n this.route('middle', { resetNamespace: true }, function () {\n this.route('bottom');\n });\n });\n });\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let 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 Child routes render into specified template'](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\n this.router.map(function () {\n this.route('top', function () {\n this.route('middle', { resetNamespace: true }, function () {\n this.route('bottom');\n });\n });\n });\n\n this.add('route:middle.bottom', _routing.Route.extend({\n renderTemplate() {\n this.render('middle/bottom', { into: 'top' });\n }\n }));\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('.main .middle .bottom p').length, 0, 'should not render into the middle template');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle > p')), 'Bottom!', 'The template was rendered into the top template');\n });\n }\n\n ['@test Rendering into specified template with slash notation'](assert) {\n this.addTemplate('person.profile', 'profile {{outlet}}');\n this.addTemplate('person.details', 'details!');\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('person/profile');\n this.render('person/details', { into: 'person/profile' });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'profile details!', 'The templates were rendered');\n });\n }\n\n ['@test Parent route context change'](assert) {\n let editCount = 0;\n let editedPostIds = (0, _runtime.A)();\n\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\n this.router.map(function () {\n this.route('posts', function () {\n this.route('post', { path: '/:postId', resetNamespace: true }, function () {\n this.route('edit');\n });\n });\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showPost(context) {\n this.transitionTo('post', context);\n }\n }\n }));\n\n this.add('route:post', _routing.Route.extend({\n model(params) {\n return { id: params.postId };\n },\n\n serialize(model) {\n return { postId: model.id };\n },\n\n actions: {\n editPost() {\n this.transitionTo('post.edit');\n }\n }\n }));\n\n this.add('route:post.edit', _routing.Route.extend({\n model() {\n let postId = this.modelFor('post').id;\n editedPostIds.push(postId);\n return null;\n },\n setup() {\n this._super(...arguments);\n editCount++;\n }\n }));\n\n return this.visit('/posts/1').then(() => {\n assert.ok(true, '/posts/1 has been handled');\n let router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(() => router.send('editPost'));\n (0, _runloop.run)(() => router.send('showPost', { id: '2' }));\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 Router accounts for rootURL on page load when using history location'](assert) {\n let rootURL = window.location.pathname + '/app';\n let postsTemplateRendered = false;\n let setHistory;\n\n setHistory = function (obj, path) {\n obj.set('history', { state: { path: path } });\n };\n\n let location = _routing.HistoryLocation.create({\n initState() {\n let path = rootURL + '/posts';\n\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 this.router.reopen({\n // location: 'historyTest',\n location,\n rootURL: rootURL\n });\n\n this.router.map(function () {\n this.route('posts', { path: '/posts' });\n });\n\n this.add('route:posts', _routing.Route.extend({\n model() {},\n renderTemplate() {\n postsTemplateRendered = true;\n }\n }));\n\n return this.visit('/').then(() => {\n assert.ok(postsTemplateRendered, 'Posts route successfully stripped from rootURL');\n\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 let 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 initState() {\n assert.equal(this.get('rootURL'), rootURL);\n }\n }));\n\n this.router.reopen({\n location: 'history-test',\n rootURL: rootURL,\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 Only use route rendered into main outlet for default into property on child'](assert) {\n this.addTemplate('application', \"{{outlet 'menu'}}{{outlet}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('posts.index', '

    postsIndex

    ');\n this.addTemplate('posts.menu', '
    postsMenu
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('posts/menu', {\n into: 'application',\n outlet: 'menu'\n });\n }\n }));\n\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-menu')), 'postsMenu', 'The posts/menu template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n });\n }\n\n ['@test Generating a URL should not affect currentModel'](assert) {\n this.router.map(function () {\n this.route('post', { path: '/posts/:post_id' });\n });\n\n let posts = {\n 1: { id: 1 },\n 2: { 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\n let route = this.applicationInstance.lookup('route:post');\n assert.equal(route.modelFor('post'), posts[1]);\n\n let 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', { path: ':category' });\n });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n return router.transitionTo('posts', { category: 'emberjs' });\n }).then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.deepEqual(router.location.path, '/posts/emberjs');\n });\n }\n\n ['@test Application template does not duplicate when re-rendered'](assert) {\n this.addTemplate('application', '

    I render once

    {{outlet}}');\n\n this.router.map(function () {\n this.route('posts');\n });\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 let 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\n this.router.map(function () {\n this.route('posts');\n this.route('photos');\n });\n\n this.add('route:application', _routing.Route.extend({\n afterModel() {\n this.transitionTo('posts');\n }\n }));\n\n return this.visit('/posts').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'App posts');\n });\n }\n\n [\"@test The template is not re-rendered when the route's context changes\"](assert) {\n this.router.map(function () {\n this.route('page', { path: '/page/:name' });\n });\n\n this.add('route:page', _routing.Route.extend({\n model(params) {\n return _runtime.Object.create({ name: params.name });\n }\n }));\n\n let 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\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/page/first').then(() => {\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 return this.visit('/page/second');\n }).then(() => {\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 let router = this.applicationInstance.lookup('router:main');\n return (0, _runloop.run)(() => router.transitionTo('page', _runtime.Object.create({ name: 'third' })));\n }).then(() => {\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\n ['@test The template is not re-rendered when two routes present the exact same template & controller'](assert) {\n this.router.map(function () {\n this.route('first');\n this.route('second');\n this.route('third');\n this.route('fourth');\n });\n\n // Note add a component to test insertion\n\n let insertionCount = 0;\n this.add('component:x-input', _glimmer.Component.extend({\n didInsertElement() {\n insertionCount += 1;\n }\n }));\n\n let SharedRoute = _routing.Route.extend({\n setupController() {\n this.controllerFor('shared').set('message', 'This is the ' + this.routeName + ' message');\n },\n\n renderTemplate() {\n this.render('shared', { controller: 'shared' });\n }\n });\n\n this.add('route:shared', SharedRoute);\n this.add('route:first', SharedRoute.extend());\n this.add('route:second', SharedRoute.extend());\n this.add('route:third', SharedRoute.extend());\n this.add('route:fourth', SharedRoute.extend());\n\n this.add('controller:shared', _controller.default.extend());\n\n this.addTemplate('shared', '

    {{message}}{{x-input}}

    ');\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/first').then(() => {\n assert.ok(true, '/first has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the first message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return this.visit('/second');\n }).then(() => {\n assert.ok(true, '/second has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the second message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return (0, _runloop.run)(() => {\n this.applicationInstance.lookup('router:main').transitionTo('third').then(function () {\n assert.ok(true, 'expected transition');\n }, function (reason) {\n assert.ok(false, 'unexpected transition failure: ', QUnit.jsDump.parse(reason));\n });\n });\n }).then(() => {\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the third message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return this.visit('fourth');\n }).then(() => {\n assert.ok(true, '/fourth has been handled');\n assert.equal(insertionCount, 1, 'expected one assertion');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the fourth message');\n });\n }\n\n ['@test ApplicationRoute with model does not proxy the currentPath'](assert) {\n let model = {};\n let currentPath;\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return model;\n }\n }));\n\n this.add('controller:application', _controller.default.extend({\n currentPathDidChange: (0, _metal.observer)('currentPath', function () {\n currentPath = this.currentPath;\n })\n }));\n\n return this.visit('/').then(() => {\n assert.equal(currentPath, 'index', 'currentPath is index');\n assert.equal('currentPath' in model, false, 'should have defined currentPath on controller');\n });\n }\n\n ['@test Promises encountered on app load put app into loading state until resolved'](assert) {\n assert.expect(2);\n\n let deferred = _rsvp.default.defer();\n this.router.map(function () {\n this.route('index', { 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\n (0, _runloop.run)(() => this.visit('/'));\n let 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 Route should tear down multiple outlets'](assert) {\n this.addTemplate('application', \"{{outlet 'menu'}}{{outlet}}{{outlet 'footer'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '

    postsIndex

    ');\n this.addTemplate('posts.menu', '
    postsMenu
    ');\n this.addTemplate('posts.footer', '
    postsFooter
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n renderTemplate() {\n this.render('posts/menu', {\n into: 'application',\n outlet: 'menu'\n });\n\n this.render();\n\n this.render('posts/footer', {\n into: 'application',\n outlet: 'footer'\n });\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-menu')), 'postsMenu', 'The posts/menu template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-footer')), 'postsFooter', 'The posts/footer template was rendered');\n\n return this.visit('/users');\n }).then(() => {\n assert.ok(true, '/users has been handled');\n assert.equal(rootElement.querySelector('div.posts-menu'), null, 'The posts/menu template was removed');\n assert.equal(rootElement.querySelector('p.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-footer'), null, 'The posts/footer template was removed');\n });\n }\n\n ['@test Route supports clearing outlet explicitly'](assert) {\n this.addTemplate('application', \"{{outlet}}{{outlet 'modal'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '
    postsIndex {{outlet}}
    ');\n this.addTemplate('posts.modal', '
    postsModal
    ');\n this.addTemplate('posts.extra', '
    postsExtra
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showModal() {\n this.render('posts/modal', {\n into: 'application',\n outlet: 'modal'\n });\n },\n hideModal() {\n this.disconnectOutlet({\n outlet: 'modal',\n parentView: 'application'\n });\n }\n }\n }));\n\n this.add('route:posts.index', _routing.Route.extend({\n actions: {\n showExtra() {\n this.render('posts/extra', {\n into: 'posts/index'\n });\n },\n hideExtra() {\n this.disconnectOutlet({ parentView: 'posts/index' });\n }\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n\n return this.visit('/posts').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n (0, _runloop.run)(() => router.send('showModal'));\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(() => router.send('showExtra'));\n\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-extra')), 'postsExtra', 'The posts/extra template was rendered');\n (0, _runloop.run)(() => router.send('hideModal'));\n\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n (0, _runloop.run)(() => router.send('hideExtra'));\n\n assert.equal(rootElement.querySelector('div.posts-extra'), null, 'The posts/extra template was removed');\n (0, _runloop.run)(function () {\n router.send('showModal');\n });\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(function () {\n router.send('showExtra');\n });\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-extra')), 'postsExtra', 'The posts/extra template was rendered');\n return this.visit('/users');\n }).then(() => {\n assert.equal(rootElement.querySelector('div.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n assert.equal(rootElement.querySelector('div.posts-extra'), null, 'The posts/extra template was removed');\n });\n }\n\n ['@test Route supports clearing outlet using string parameter'](assert) {\n this.addTemplate('application', \"{{outlet}}{{outlet 'modal'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '
    postsIndex {{outlet}}
    ');\n this.addTemplate('posts.modal', '
    postsModal
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showModal() {\n this.render('posts/modal', {\n into: 'application',\n outlet: 'modal'\n });\n },\n hideModal() {\n this.disconnectOutlet('modal');\n }\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/posts').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n (0, _runloop.run)(() => router.send('showModal'));\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(() => router.send('hideModal'));\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n return this.visit('/users');\n }).then(() => {\n assert.equal(rootElement.querySelector('div.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n });\n }\n\n ['@test Route silently fails when cleaning an outlet from an inactive view'](assert) {\n assert.expect(1); // handleURL\n\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('posts', \"{{outlet 'modal'}}\");\n this.addTemplate('modal', 'A Yo.');\n\n this.router.map(function () {\n this.route('posts');\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n hideSelf() {\n this.disconnectOutlet({\n outlet: 'main',\n parentView: 'application'\n });\n },\n showModal() {\n this.render('modal', { into: 'posts', outlet: 'modal' });\n },\n hideModal() {\n this.disconnectOutlet({ outlet: 'modal', parentView: 'posts' });\n }\n }\n }));\n\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n let router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(() => router.send('showModal'));\n (0, _runloop.run)(() => router.send('hideSelf'));\n (0, _runloop.run)(() => router.send('hideModal'));\n });\n }\n\n ['@test Router `willTransition` hook passes in cancellable transition'](assert) {\n // Should hit willTransition 3 times, once for the initial route, and then 2 more times\n // for the two handleURL calls below\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.expect(7);\n\n this.router.reopen({\n init() {\n this._super(...arguments);\n this.on('routeWillChange', transition => {\n assert.ok(true, 'routeWillChange was called');\n if (transition.intent && transition.intent.url !== '/') {\n transition.abort();\n }\n });\n }\n });\n } else {\n assert.expect(5);\n this.router.reopen({\n willTransition(_, _2, transition) {\n assert.ok(true, 'willTransition was called');\n if (transition.intent.url !== '/') {\n transition.abort();\n }\n }\n });\n }\n\n this.router.map(function () {\n this.route('nork');\n this.route('about');\n });\n\n this.add('route:loading', _routing.Route.extend({\n activate() {\n assert.ok(false, 'LoadingRoute was not entered');\n }\n }));\n\n this.add('route:nork', _routing.Route.extend({\n activate() {\n assert.ok(false, 'NorkRoute was not entered');\n }\n }));\n\n this.add('route:about', _routing.Route.extend({\n activate() {\n assert.ok(false, 'AboutRoute was not entered');\n }\n }));\n\n return this.visit('/').then(() => {\n this.handleURLAborts(assert, '/nork');\n this.handleURLAborts(assert, '/about');\n });\n }\n\n ['@test Aborting/redirecting the transition in `willTransition` prevents LoadingRoute from being entered'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('index');\n this.route('nork');\n this.route('about');\n });\n\n let redirect = false;\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition(transition) {\n assert.ok(true, 'willTransition was called');\n if (redirect) {\n // router.js won't refire `willTransition` for this redirect\n this.transitionTo('about');\n } else {\n transition.abort();\n }\n }\n }\n }));\n\n let deferred = null;\n\n this.add('route:loading', _routing.Route.extend({\n activate() {\n assert.ok(deferred, 'LoadingRoute should be entered at this time');\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 model() {\n if (deferred) {\n return deferred.promise;\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n // Attempted transitions out of index should abort.\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'handleURL', '/nork');\n\n // Attempted transitions out of index should redirect to about\n redirect = true;\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'transitionTo', 'index');\n\n // Redirected transitions out of index to a route with a\n // promise model should pause the transition and\n // activate LoadingRoute\n deferred = _rsvp.default.defer();\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(deferred.resolve);\n });\n }\n\n ['@test `didTransition` event fires on the router'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('nork');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n router.one('didTransition', function () {\n assert.ok(true, 'didTransition fired on initial routing');\n });\n this.visit('/');\n }).then(() => {\n let router = this.applicationInstance.lookup('router:main');\n router.one('didTransition', function () {\n assert.ok(true, 'didTransition fired on the router');\n assert.equal(router.get('url'), '/nork', 'The url property is updated by the time didTransition fires');\n });\n\n return this.visit('/nork');\n });\n }\n\n ['@test `didTransition` can be reopened'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('nork');\n });\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.ok(true, 'no longer a valid test');\n return;\n } else {\n this.router.reopen({\n didTransition() {\n this._super(...arguments);\n assert.ok(true, 'reopened didTransition was called');\n }\n });\n }\n\n return this.visit('/');\n }\n\n ['@test `activate` event fires on the route'](assert) {\n assert.expect(2);\n\n let eventFired = 0;\n\n this.router.map(function () {\n this.route('nork');\n });\n\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('activate', function () {\n assert.equal(++eventFired, 1, 'activate event is fired once');\n });\n },\n\n activate() {\n assert.ok(true, 'activate hook is called');\n }\n }));\n\n return this.visit('/nork');\n }\n\n ['@test `deactivate` event fires on the route'](assert) {\n assert.expect(2);\n\n let eventFired = 0;\n\n this.router.map(function () {\n this.route('nork');\n this.route('dork');\n });\n\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('deactivate', function () {\n assert.equal(++eventFired, 1, 'deactivate event is fired once');\n });\n },\n\n deactivate() {\n assert.ok(true, 'deactivate hook is called');\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 let SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\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\n return this.visit('/').then(() => {\n let 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\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('bar');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let 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\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('bar', function () {\n this.route('baz');\n });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let 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 ApplicationController that can be used in transitionTo'](assert) {\n assert.expect(24);\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n this.route('be', function () {\n this.route('excellent', { resetNamespace: true }, function () {\n this.route('to', { resetNamespace: true }, function () {\n this.route('each', { resetNamespace: true }, function () {\n this.route('other');\n });\n });\n });\n });\n });\n\n return this.visit('/').then(() => {\n let appController = this.applicationInstance.lookup('controller:application');\n let 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 assert.equal(appController.get('currentPath'), expectedPath);\n assert.equal(appController.get('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\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 Route model hook finds the same model as a manual find'](assert) {\n let post;\n let Post = _runtime.Object.extend();\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', { 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', { path: '/parent/:parent_id' }, function () {\n this.route('child');\n });\n });\n\n let appcount = 0;\n this.add('route:application', _routing.Route.extend({\n model() {\n ++appcount;\n }\n }));\n\n let parentcount = 0;\n this.add('route:parent', _routing.Route.extend({\n model(params) {\n assert.equal(params.parent_id, '123');\n ++parentcount;\n },\n actions: {\n refreshParent() {\n this.refresh();\n }\n }\n }));\n\n let childcount = 0;\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n ++childcount;\n }\n }));\n\n let 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 ['@test Specifying non-existent controller name in route#render throws'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n expectAssertion(() => {\n this.render('homepage', {\n controller: 'stefanpenneristhemanforme'\n });\n }, \"You passed `controller: 'stefanpenneristhemanforme'` into the `render` method, but no such controller could be found.\");\n }\n }));\n\n return this.visit('/');\n }\n\n [\"@test Redirecting with null model doesn't error out\"](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('about', { path: '/about/:hurhurhur' });\n });\n\n this.add('route:about', _routing.Route.extend({\n serialize: function (model) {\n if (model === null) {\n return { hurhurhur: 'TreeklesMcGeekles' };\n }\n }\n }));\n\n this.add('route:home', _routing.Route.extend({\n beforeModel() {\n this.transitionTo('about', null);\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(router.get('location.path'), '/about/TreeklesMcGeekles');\n });\n }\n\n ['@test rejecting the model hooks promise with a non-error prints the `message` property'](assert) {\n assert.expect(5);\n\n let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n let rejectedStack = 'Yeah, buddy: stack gets printed too.';\n\n this.router.map(function () {\n this.route('yippie', { path: '/' });\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 return assert.throws(() => {\n return this.visit('/');\n }, function (err) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n ['@test rejecting the model hooks promise with an error with `errorThrown` property prints `errorThrown.message` property'](assert) {\n assert.expect(5);\n let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n let rejectedStack = 'Yeah, buddy: stack gets printed too.';\n\n this.router.map(function () {\n this.route('yippie', { path: '/' });\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: { message: rejectedMessage, stack: rejectedStack }\n });\n }\n }));\n\n assert.throws(() => this.visit('/'), function (err) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n ['@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', { path: '/' });\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 return assert.throws(() => this.visit('/'));\n }\n\n ['@test rejecting the model hooks promise with a string shows a good error'](assert) {\n assert.expect(3);\n let rejectedMessage = 'Supercalifragilisticexpialidocious';\n\n this.router.map(function () {\n this.route('yondo', { path: '/' });\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 assert.throws(() => 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\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\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 ['@test Errors in transitionTo within redirect hook are logged'](assert) {\n assert.expect(4);\n let actual = [];\n\n this.router.map(function () {\n this.route('yondo', { path: '/' });\n this.route('stink-bomb');\n });\n\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n this.transitionTo('stink-bomb', { something: 'goes boom' });\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 assert.throws(() => this.visit('/'), /More context objects were passed/);\n\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\n this.router.map(function () {\n this.route('yondo', { path: '/' });\n this.route('stink-bomb');\n });\n\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n this.transitionTo('stink-bomb', { something: 'goes boom' });\n }\n }));\n console.error = () => {};\n\n return this.visit('/').then(() => {\n let 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\n this.router.map(function () {\n this.route('a', function () {\n this.route('b', { path: '/b/:id', resetNamespace: true }, function () {});\n this.route('c', { path: '/c/:id', resetNamespace: true }, function () {});\n });\n this.route('out');\n });\n\n let calls = [];\n\n let SpyRoute = _routing.Route.extend({\n setupController() /* controller, model, transition */{\n calls.push(['setup', this.routeName]);\n },\n\n resetController() /* controller */{\n calls.push(['reset', this.routeName]);\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\n let 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 ['@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 return assert.throws(() => this.visit('/boom'), /\\bboom\\b/);\n }\n\n ['@test Exception during initialization of initial route is not swallowed'](assert) {\n this.router.map(function () {\n this.route('boom', { path: '/' });\n });\n this.add('route:boom', _routing.Route.extend({\n init() {\n throw new Error('boom!');\n }\n }));\n return assert.throws(() => this.visit('/'), /\\bboom\\b/);\n }\n\n ['@test {{outlet}} works when created after initial render'](assert) {\n this.addTemplate('sample', 'Hi{{#if 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', { path: '/' }, function () {\n this.route('inner', { path: '/' });\n this.route('inner2', { path: '/2' });\n });\n });\n\n let rootElement;\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'HiBye', 'initial render');\n\n (0, _runloop.run)(() => this.applicationInstance.lookup('controller:sample').set('showTheThing', true));\n\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 Can render into a named outlet at the top level'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'initial render');\n });\n }\n\n ['@test Can disconnect a named outlet at the top level'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n },\n actions: {\n banish() {\n this.disconnectOutlet({\n parentView: 'application',\n outlet: 'other'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'initial render');\n\n (0, _runloop.run)(this.applicationInstance.lookup('router:main'), 'send', 'banish');\n\n assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'second render');\n });\n }\n\n ['@test Can render into a named outlet at the top level, with empty main outlet'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n\n this.router.map(function () {\n this.route('hasNoTemplate', { path: '/' });\n });\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A--B-Hello world-C', 'initial render');\n });\n }\n\n ['@test Can render into a named outlet at the top level, later'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n launch() {\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'initial render');\n (0, _runloop.run)(this.applicationInstance.lookup('router:main'), 'send', 'launch');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'second render');\n });\n }\n\n [\"@test Can render routes with no 'main' outlet and their children\"](assert) {\n this.addTemplate('application', '
    {{outlet \"app\"}}
    ');\n this.addTemplate('app', '
    {{outlet \"common\"}}
    {{outlet \"sub\"}}
    ');\n this.addTemplate('common', '
    ');\n this.addTemplate('sub', '
    ');\n\n this.router.map(function () {\n this.route('app', { path: '/app' }, function () {\n this.route('sub', { path: '/sub', resetNamespace: true });\n });\n });\n\n this.add('route:app', _routing.Route.extend({\n renderTemplate() {\n this.render('app', {\n outlet: 'app',\n into: 'application'\n });\n this.render('common', {\n outlet: 'common',\n into: 'app'\n });\n }\n }));\n\n this.add('route:sub', _routing.Route.extend({\n renderTemplate() {\n this.render('sub', {\n outlet: 'sub',\n into: 'app'\n });\n }\n }));\n\n let rootElement;\n return this.visit('/app').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('#app-common #common').length, 1, 'Finds common while viewing /app');\n return this.visit('/app/sub');\n }).then(() => {\n assert.equal(rootElement.querySelectorAll('#app-common #common').length, 1, 'Finds common while viewing /app/sub');\n assert.equal(rootElement.querySelectorAll('#app-sub #sub').length, 1, 'Finds sub while viewing /app/sub');\n });\n }\n\n ['@test Tolerates stacked renders'](assert) {\n this.addTemplate('application', '{{outlet}}{{outlet \"modal\"}}');\n this.addTemplate('index', 'hi');\n this.addTemplate('layer', 'layer');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n openLayer() {\n this.render('layer', {\n into: 'application',\n outlet: 'modal'\n });\n },\n close() {\n this.disconnectOutlet({\n outlet: 'modal',\n parentView: 'application'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(rootElement.textContent.trim(), 'hi');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'close');\n assert.equal(rootElement.textContent.trim(), 'hi');\n });\n }\n\n ['@test Renders child into parent with non-default template name'](assert) {\n this.addTemplate('application', '
    {{outlet}}
    ');\n this.addTemplate('exports.root', '
    {{outlet}}
    ');\n this.addTemplate('exports.index', '
    ');\n\n this.router.map(function () {\n this.route('root', function () {});\n });\n\n this.add('route:root', _routing.Route.extend({\n renderTemplate() {\n this.render('exports/root');\n }\n }));\n\n this.add('route:root.index', _routing.Route.extend({\n renderTemplate() {\n this.render('exports/index');\n }\n }));\n\n return this.visit('/root').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('.a .b .c').length, 1);\n });\n }\n\n [\"@test Allows any route to disconnectOutlet another route's templates\"](assert) {\n this.addTemplate('application', '{{outlet}}{{outlet \"modal\"}}');\n this.addTemplate('index', 'hi');\n this.addTemplate('layer', 'layer');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n openLayer() {\n this.render('layer', {\n into: 'application',\n outlet: 'modal'\n });\n }\n }\n }));\n this.add('route:index', _routing.Route.extend({\n actions: {\n close() {\n this.disconnectOutlet({\n parentView: 'application',\n outlet: 'modal'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(rootElement.textContent.trim(), 'hi');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'close');\n assert.equal(rootElement.textContent.trim(), 'hi');\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 showFirst}}{{my-component}}{{else}}{{other-component}}{{/if}}');\n\n let myComponentCounter = 0;\n let otherComponentCounter = 0;\n let indexController;\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n\n this.add('controller:index', _controller.default.extend({\n showFirst: true\n }));\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\n (0, _runloop.run)(() => indexController.set('showFirst', false));\n\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 ['@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\n this.router.map(function () {\n this.route('index', { path: '/' });\n this.route('other', function () {});\n });\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition() {\n throw new Error('boom');\n }\n }\n }));\n\n return this.visit('/').then(() => {\n return assert.throws(() => {\n return this.visit('/other');\n }, /boom/, 'expected an exception but none was thrown');\n });\n }\n\n ['@test Exception if outlet name is undefined in render and disconnectOutlet']() {\n this.add('route:application', _routing.Route.extend({\n actions: {\n showModal() {\n this.render({\n outlet: undefined,\n parentView: 'application'\n });\n },\n hideModal() {\n this.disconnectOutlet({\n outlet: undefined,\n parentView: 'application'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n expectAssertion(() => {\n (0, _runloop.run)(() => router.send('showModal'));\n }, /You passed undefined as the outlet name/);\n\n expectAssertion(() => {\n (0, _runloop.run)(() => router.send('hideModal'));\n }, /You passed undefined as the outlet name/);\n });\n }\n\n ['@test Route serializers work for Engines'](assert) {\n assert.expect(2);\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let postSerialize = function (params) {\n assert.ok(true, 'serialize hook runs');\n return {\n post_id: params.id\n };\n };\n let BlogMap = function () {\n this.route('post', {\n path: '/post/:post_id',\n serialize: postSerialize\n });\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(router._routerMicrolib.generate('blog.post', { id: '13' }), '/blog/post/13', 'url is generated properly');\n });\n }\n\n ['@test Defining a Route#serialize method in an Engine throws an error'](assert) {\n assert.expect(1);\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {\n this.route('post');\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let PostRoute = _routing.Route.extend({ serialize() {} });\n this.applicationInstance.lookup('engine:blog').register('route:post', PostRoute);\n\n assert.throws(() => router.transitionTo('blog.post'), /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\n let engineInstance;\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n let EngineIndexRoute = _routing.Route.extend({\n init() {\n this._super(...arguments);\n engineInstance = (0, _owner.getOwner)(this);\n }\n });\n\n // Register engine route map\n let BlogMap = function () {\n this.route('post');\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let 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 let route = engineInstance.lookup('route:index');\n let router = this.applicationInstance.lookup('router:main');\n\n (0, _runloop.run)(router, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was cleared');\n\n (0, _runloop.run)(route, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n\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 let generatedRoute;\n\n this.router.map(function () {\n this.route('posts');\n });\n\n let AppRoute = _routing.Route.extend();\n this.add('route:basic', AppRoute);\n\n return this.visit('/posts').then(() => {\n generatedRoute = this.applicationInstance.lookup('route:posts');\n\n assert.ok(generatedRoute instanceof AppRoute, 'should extend the correct route');\n });\n }\n });\n});","enifed('ember/tests/routing/deprecated_handler_infos_test', ['internal-test-helpers', '@ember/canary-features'], function (_internalTestHelpers, _canaryFeatures) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _internalTestHelpers.moduleFor)('Deprecated HandlerInfos', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n }\n\n get routerOptions() {\n return {\n willTransition(oldHandlers, newHandlers, transition) {\n expectDeprecation(() => {\n this._routerMicrolib.currentHandlerInfos;\n }, 'You attempted to use \"_routerMicrolib.currentHandlerInfos\" which is a private API that will be removed.');\n\n expectDeprecation(() => {\n this._routerMicrolib.getHandler('parent');\n }, 'You attempted to use \"_routerMicrolib.getHandler\" which is a private API that will be removed.');\n\n oldHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n newHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n\n expectDeprecation(() => {\n transition.handlerInfos;\n }, 'You attempted to use \"transition.handlerInfos\" which is a private API that will be removed.');\n\n expectDeprecation(() => {\n transition.state.handlerInfos;\n }, 'You attempted to use \"transition.state.handlerInfos\" which is a private API that will be removed.');\n QUnit.assert.ok(true, 'willTransition');\n },\n\n didTransition(newHandlers) {\n newHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n QUnit.assert.ok(true, 'didTransition');\n }\n };\n }\n\n '@test handlerInfos are deprecated and associated private apis'(assert) {\n let done = assert.async();\n expectDeprecation(() => {\n return this.visit('/parent').then(() => {\n done();\n });\n }, /You attempted to override the \\\"(willTransition|didTransition)\\\" method which is deprecated. Please inject the router service and listen to the \\\"(routeWillChange|routeDidChange)\\\" event\\./);\n }\n });\n }\n});","enifed('ember/tests/routing/deprecated_transition_state_test', ['internal-test-helpers', '@ember/canary-features'], function (_internalTestHelpers, _canaryFeatures) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n (0, _internalTestHelpers.moduleFor)('Deprecated Transition State', class extends _internalTestHelpers.RouterTestCase {\n '@test touching transition.state is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.state;\n }, 'You attempted to read \"transition.state\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the public state on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n\n '@test touching transition.queryParams is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.queryParams;\n }, 'You attempted to read \"transition.queryParams\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the queryParams on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n\n '@test touching transition.params is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.params;\n }, 'You attempted to read \"transition.params\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the params on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n });\n }\n});","enifed('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 (0, _internalTestHelpers.moduleFor)('Query Params - main', class extends _internalTestHelpers.QueryParamTestCase {\n refreshModelWhileLoadingTest(loadingReturn) {\n let assert = this.assert;\n\n assert.expect(9);\n\n let appModelCount = 0;\n let promiseResolve;\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n appomg: {\n defaultValue: 'applol'\n }\n },\n model() /* params */{\n appModelCount++;\n }\n }));\n\n this.setSingleQPController('index', 'omg', undefined, {\n omg: undefined\n });\n\n let actionName = typeof loadingReturn !== 'undefined' ? 'loading' : 'ignore';\n let 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 model(params) {\n indexModelCount++;\n if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' });\n return new _runtime.RSVP.Promise(function (resolve) {\n promiseResolve = resolve;\n return;\n });\n } else if (indexModelCount === 3) {\n assert.deepEqual(params, { omg: 'hello' }, \"Model hook reruns even if the previous one didn't finish\");\n }\n }\n }));\n\n return this.visit('/').then(() => {\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 1);\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 2);\n\n this.setAndFlush(indexController, 'omg', 'hello');\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 3);\n\n (0, _runloop.run)(function () {\n promiseResolve();\n });\n\n assert.equal((0, _metal.get)(indexController, 'omg'), 'hello', 'At the end last value prevails');\n });\n }\n\n [\"@test No replaceURL occurs on startup because default values don't show up in URL\"](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index');\n\n return this.visitAndAssert('/');\n }\n\n ['@test Calling transitionTo does not lose query params already on the activeTransition'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n\n this.add('route:parent.child', _routing.Route.extend({\n afterModel() {\n this.transitionTo('parent.sibling');\n }\n }));\n\n this.setSingleQPController('parent');\n\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 Single query params can be set on the controller and reflected in the url'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home');\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('home');\n\n this.setAndFlush(controller, 'foo', '456');\n this.assertCurrentPath('/?foo=456');\n\n this.setAndFlush(controller, 'foo', '987');\n this.assertCurrentPath('/?foo=987');\n });\n }\n\n ['@test Query params can map to different url keys configured on the controller'](assert) {\n assert.expect(6);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: [{ foo: 'other_foo', bar: { as: 'other_bar' } }],\n foo: 'FOO',\n bar: 'BAR'\n }));\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('index');\n\n this.setAndFlush(controller, 'foo', 'LEX');\n this.assertCurrentPath('/?other_foo=LEX', \"QP mapped correctly without 'as'\");\n\n this.setAndFlush(controller, 'foo', 'WOO');\n this.assertCurrentPath('/?other_foo=WOO', \"QP updated correctly without 'as'\");\n\n this.transitionTo('/?other_foo=NAW');\n assert.equal(controller.get('foo'), 'NAW', 'QP managed correctly on URL transition');\n\n this.setAndFlush(controller, 'bar', 'NERK');\n this.assertCurrentPath('/?other_bar=NERK&other_foo=NAW', \"QP mapped correctly with 'as'\");\n\n this.setAndFlush(controller, 'bar', 'NUKE');\n this.assertCurrentPath('/?other_bar=NUKE&other_foo=NAW', \"QP updated correctly with 'as'\");\n });\n }\n\n ['@test Routes have a private overridable serializeQueryParamKey hook'](assert) {\n assert.expect(2);\n\n this.add('route:index', _routing.Route.extend({\n serializeQueryParamKey: _string.dasherize\n }));\n\n this.setSingleQPController('index', 'funTimes', '');\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('index');\n\n this.setAndFlush(controller, 'funTimes', 'woot');\n this.assertCurrentPath('/?fun-times=woot');\n });\n }\n\n ['@test Can override inherited QP behavior by specifying queryParams as a computed property'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'a', 0, {\n queryParams: (0, _metal.computed)(function () {\n return ['c'];\n }),\n c: true\n });\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n\n this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/', 'QP did not update due to being overriden');\n\n this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?c=false', 'QP updated with overridden param');\n });\n }\n\n ['@test Can concatenate inherited QP behavior by specifying queryParams as an array'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'a', 0, {\n queryParams: ['c'],\n c: true\n });\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n\n this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/?a=1', 'Inherited QP did update');\n\n this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?a=1&c=false', 'New QP did update');\n });\n }\n\n ['@test model hooks receives query params'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'bar' });\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\n this.router.map(function () {\n this.route('index', { path: '/:id' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'bar', id: 'baz' });\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\n this.router.map(function () {\n this.route('index', { path: '/:id' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'baz', id: 'boo' });\n }\n }));\n\n return this.visitAndAssert('/boo?foo=baz');\n }\n\n ['@test error is thrown if dynamic segment and query param have same name'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('index', { path: '/:foo' });\n });\n\n this.setSingleQPController('index');\n\n expectAssertion(() => {\n this.visitAndAssert('/boo?foo=baz');\n }, `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\n this.setSingleQPController('application');\n\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\n this.setSingleQPController('application', { 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\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: 'bar' }, '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\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: 'boo' }, '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\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index', 'foo', false);\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: false }, '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\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index', 'foo', true);\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: false }, '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\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { appomg: 'applol' });\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { omg: 'lol' });\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\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { appomg: 'appyes' });\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { omg: 'yes' });\n assert.deepEqual(this.paramsFor('application'), {\n appomg: 'appyes'\n });\n }\n }));\n\n return this.visitAndAssert('/?appomg=appyes&omg=yes');\n }\n\n ['@test can opt into full transition by setting refreshModel in route queryParams'](assert) {\n assert.expect(7);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params, transition */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' }, 'params are correct on second pass');\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\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\n ['@test refreshModel and replace work together'](assert) {\n assert.expect(8);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true,\n replace: true\n }\n },\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' }, 'params are correct on second pass');\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n\n let indexController = this.getController('index');\n this.expectedReplaceURL = '/?omg=lex';\n this.setAndFlush(indexController, 'omg', 'lex');\n\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\n ['@test multiple QP value changes only cause a single model refresh'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index', 'alex', 'lol');\n this.setSingleQPController('index', 'steely', 'lel');\n\n let 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 refresh() {\n refreshCount++;\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n (0, _runloop.run)(indexController, 'setProperties', {\n alex: 'fran',\n steely: 'david'\n });\n assert.equal(refreshCount, 1, 'index refresh hook only run once');\n });\n }\n\n ['@test refreshModel does not cause a second transition during app boot '](assert) {\n assert.expect(1);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n refresh() {\n assert.ok(false);\n }\n }));\n\n return this.visitAndAssert('/?appomg=hello&omg=world');\n }\n\n ['@test queryParams are updated when a controller property is set and the route is refreshed. Issue #13263 '](assert) {\n this.addTemplate('application', '{{foo}}{{outlet}}');\n\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 return this.visitAndAssert('/').then(() => {\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '1');\n\n (0, _runloop.run)(document.getElementById('test-button'), 'click');\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '2');\n this.assertCurrentPath('/?foo=2');\n\n (0, _runloop.run)(document.getElementById('test-button'), 'click');\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '3');\n this.assertCurrentPath('/?foo=3');\n });\n }\n\n [\"@test Use Ember.get to retrieve query params 'refreshModel' configuration\"](assert) {\n assert.expect(7);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty() {\n return { refreshModel: true };\n }\n }),\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' });\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' });\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 1);\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 2);\n });\n }\n\n ['@test can use refreshModel even with URL changes that remove QPs from address bar'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n model(params) {\n indexModelCount++;\n\n let data;\n if (indexModelCount === 1) {\n data = 'foo';\n } else if (indexModelCount === 2) {\n data = 'lol';\n }\n\n assert.deepEqual(params, { omg: data }, 'index#model receives right data');\n }\n }));\n\n return this.visitAndAssert('/?omg=foo').then(() => {\n this.transitionTo('/');\n\n let indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'lol');\n });\n }\n\n ['@test can opt into a replace query by specifying replace:true in the Route config hash'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application', 'alex', 'matchneer');\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n alex: {\n replace: true\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n this.setAndFlush(appController, 'alex', 'wallace');\n });\n }\n\n ['@test Route query params config can be configured using property name instead of URL key'](assert) {\n assert.expect(2);\n\n this.add('controller:application', _controller.default.extend({\n queryParams: [{ commitBy: 'commit_by' }]\n }));\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n commitBy: {\n replace: true\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?commit_by=igor_seb';\n this.setAndFlush(appController, 'commitBy', 'igor_seb');\n });\n }\n\n ['@test An explicit replace:false on a changed QP always wins and causes a pushState'](assert) {\n assert.expect(3);\n\n this.add('controller:application', _controller.default.extend({\n queryParams: ['alex', 'steely'],\n alex: 'matchneer',\n steely: 'dan'\n }));\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\n return this.visit('/').then(() => {\n let appController = this.getController('application');\n this.expectedPushURL = '/?alex=wallace&steely=jan';\n (0, _runloop.run)(appController, 'setProperties', { alex: 'wallace', steely: 'jan' });\n\n this.expectedPushURL = '/?alex=wallace&steely=fran';\n (0, _runloop.run)(appController, 'setProperties', { steely: 'fran' });\n\n this.expectedReplaceURL = '/?alex=sriracha&steely=fran';\n (0, _runloop.run)(appController, 'setProperties', { alex: 'sriracha' });\n });\n }\n\n ['@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', \"{{link-to 'Parent' 'parent' (query-params foo='change') id='parent-link'}}\");\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n\n let parentModelCount = 0;\n this.add('route:parent', _routing.Route.extend({\n model() {\n parentModelCount++;\n },\n queryParams: {\n foo: {\n refreshModel: true\n }\n }\n }));\n\n this.setSingleQPController('parent', 'foo', 'abc');\n\n return this.visit('/parent/child?foo=lol').then(() => {\n assert.equal(parentModelCount, 1);\n\n (0, _runloop.run)(document.getElementById('parent-link'), 'click');\n assert.equal(parentModelCount, 2);\n });\n }\n\n [\"@test Use Ember.get to retrieve query params 'replace' configuration\"](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application', 'alex', 'matchneer');\n\n this.add('route:application', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty() /* keyName */{\n // We are simulating all qps requiring refresh\n return { replace: true };\n }\n })\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n this.setAndFlush(appController, 'alex', 'wallace');\n });\n }\n\n ['@test can override incoming QP values in setupController'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', 'OVERRIDE');\n },\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n }\n }));\n\n return this.visitAndAssert('/about').then(() => {\n this.transitionTo('index');\n this.assertCurrentPath('/?omg=OVERRIDE');\n });\n }\n\n ['@test can override incoming QP array values in setupController'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.setSingleQPController('index', 'omg', ['lol']);\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', ['OVERRIDE']);\n },\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n }\n }));\n\n return this.visitAndAssert('/about').then(() => {\n this.transitionTo('index');\n this.assertCurrentPath('/?omg=' + encodeURIComponent(JSON.stringify(['OVERRIDE'])));\n });\n }\n\n ['@test URL transitions that remove QPs still register as QP changes'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n return this.visit('/?omg=borf').then(() => {\n let indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'borf');\n\n this.transitionTo('/');\n assert.equal(indexController.get('omg'), 'lol');\n });\n }\n\n ['@test Subresource naming style is supported'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('abc.def', { path: '/abcdef' }, function () {\n this.route('zoo');\n });\n });\n\n this.addTemplate('application', \"{{link-to 'A' 'abc.def' (query-params foo='123') id='one'}}{{link-to 'B' 'abc.def.zoo' (query-params foo='123' bar='456') id='two'}}{{outlet}}\");\n\n this.setSingleQPController('abc.def', 'foo', 'lol');\n this.setSingleQPController('abc.def.zoo', 'bar', 'haha');\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#one').attr('href'), '/abcdef?foo=123');\n assert.equal(this.$('#two').attr('href'), '/abcdef/zoo?bar=456&foo=123');\n\n (0, _runloop.run)(this.$('#one'), 'click');\n this.assertCurrentPath('/abcdef?foo=123');\n\n (0, _runloop.run)(this.$('#two'), 'click');\n this.assertCurrentPath('/abcdef/zoo?bar=456&foo=123');\n });\n }\n\n ['@test transitionTo supports query params']() {\n this.setSingleQPController('index', 'foo', 'lol');\n\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: 'borf' } });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n\n this.transitionTo({ queryParams: { 'index:foo': 'blaf' } });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n\n this.transitionTo({ queryParams: { 'index:foo': false } });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n\n this.transitionTo({ queryParams: { foo: false } });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n });\n }\n\n ['@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\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: 'borf' } });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n\n this.transitionTo({ queryParams: { 'index:foo': 'blaf' } });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n\n this.transitionTo({ queryParams: { 'index:foo': false } });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n\n this.transitionTo({ queryParams: { foo: false } });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n });\n }\n\n [\"@test setting controller QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index', 'foo', '123');\n\n return this.visit('/').then(() => {\n let controller = this.getController('index');\n\n this.expectedPushURL = '/?foo=';\n this.setAndFlush(controller, 'foo', '');\n });\n }\n\n [\"@test setting QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let controller = this.getController('index');\n\n this.expectedPushURL = '/?foo=';\n this.setAndFlush(controller, 'foo', '');\n });\n }\n\n ['@test A default boolean value deserializes QPs as booleans rather than strings'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'foo', false);\n\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 let controller = this.getController('index');\n assert.equal(controller.get('foo'), true);\n\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\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: ''\n }));\n\n return this.visit('/?foo=').then(() => {\n let controller = this.getController('index');\n assert.equal(controller.get('foo'), '');\n });\n }\n\n ['@test Array query params can be set'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home', 'foo', []);\n\n return this.visit('/').then(() => {\n let controller = this.getController('home');\n\n this.setAndFlush(controller, 'foo', [1, 2]);\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n\n this.setAndFlush(controller, 'foo', [3, 4]);\n this.assertCurrentPath('/?foo=%5B3%2C4%5D');\n });\n }\n\n ['@test (de)serialization: arrays'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('index', 'foo', [1]);\n\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: [2, 3] } });\n this.assertCurrentPath('/?foo=%5B2%2C3%5D', 'shorthand supported');\n this.transitionTo({ queryParams: { 'index:foo': [4, 5] } });\n this.assertCurrentPath('/?foo=%5B4%2C5%5D', 'longform supported');\n this.transitionTo({ queryParams: { foo: [] } });\n this.assertCurrentPath('/?foo=%5B%5D', 'longform supported');\n });\n }\n\n ['@test Url with array query param sets controller property to array'](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index', 'foo', '');\n\n return this.visit('/?foo[]=1&foo[]=2&foo[]=3').then(() => {\n let controller = this.getController('index');\n assert.deepEqual(controller.get('foo'), ['1', '2', '3']);\n });\n }\n\n ['@test Array query params can be pushed/popped'](assert) {\n assert.expect(17);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home', 'foo', (0, _runtime.A)());\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('home');\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 2);\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n assert.deepEqual(controller.foo, [1, 2]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'unshiftObject', 'lol');\n this.assertCurrentPath('/?foo=%5B%22lol%22%2C1%5D');\n assert.deepEqual(controller.foo, ['lol', 1]);\n });\n }\n\n [\"@test Overwriting with array with same content shouldn't refire update\"](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let 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\n return this.visitAndAssert('/').then(() => {\n assert.equal(modelCount, 1);\n\n let controller = this.getController('home');\n this.setAndFlush(controller, 'model', (0, _runtime.A)([1]));\n\n assert.equal(modelCount, 1);\n this.assertCurrentPath('/');\n });\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\n this.router.map(function () {\n this.route('other');\n });\n\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 this.setSingleQPController('application', 'woot', 'wat');\n\n this.add('route:other', _routing.Route.extend({\n model(p, trans) {\n let m = (0, _meta.peekMeta)(trans[_router_js.PARAMS_SYMBOL].application);\n assert.ok(m === undefined, \"A meta object isn't constructed for this params POJO\");\n }\n }));\n\n return this.visit('/').then(() => {\n this.transitionTo('other');\n });\n }\n\n ['@test Setting bound query param property to null or undefined does not serialize to url'](assert) {\n assert.expect(9);\n\n this.router.map(function () {\n this.route('home');\n });\n\n this.setSingleQPController('home', 'foo', [1, 2]);\n\n return this.visitAndAssert('/home').then(() => {\n var controller = this.getController('home');\n\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n\n this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n\n return this.transitionTo('/home').then(() => {\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n\n this.setAndFlush(controller, 'foo', null);\n this.assertCurrentPath('/home', 'Setting property to null');\n\n this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n\n this.setAndFlush(controller, 'foo', undefined);\n this.assertCurrentPath('/home', 'Setting property to undefined');\n });\n });\n }\n\n ['@test {{link-to}} with null or undefined QPs does not get serialized into url'](assert) {\n assert.expect(3);\n\n this.addTemplate('home', \"{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}\");\n\n this.router.map(function () {\n this.route('home');\n });\n\n this.setSingleQPController('home', 'foo', [], {\n nullValue: null,\n undefinedValue: undefined\n });\n\n return this.visitAndAssert('/home').then(() => {\n assert.equal(this.$('#null-link').attr('href'), '/home');\n assert.equal(this.$('#undefined-link').attr('href'), '/home');\n });\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\n this.setSingleQPController('index', 'woot', undefined, {\n woot: undefined\n });\n\n this.add('route:application', _routing.Route.extend({\n model() /* p, trans */{\n return { woot: true };\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller, model) {\n assert.deepEqual(model, { woot: true }, 'index route inherited model route from parent route');\n }\n }));\n\n return this.visitAndAssert('/');\n }\n\n ['@test opting into replace does not affect transitions between routes'](assert) {\n assert.expect(5);\n\n this.addTemplate('application', \"{{link-to 'Foo' 'foo' id='foo-link'}}{{link-to 'Bar' 'bar' id='bar-no-qp-link'}}{{link-to 'Bar' 'bar' (query-params raytiley='isthebest') id='bar-link'}}{{outlet}}\");\n\n this.router.map(function () {\n this.route('foo');\n this.route('bar');\n });\n\n this.setSingleQPController('bar', 'raytiley', 'israd');\n\n this.add('route:bar', _routing.Route.extend({\n queryParams: {\n raytiley: {\n replace: true\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let controller = this.getController('bar');\n\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n\n this.expectedPushURL = '/bar';\n (0, _runloop.run)(document.getElementById('bar-no-qp-link'), 'click');\n\n this.expectedReplaceURL = '/bar?raytiley=woot';\n this.setAndFlush(controller, 'raytiley', 'woot');\n\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n\n this.expectedPushURL = '/bar?raytiley=isthebest';\n (0, _runloop.run)(document.getElementById('bar-link'), 'click');\n });\n }\n\n [\"@test undefined isn't serialized or deserialized into a string\"](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('example');\n });\n\n this.addTemplate('application', \"{{link-to 'Example' 'example' (query-params foo=undefined) id='the-link'}}\");\n\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n\n this.add('route:example', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: undefined });\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n\n return this.transitionTo('example', {\n queryParams: { foo: undefined }\n }).then(() => {\n this.assertCurrentPath('/example');\n });\n });\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 [\"@test warn user that Route's queryParams configuration must be an Object, not an Array\"](assert) {\n assert.expect(1);\n\n this.add('route:application', _routing.Route.extend({\n queryParams: [{ commitBy: { replace: true } }]\n }));\n\n expectAssertion(() => {\n this.visit('/');\n }, 'You passed in `[{\"commitBy\":{\"replace\":true}}]` as the value for `queryParams` but `queryParams` cannot be an Array');\n }\n\n ['@test handle route names that clash with Object.prototype properties'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('constructor');\n });\n\n this.add('route:constructor', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n\n return this.visit('/').then(() => {\n this.transitionTo('constructor', { queryParams: { foo: '999' } });\n let controller = this.getController('constructor');\n assert.equal((0, _metal.get)(controller, 'foo'), '999');\n });\n }\n });\n});","enifed('ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test', ['@ember/controller', '@ember/-internals/runtime', '@ember/-internals/routing', '@ember/runloop', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _runtime, _routing, _runloop, _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 queryParamsStickyTest1(urlPrefix) {\n let assert = this.assert;\n\n assert.expect(14);\n\n return this.boot().then(() => {\n (0, _runloop.run)(this.$link1, 'click');\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n\n this.setAndFlush(this.controller, 'q', 'lol');\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 (0, _runloop.run)(this.$link2, 'click');\n\n assert.equal(this.controller.get('q'), 'wat');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\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\n queryParamsStickyTest2(urlPrefix) {\n let assert = this.assert;\n\n assert.expect(24);\n\n return this.boot().then(() => {\n this.expectedModelHookParams = { id: 'a-1', q: 'lol', z: 0 };\n this.transitionTo(`${urlPrefix}/a-1?q=lol`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-1' });\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\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 0 };\n this.transitionTo(`${urlPrefix}/a-2?q=lol`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' }, \"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\n this.expectedModelHookParams = { id: 'a-3', q: 'lol', z: 123 };\n this.transitionTo(`${urlPrefix}/a-3?q=lol&z=123`);\n\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\n queryParamsStickyTest3(urlPrefix, articleLookup) {\n let assert = this.assert;\n\n assert.expect(32);\n\n this.addTemplate('application', `{{#each articles as |a|}} {{link-to 'Article' '${articleLookup}' a.id id=a.id}} {{/each}}`);\n\n return this.boot().then(() => {\n this.expectedModelHookParams = { id: 'a-1', q: 'wat', z: 0 };\n this.transitionTo(articleLookup, 'a-1');\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-1' });\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\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 0 };\n this.transitionTo(articleLookup, 'a-2', { queryParams: { q: 'lol' } });\n\n assert.deepEqual(this.controller.get('model'), { id: '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`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n this.expectedModelHookParams = { id: 'a-3', q: 'hay', z: 0 };\n this.transitionTo(articleLookup, 'a-3', { queryParams: { q: 'hay' } });\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-3' });\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\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 1 };\n this.transitionTo(articleLookup, 'a-2', { queryParams: { z: 1 } });\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\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\n queryParamsStickyTest4(urlPrefix, articleLookup) {\n let assert = this.assert;\n\n assert.expect(24);\n\n this.setupApplication();\n\n this.reopenController(articleLookup, {\n queryParams: { q: { scope: 'controller' } }\n });\n\n return this.visitApplication().then(() => {\n (0, _runloop.run)(this.$link1, 'click');\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n\n this.setAndFlush(this.controller, 'q', 'lol');\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\n (0, _runloop.run)(this.$link2, 'click');\n\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), { 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\n this.expectedModelHookParams = { id: 'a-3', q: 'haha', z: 123 };\n this.transitionTo(`${urlPrefix}/a-3?q=haha&z=123`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-3' });\n assert.equal(this.controller.get('q'), 'haha');\n assert.equal(this.controller.get('z'), 123);\n\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\n this.setAndFlush(this.controller, 'q', 'woot');\n\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\n queryParamsStickyTest5(urlPrefix, commentsLookupKey) {\n let assert = this.assert;\n\n assert.expect(12);\n\n return this.boot().then(() => {\n this.transitionTo(commentsLookupKey, 'a-1');\n\n let commentsCtrl = this.getController(commentsLookupKey);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n\n this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n\n this.setAndFlush(commentsCtrl, 'page', 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n\n this.transitionTo(commentsLookupKey, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-2/comments`);\n\n this.transitionTo(commentsLookupKey, 'a-1');\n assert.equal(commentsCtrl.get('page'), 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n });\n }\n\n queryParamsStickyTest6(urlPrefix, articleLookup, commentsLookup) {\n let assert = this.assert;\n\n assert.expect(13);\n\n this.setupApplication();\n\n this.reopenRoute(articleLookup, {\n resetController(controller, isExiting) {\n this.controllerFor(commentsLookup).set('page', 1);\n if (isExiting) {\n controller.set('q', 'imdone');\n }\n }\n });\n\n this.addTemplate('about', `{{link-to 'A' '${commentsLookup}' 'a-1' id='one'}} {{link-to 'B' '${commentsLookup}' 'a-2' id='two'}}`);\n\n return this.visitApplication().then(() => {\n this.transitionTo(commentsLookup, 'a-1');\n\n let commentsCtrl = this.getController(commentsLookup);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n\n this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n\n this.transitionTo(commentsLookup, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n assert.equal(this.controller.get('q'), 'wat');\n\n this.transitionTo(commentsLookup, 'a-1');\n\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n assert.equal(commentsCtrl.get('page'), 1);\n\n 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', { path: '/a/:id' }, function () {\n this.route('comments', { resetNamespace: true });\n });\n this.route('about');\n });\n\n let articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { id: 'a-3' }]);\n\n this.add('controller:application', _controller.default.extend({\n articles\n }));\n\n let self = this;\n let 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 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\n this.add('controller:comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each articles as |a|}} 1{{link-to 'Article' 'article' a id=a.id}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n\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\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', { path: '/a/:id' }, function () {\n this.route('comments');\n });\n });\n this.route('about');\n });\n\n let site_articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { id: 'a-3' }]);\n\n this.add('controller:application', _controller.default.extend({\n articles: site_articles\n }));\n\n let self = this;\n let 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 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\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each articles as |a|}} {{link-to 'Article' 'site.article' a id=a.id}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n\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\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', { path: '/site/:site_id' }, function () {\n this.route('article', { path: '/a/:article_id' }, function () {\n this.route('comments');\n });\n });\n });\n\n let sites = (0, _runtime.A)([{ id: 's-1' }, { id: 's-2' }, { id: 's-3' }]);\n let site_articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { 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 let ret = [];\n let siteArticles = this.siteArticles;\n let 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 let self = this;\n let 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 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 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\n this.add('controller:site.article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: ['page'],\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each allSitesAllArticles as |a|}} {{#link-to 'site.article' a.site_id a.article_id id=a.id}}Article [{{a.site_id}}] [{{a.article_id}}]{{/link-to}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\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\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\n this.site_controller = this.getController('site');\n this.article_controller = this.getController('site.article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"](assert) {\n assert.expect(59);\n\n return this.boot().then(() => {\n (0, _runloop.run)(this.links['s-1-a-1'], 'click');\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\n this.assertCurrentPath('/site/s-1/a/a-1');\n\n this.setAndFlush(this.article_controller, 'q', 'lol');\n\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\n this.setAndFlush(this.site_controller, 'country', 'us');\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 (0, _runloop.run)(this.links['s-1-a-2'], 'click');\n\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'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\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 (0, _runloop.run)(this.links['s-2-a-2'], 'click');\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.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\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\n [\"@test query params have 'model' stickiness by default (url changes)\"](assert) {\n assert.expect(88);\n\n return this.boot().then(() => {\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-1/a/a-1?q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' }, \"site controller's model is s-1\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' }, \"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\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-2/a/a-1?country=us&q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' }, \"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\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-2/a/a-2?country=us&q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' }, \"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\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n this.transitionTo('/site/s-2/a/a-3?country=us&q=lol&z=123');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' }, \"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\n this.expectedSiteModelHookParams = { site_id: 's-3', country: 'nz' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n this.transitionTo('/site/s-3/a/a-3?country=nz&q=lol&z=123');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-3' }, \"site controller's model is s-3\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' }, \"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\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"](assert) {\n assert.expect(118);\n\n return this.boot().then(() => {\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'wat',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-1');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\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\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: { q: 'lol' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\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\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-3', {\n queryParams: { q: 'hay' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' });\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\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: { z: 1 }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\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\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n this.transitionTo('site.article', 's-2', 'a-2', {\n queryParams: { country: 'us' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: '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'), 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\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'yeah',\n z: 0\n };\n this.transitionTo('site.article', 's-2', 'a-1', {\n queryParams: { q: 'yeah' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\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\n this.expectedSiteModelHookParams = { site_id: 's-3', country: 'nz' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 3\n };\n this.transitionTo('site.article', 's-3', 'a-3', {\n queryParams: { country: 'nz', z: 3 }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-3' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' });\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});","enifed('ember/tests/routing/query_params_test/overlapping_query_params_test', ['@ember/controller', '@ember/-internals/routing', '@ember/runloop', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _routing, _runloop, _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\n return this.visit('/parent/child');\n }\n\n ['@test can remap same-named qp props'](assert) {\n assert.expect(7);\n\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n let parentController = this.getController('parent');\n let parentChildController = this.getController('parent.child');\n\n this.setAndFlush(parentController, 'page', 2);\n this.assertCurrentPath('/parent/child?parentPage=2');\n this.setAndFlush(parentController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n\n this.setAndFlush(parentChildController, 'page', 2);\n this.assertCurrentPath('/parent/child?childPage=2');\n this.setAndFlush(parentChildController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n\n (0, _runloop.run)(() => {\n parentController.set('page', 2);\n parentChildController.set('page', 2);\n });\n\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n\n (0, _runloop.run)(() => {\n parentController.set('page', 1);\n parentChildController.set('page', 1);\n });\n\n this.assertCurrentPath('/parent/child');\n });\n }\n\n ['@test query params can be either controller property or url key'](assert) {\n assert.expect(3);\n\n this.setMappedQPController('parent');\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n });\n }\n\n ['@test query param matching a url key and controller property'](assert) {\n assert.expect(3);\n\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'index', 'page');\n\n return this.setupBase().then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n\n this.transitionTo('parent.child', {\n queryParams: { index: 2, page: 2 }\n });\n this.assertCurrentPath('/parent/child?page=2&parentPage=2');\n });\n }\n\n ['@test query param matching same property on two controllers use the urlKey higher in the chain'](assert) {\n assert.expect(4);\n\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n\n return this.setupBase().then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n\n this.transitionTo('parent.child', {\n queryParams: { childPage: 2, page: 2 }\n });\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n\n this.transitionTo('parent.child', {\n queryParams: { childPage: 3, parentPage: 4 }\n });\n this.assertCurrentPath('/parent/child?childPage=3&parentPage=4');\n });\n }\n\n ['@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 let parentController = _controller.default.extend({\n queryParams: { page: 'page' }\n });\n this.add('controller:parent', parentController);\n this.add('route:parent.child', _routing.Route.extend({ controllerName: 'parent' }));\n\n return this.setupBase('/parent').then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?page=2');\n });\n }\n ['@test query params in the same route hierarchy with the same url key get auto-scoped'](assert) {\n assert.expect(1);\n\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child');\n\n expectAssertion(() => {\n this.setupBase();\n }, \"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 ['@test Support shared but overridable mixin pattern'](assert) {\n assert.expect(7);\n\n let HasPage = _metal.Mixin.create({\n queryParams: 'page',\n page: 1\n });\n\n this.add('controller:parent', _controller.default.extend(HasPage, {\n queryParams: { page: 'yespage' }\n }));\n\n this.add('controller:parent.child', _controller.default.extend(HasPage));\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n let parentController = this.getController('parent');\n let parentChildController = this.getController('parent.child');\n\n 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\n 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});","enifed('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 let fetchedHandlers = this.fetchedHandlers = [];\n\n return {\n location: 'test',\n\n init() {\n this._super(...arguments);\n this._seenHandlers = Object.create(null);\n this._handlerPromises = Object.create(null);\n },\n\n setupRouter() {\n this._super(...arguments);\n let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this;\n let getRoute = this._routerMicrolib.getRoute;\n\n this._routerMicrolib.getRoute = function (routeName) {\n fetchedHandlers.push(routeName);\n\n // Cache the returns so we don't have more than one Promise for a\n // given handler.\n return handlerPromises[routeName] || (handlerPromises[routeName] = new _runtime.RSVP.Promise(resolve => {\n setTimeout(() => {\n let handler = getRoute(routeName);\n\n seenHandlers[routeName] = handler;\n\n resolve(handler);\n }, 10);\n }));\n };\n },\n\n _getQPMeta(routeInfo) {\n let handler = this._seenHandlers[routeInfo.name];\n if (handler) {\n return (0, _metal.get)(handler, '_qp');\n }\n }\n };\n }\n\n ['@test can render a link to an asynchronously loaded route without fetching the route'](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n });\n\n this.setSingleQPController('post');\n\n let setupAppTemplate = () => {\n this.addTemplate('application', `\n {{link-to 'Post' 'post' 1337 (query-params foo='bar') class='post-link is-1337'}}\n {{link-to 'Post' 'post' 7331 (query-params foo='boo') class='post-link is-7331'}}\n {{outlet}}\n `);\n };\n\n setupAppTemplate();\n\n return this.visitAndAssert('/').then(() => {\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\n ['@test can transitionTo to an asynchronously loaded route with simple query params'](assert) {\n assert.expect(6);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n this.route('posts');\n });\n\n this.setSingleQPController('post');\n\n let postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n\n return this.transitionTo('posts').then(() => {\n this.assertCurrentPath('/posts');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: { foo: 'boo' }\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: { foo: 'bar' }\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\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n });\n\n this.setSingleQPController('post', 'comments', []);\n\n let postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n return this.transitionTo('post', 1337, {\n queryParams: { comments: [1, 2] }\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\n this.router.map(function () {\n this.route('post', { path: '/post/:id' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n\n let postController;\n let postIndexController;\n\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n\n return this.transitionTo('post.index', 1337, {\n queryParams: { note: 6, foo: 'boo' }\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: { foo: 'bar' }\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\n this.router.map(function () {\n this.route('post', { path: '/post/:id' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n\n let postController;\n let postIndexController;\n\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n\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\n this.router.map(function () {\n this.route('example');\n });\n\n this.addTemplate('application', \"{{link-to 'Example' 'example' (query-params foo=undefined) id='the-link'}}\");\n\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n\n this.add('route:example', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: undefined });\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n\n return this.transitionTo('example', {\n queryParams: { foo: undefined }\n }).then(() => {\n this.assertCurrentPath('/example');\n });\n });\n }\n });\n});","enifed('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\n this.addTemplate(routeName, \"{{link-to 'index' 'index' id='index-link'}}\");\n\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: ['foo'],\n foo: 'wat'\n }));\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});","enifed('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', { path: '/' });\n this.route('dashboard');\n });\n\n this.add('service:filters', _service.default.extend({\n shared: true\n }));\n\n this.add('controller:home', _controller.default.extend({\n filters: (0, _service.inject)()\n }));\n\n this.add('controller:dashboard', _controller.default.extend({\n filters: (0, _service.inject)(),\n queryParams: [{ 'filters.shared': 'shared' }]\n }));\n\n this.addTemplate('application', `{{link-to 'Home' 'home' }}
    {{outlet}}
    `);\n this.addTemplate('home', `{{link-to 'Dashboard' 'dashboard' }}{{input type=\"checkbox\" id='filters-checkbox' checked=(mut filters.shared) }}`);\n this.addTemplate('dashboard', `{{link-to 'Home' 'home' }}`);\n }\n visitApplication() {\n return this.visit('/');\n }\n\n ['@test can modify shared state before transition'](assert) {\n assert.expect(1);\n\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox');\n\n // click the checkbox once to set filters.shared to false\n (0, _runloop.run)(this.$input, 'click');\n\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\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox');\n\n // click the checkbox twice to set filters.shared to false and back to true\n (0, _runloop.run)(this.$input, 'click');\n (0, _runloop.run)(this.$input, 'click');\n\n return this.visit('/dashboard').then(() => {\n assert.ok(true, 'expecting navigating to dashboard to succeed');\n });\n });\n }\n });\n});","enifed('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\n let ret = this.router.map(function () {\n this.route('hello');\n });\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\n this.addTemplate('hello', 'Hello!');\n this.addTemplate('goodbye', 'Goodbye!');\n\n this.router.map(function () {\n this.route('hello');\n });\n\n this.router.map(function () {\n this.route('goodbye');\n });\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});","enifed('ember/tests/routing/router_service_test/basic_test', ['@ember/-internals/routing', '@ember/-internals/metal', 'internal-test-helpers', '@ember/canary-features'], function (_routing, _metal, _internalTestHelpers, _canaryFeatures) {\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 if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.expect(6);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/').then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName, params, paramNames, queryParams } = 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 }\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.index');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set for child route'](assert) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.expect(6);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/child').then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName, params, paramNames, queryParams } = 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 }\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set after transition'](assert) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.expect(5);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/child').then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n }\n\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set on each transition'](assert) {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n assert.expect(9);\n } else {\n assert.expect(3);\n }\n\n return this.visit('/child').then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n\n return this.visit('/sister');\n }).then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n\n return this.visit('/brother');\n }).then(() => {\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.brother');\n assert.equal(localName, 'brother');\n }\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\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\n this.add('route:parent.index', _routing.Route.extend({\n init() {\n this._super();\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\n return this.visit('/').then(() => {\n let location = this.routerService.get('location');\n assert.ok(location);\n assert.ok(location instanceof _routing.NoneLocation);\n });\n }\n });\n});","enifed('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', '@ember/canary-features'], function (_service, _computed, _glimmer, _routing, _metal, _internalTestHelpers, _runtime, _canaryFeatures) {\n 'use strict';\n\n let results = [];\n let ROUTE_NAMES = ['index', 'child', 'sister', 'brother', 'loading'];\n\n let InstrumentedRoute = _routing.Route.extend({\n routerService: (0, _service.inject)('router'),\n\n beforeModel() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'beforeModel', service.get('currentURL')]);\n },\n\n model() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'model', service.get('currentURL')]);\n return new _runtime.RSVP.Promise(resolve => {\n setTimeout(resolve, 200);\n });\n },\n\n afterModel() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'afterModel', service.get('currentURL')]);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service - currentURL | currentRouteName', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n\n results = [];\n\n ROUTE_NAMES.forEach(name => {\n let routeName = `parent.${name}`;\n this.add(`route:${routeName}`, InstrumentedRoute.extend());\n this.addTemplate(routeName, '{{current-url}}');\n });\n\n let CurrenURLComponent = _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n currentURL: (0, _computed.readOnly)('routerService.currentURL'),\n currentRouteName: (0, _computed.readOnly)('routerService.currentRouteName')\n });\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n CurrenURLComponent.reopen({\n currentRoute: (0, _computed.readOnly)('routerService.currentRoute')\n });\n }\n\n this.addComponent('current-url', {\n ComponentClass: CurrenURLComponent,\n template: _canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE ? '{{currentURL}}-{{currentRouteName}}-{{currentRoute.name}}' : '{{currentURL}}-{{currentRouteName}}'\n });\n }\n\n ['@test RouterService#currentURL is correctly set for top level route'](assert) {\n assert.expect(1);\n\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\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\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\n return this.visit('/child').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n\n return this.visit('/sister');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/sister');\n\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 lifecycle hooks'](assert) {\n assert.expect(2);\n\n return this.visit('/').then(() => {\n assert.deepEqual(results, [[null, 'beforeModel', null], [null, 'model', null], ['parent.loading', 'afterModel', '/']]);\n\n results = [];\n\n return this.visit('/child');\n }).then(() => {\n assert.deepEqual(results, [['parent.index', 'beforeModel', '/'], ['parent.index', 'model', '/'], ['parent.loading', 'afterModel', '/child']]);\n });\n }\n\n ['@test RouterService#currentURL is correctly set with component after consecutive visits'](assert) {\n assert.expect(3);\n\n return this.visit('/').then(() => {\n let text = '/-parent.index';\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n text = '/-parent.index-parent.index';\n }\n this.assertText(text);\n\n return this.visit('/child');\n }).then(() => {\n let text = '/child-parent.child';\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n text = '/child-parent.child-parent.child';\n }\n this.assertText(text);\n\n return this.visit('/');\n }).then(() => {\n let text = '/-parent.index';\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\n text = '/-parent.index-parent.index';\n }\n this.assertText(text);\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/events_test', ['internal-test-helpers', '@ember/canary-features', '@ember/service', '@ember/-internals/routing'], function (_internalTestHelpers, _canaryFeatures, _service, _routing) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\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.inject)('router'),\n init() {\n this._super(...arguments);\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\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 return this.visit('/');\n }\n\n '@test subsequent visits'(assert) {\n assert.expect(24);\n let toParent = true;\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\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\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 return this.visit('/child').then(() => {\n toParent = false;\n return this.routerService.transitionTo('parent.sister');\n });\n }\n\n '@test redirection with `transitionTo`'(assert) {\n assert.expect(8);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.child');\n }\n }));\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\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\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 return this.visit('/');\n }\n\n '@test redirection with `replaceWith`'(assert) {\n assert.expect(8);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.child');\n }\n }));\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\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\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 return this.visit('/');\n }\n\n '@test nested redirection with `transitionTo`'(assert) {\n assert.expect(11);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\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 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\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 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(11);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\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 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\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 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 let didAbort = false;\n let toChild = false;\n\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.inject)('router'),\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\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 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 let initial = true;\n let addQP = false;\n let removeQP = false;\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, { a: 'true' });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'true' });\n assert.deepEqual(transition.to.queryParams, { a: 'false', b: 'b' });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'false', b: 'b' });\n assert.deepEqual(transition.to.queryParams, { a: 'false' });\n } else {\n assert.ok(false, 'never');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, { a: 'true' });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'true' });\n assert.deepEqual(transition.to.queryParams, { a: 'false', b: 'b' });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'false', b: 'b' });\n assert.deepEqual(transition.to.queryParams, { a: 'false' });\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(6);\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n this.transitionTo('/sister?a=a');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\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, { a: 'a' });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n });\n }\n }));\n\n return this.visit('/child');\n }\n '@test query param redirects with `replaceWith`'(assert) {\n assert.expect(6);\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n this.replaceWith('/sister?a=a');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\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, { a: 'a' });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n });\n }\n }));\n\n return this.visit('/child');\n }\n\n '@test params'(assert) {\n assert.expect(14);\n\n let inital = true;\n\n this.add('route:dynamic', _routing.Route.extend({\n model(params) {\n if (inital) {\n assert.deepEqual(params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(params, { dynamic_id: '1' });\n }\n return params;\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'dynamic');\n if (inital) {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, { 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 if (inital) {\n assert.deepEqual(transition.to.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.to.params, { dynamic_id: '1' });\n }\n });\n }\n }));\n\n return this.visit('/dynamic/123').then(() => {\n inital = false;\n return this.routerService.transitionTo('dynamic', 1);\n });\n }\n\n '@test nested params'(assert) {\n assert.expect(30);\n let initial = true;\n\n this.add('route:dynamicWithChild', _routing.Route.extend({\n model(params) {\n if (initial) {\n assert.deepEqual(params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(params, { dynamic_id: '456' });\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, { child_id: '456' });\n return params.child_id;\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\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, { child_id: '456' });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n if (initial) {\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.from.attributes, '456');\n assert.deepEqual(transition.from.parent.attributes, '123');\n assert.deepEqual(transition.to.parent.params, { 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, { child_id: '456' });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n if (initial) {\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '123' });\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, { dynamic_id: '456' });\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 (0, _internalTestHelpers.moduleFor)('Router Service - deprecated events', class extends _internalTestHelpers.RouterTestCase {\n '@test willTransition events are deprecated'() {\n return this.visit('/').then(() => {\n expectDeprecation(() => {\n this.routerService['_router'].on('willTransition', () => {});\n }, 'You attempted to listen to the \"willTransition\" event which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n });\n }\n\n '@test willTransition events are deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('willTransition', () => {});\n }\n }));\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to listen to the \"willTransition\" event which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n }\n\n '@test didTransition events are deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('didTransition', () => {});\n }\n }));\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to listen to the \"didTransition\" event which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n }\n\n '@test other events are not deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('fixx', () => {});\n }\n }));\n expectNoDeprecation(() => {\n return this.visit('/');\n });\n }\n\n '@test didTransition events are deprecated'() {\n return this.visit('/').then(() => {\n expectDeprecation(() => {\n this.routerService['_router'].on('didTransition', () => {});\n }, 'You attempted to listen to the \"didTransition\" event which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n });\n }\n\n '@test other events are not deprecated'() {\n return this.visit('/').then(() => {\n expectNoDeprecation(() => {\n this.routerService['_router'].on('wat', () => {});\n });\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service: deprecated willTransition hook', class extends _internalTestHelpers.RouterTestCase {\n get routerOptions() {\n return {\n willTransition() {\n this._super(...arguments);\n // Overrides\n }\n };\n }\n\n '@test willTransition hook is deprecated'() {\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to override the \"willTransition\" method which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n }\n });\n (0, _internalTestHelpers.moduleFor)('Router Service: deprecated didTransition hook', class extends _internalTestHelpers.RouterTestCase {\n get routerOptions() {\n return {\n didTransition() {\n this._super(...arguments);\n // Overrides\n }\n };\n }\n\n '@test didTransition hook is deprecated'() {\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to override the \"didTransition\" method which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n }\n });\n }\n});","enifed('ember/tests/routing/router_service_test/isActive_test', ['@ember/controller', 'internal-test-helpers'], function (_controller, _internalTestHelpers) {\n 'use strict';\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\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\n let dynamicModel = { 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 ['@test RouterService#isActive does not eagerly instantiate controller for query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ 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 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\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\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({ sort: 'DESC' })));\n });\n }\n\n ['@test RouterService#isActive for simple route with array as query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ 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({ sort: 'descending' })));\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/recognize_test', ['internal-test-helpers', '@ember/-internals/routing', '@ember/canary-features'], function (_internalTestHelpers, _routing, _canaryFeatures) {\n 'use strict';\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE) {\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 let routeInfo = this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n assert.ok(routeInfo);\n let { name, localName, parent, child, params, queryParams, paramNames } = 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, { child_id: '1' });\n assert.deepEqual(queryParams, { a: 'b' });\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\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\n return this.visit('/app').then(() => {\n let routeInfo = this.routerService.recognize('/app/child/');\n assert.ok(routeInfo);\n let { name, localName, parent } = 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\n this.router.reopen({\n rootURL: '/app/'\n });\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 let 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 { name: 'dynamicWithChild', data: params.dynamic_id };\n }\n }));\n this.add('route:dynamicWithChild.child', _routing.Route.extend({\n model(params) {\n return { name: 'dynamicWithChild.child', data: params.child_id };\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 let {\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, { child_id: '1' });\n assert.deepEqual(queryParams, { a: 'b' });\n assert.deepEqual(paramNames, ['child_id']);\n assert.deepEqual(attributes, { name: 'dynamicWithChild.child', data: '1' });\n assert.deepEqual(parent.attributes, { name: 'dynamicWithChild', data: '123' });\n assert.deepEqual(parent.paramNames, ['dynamic_id']);\n assert.deepEqual(parent.params, { dynamic_id: '123' });\n });\n }\n\n '@test does not transition'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return { name: 'child', data: ['stuff'] };\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\n return this.visit('/app').then(() => {\n return this.routerService.recognizeAndLoad('/app/child/');\n }).then(routeInfoWithAttributes => {\n assert.ok(routeInfoWithAttributes);\n let { name, localName, parent } = 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\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\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return { name: 'child', data: ['stuff'] };\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\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n throw Error('Unhandled');\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});","enifed('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\n let testCase = this;\n testCase.state = [];\n\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 get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#replaceWith returns a Transition'](assert) {\n assert.expect(1);\n\n let transition;\n\n return this.visit('/').then(() => {\n transition = this.routerService.replaceWith('parent.child');\n\n assert.ok(transition instanceof _router_js.InternalTransition);\n\n return transition;\n });\n }\n\n ['@test RouterService#replaceWith with basic route replaces location'](assert) {\n assert.expect(1);\n\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\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\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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ 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});","enifed('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\n let testCase = this;\n testCase.state = [];\n\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 get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#transitionTo returns a Transition'](assert) {\n assert.expect(1);\n\n let transition;\n\n return this.visit('/').then(() => {\n transition = this.routerService.transitionTo('parent.child');\n\n assert.ok(transition instanceof _router_js.InternalTransition);\n\n return transition;\n });\n }\n\n ['@test RouterService#transitionTo with basic route updates location'](assert) {\n assert.expect(1);\n\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\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\n let componentInstance;\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('parent.sister');\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\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\n let componentInstance;\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('/sister');\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#transitionTo with dynamic segment'](assert) {\n assert.expect(3);\n\n let componentInstance;\n let dynamicModel = { id: 1, contents: 'much dynamicism' };\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addTemplate('dynamic', '{{model.contents}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', dynamicModel);\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\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\n ['@test RouterService#transitionTo with dynamic segment and model hook'](assert) {\n assert.expect(3);\n\n let componentInstance;\n let dynamicModel = { id: 1, 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\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', 1);\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\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\n ['@test RouterService#transitionTo with basic query params does not remove query param defaults'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ 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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort']\n }));\n\n let queryParams = this.buildQueryParams({ 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\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\n let queryParams = this.buildQueryParams({ 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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ 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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ 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});","enifed('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 let controllerName = `${(0, _string.capitalize)(name)}Controller`;\n\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 (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\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child');\n\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\n setupController(this.application, 'dynamic');\n\n let dynamicModel = { id: 1, contents: 'much dynamicism' };\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', dynamicModel);\n\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\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\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\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'foo'],\n sort: 'ASC'\n }));\n\n return this.visit('/child/?sort=DESC').then(() => {\n let controller = this.applicationInstance.lookup('controller:parent.child');\n assert.equal((0, _metal.get)(controller, 'sort'), 'DESC', 'sticky is set');\n\n let queryParams = this.buildQueryParams({ foo: 'derp' });\n let actual = this.routerService.urlFor('parent.child', queryParams);\n\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\n let queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\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\n let queryParams = this.buildQueryParams({ foo: null });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\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\n let queryParams = this.buildQueryParams({ foo: undefined });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\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\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\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\n let queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\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\n let queryParams = this.buildQueryParams({ foo: null });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\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\n let queryParams = this.buildQueryParams({ foo: undefined });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\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\n let expectedURL;\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child');\n\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\n let expectedURL;\n let dynamicModel = { 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\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\n let expectedURL;\n let actualURL;\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n\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\n let expectedURL;\n let actualURL;\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n let dynamicModel = { 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\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n\n assert.equal(expectedURL, actualURL);\n });\n }\n });\n});","enifed('ember/tests/routing/substates_test', ['@ember/-internals/runtime', '@ember/-internals/routing', 'internal-test-helpers'], function (_runtime, _routing, _internalTestHelpers) {\n 'use strict';\n\n let 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\n this.addTemplate('application', `
    {{outlet}}
    `);\n this.addTemplate('index', 'INDEX');\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n ['@test Slow promise from a child route of application enters nested loading state'](assert) {\n let turtleDeferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('turtle');\n });\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 this.addTemplate('turtle', 'TURTLE');\n this.addTemplate('loading', 'LOADING');\n\n let 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\n let text = this.$('#app').text();\n assert.equal(text, 'LOADING', `The Loading template is nested in application template's outlet`);\n\n turtleDeferred.resolve();\n return promise;\n }\n\n [`@test Slow promises returned from ApplicationRoute#model don't enter LoadingRoute`](assert) {\n let appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n assert.ok(false, `shouldn't get here`);\n }\n }));\n\n let promise = this.visit('/').then(() => {\n let text = this.$('#app').text();\n\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\n return promise;\n }\n\n [`@test Don't enter loading route unless either route or template defined`](assert) {\n let 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 this.addTemplate('dummy', 'DUMMY');\n\n return this.visit('/').then(() => {\n let promise = this.visit('/dummy').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n\n assert.ok(this.currentPath !== 'loading', `\n loading state not entered\n `);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Enter loading route only if loadingRoute is defined'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n\n this.add('route:dummy', _routing.Route.extend({\n model() {\n step(assert, 1, 'DummyRoute#model');\n return deferred.promise;\n }\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'LoadingRoute#setupController');\n }\n }));\n this.addTemplate('dummy', 'DUMMY');\n\n return this.visit('/').then(() => {\n let promise = this.visit('/dummy').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n\n assert.equal(this.currentPath, 'loading', `loading state entered`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter ApplicationLoadingRoute if present'](assert) {\n let appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n }));\n let loadingRouteEntered = false;\n this.add('route:application_loading', _routing.Route.extend({\n setupController() {\n loadingRouteEntered = true;\n }\n }));\n\n let 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\n return promise;\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter application_loading if template present'](assert) {\n let 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 let promise = this.visit('/').then(() => {\n let length = this.$('#toplevel-loading').length;\n text = this.$('#app').text();\n\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 let text = this.$('#toplevel-loading').text();\n\n assert.equal(text, 'TOPLEVEL LOADING', 'still loading the top level');\n appDeferred.resolve();\n\n return promise;\n }\n\n ['@test Prioritized substate entry works with preserved-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar.index', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', { path: '/bar' }, function () {});\n });\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 let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.bar.index fully loaded');\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Prioritized substate entry works with reset-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('bar_loading', 'BAR LOADING');\n this.addTemplate('bar.index', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', { path: '/bar', resetNamespace: true }, function () {});\n });\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 let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'bar.index fully loaded');\n });\n\n let text = this.$('#app').text();\n\n assert.equal(text, 'BAR LOADING', `foo.bar_loading was entered (as opposed to something likefoo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Prioritized loading substate entry works with preserved-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.bar has rendered');\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n }\n\n ['@test Prioritized error substate entry works with preserved-namespaec nested routes'](assert) {\n this.addTemplate('foo.bar_error', 'FOOBAR ERROR: {{model.msg}}');\n this.addTemplate('foo.bar', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\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 return this.visit('/').then(() => {\n return this.visit('/foo/bar').then(() => {\n let text = this.$('#app').text();\n assert.equal(text, 'FOOBAR ERROR: did it broke?', `foo.bar_error was entered (as opposed to something like foo/foo/bar_error)`);\n });\n });\n }\n ['@test Prioritized loading substate entry works with auto-generated index routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('foo.index_loading', 'FOO LOADING');\n this.addTemplate('foo.index', 'YAY');\n this.addTemplate('foo', '{{outlet}}');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n }));\n\n let promise = this.visit('/foo').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.index was rendered');\n });\n let text = this.$('#app').text();\n assert.equal(text, 'FOO LOADING', 'foo.index_loading was entered');\n\n deferred.resolve();\n\n return promise;\n }\n\n ['@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\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\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 this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n }));\n\n return this.visit('/').then(() => {\n return this.visit('/foo').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOO ERROR: did it broke?', 'foo.index_error was entered');\n });\n });\n }\n\n ['@test Rejected promises returned from ApplicationRoute transition into top-level application_error'](assert) {\n let reject = true;\n\n this.addTemplate('index', '
    INDEX
    ');\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n },\n model() {\n if (reject) {\n return _runtime.RSVP.reject({ msg: 'BAD NEWS BEARS' });\n } else {\n return {};\n }\n }\n }));\n\n this.addTemplate('application_error', `\n

    TOPLEVEL ERROR: {{model.msg}}

    \n `);\n\n return this.visit('/').then(() => {\n let text = this.$('#toplevel-error').text();\n assert.equal(text, 'TOPLEVEL ERROR: BAD NEWS BEARS', 'toplevel error rendered');\n reject = false;\n }).then(() => {\n return this.visit('/');\n }).then(() => {\n let text = this.$('#index').text();\n assert.equal(text, 'INDEX', 'the index route resolved');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Loading/Error Substates - nested routes', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n\n counter = 1;\n\n this.addTemplate('application', `
    {{outlet}}
    `);\n this.addTemplate('index', 'INDEX');\n this.addTemplate('grandma', 'GRANDMA {{outlet}}');\n this.addTemplate('mom', 'MOM');\n\n this.router.map(function () {\n this.route('grandma', function () {\n this.route('mom', { resetNamespace: true }, function () {\n this.route('sally');\n this.route('this-route-throws');\n });\n this.route('puppies');\n });\n this.route('memere', { path: '/memere/:seg' }, function () {});\n });\n\n this.visit('/');\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n ['@test ApplicationRoute#currentPath reflects loading state path'](assert) {\n let momDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('grandma.loading', 'GRANDMALOADING');\n\n this.add('route:mom', _routing.Route.extend({\n model() {\n return momDeferred.promise;\n }\n }));\n\n let promise = this.visit('/grandma/mom').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM', `Grandma.mom loaded text is displayed`);\n assert.equal(this.currentPath, 'grandma.mom.index', `currentPath reflects final state`);\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA GRANDMALOADING', `Grandma.mom loading text displayed`);\n\n assert.equal(this.currentPath, 'grandma.loading', `currentPath reflects loading state`);\n\n momDeferred.resolve();\n\n return promise;\n }\n\n [`@test Loading actions bubble to root but don't enter substates above pivot `](assert) {\n let sallyDeferred = _runtime.RSVP.defer();\n let 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 let promise = this.visit('/grandma/mom/sally');\n assert.equal(this.currentPath, 'index', 'Initial route fully loaded');\n\n sallyDeferred.resolve();\n\n promise.then(() => {\n assert.equal(this.currentPath, 'grandma.mom.sally', 'transition completed');\n\n let visit = this.visit('/grandma/puppies');\n assert.equal(this.currentPath, 'grandma.mom.sally', 'still in initial state because the only loading state is above the pivot route');\n\n return visit;\n }).then(() => {\n this.runTask(() => puppiesDeferred.resolve());\n\n assert.equal(this.currentPath, 'grandma.puppies', 'Finished transition');\n });\n\n return promise;\n }\n\n ['@test Default error event moves into nested route'](assert) {\n this.addTemplate('grandma.error', 'ERROR: {{model.msg}}');\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 actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally').then(() => {\n step(assert, 3, 'App finished loading');\n\n let text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA ERROR: did it broke?', 'error bubbles');\n assert.equal(this.currentPath, 'grandma.error', 'Initial route fully loaded');\n });\n }\n\n [`@test Non-bubbled errors that re-throw aren't swallowed`](assert) {\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n // returns undefined which is falsey\n throw err;\n }\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n\n return this.runLoopSettled();\n }\n\n [`@test Handled errors that re-throw aren't swallowed`](assert) {\n let handledError;\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 actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n this.transitionTo('mom.this-route-throws');\n\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 assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, `it broke`);\n\n return this.runLoopSettled();\n }\n\n ['@test errors that are bubbled are thrown at a higher level if not handled'](assert) {\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 actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg == 'did it broke?';\n }, 'Correct error was thrown');\n\n return this.runLoopSettled();\n }\n\n [`@test Handled errors that are thrown through rejection aren't swallowed`](assert) {\n let handledError;\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 actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n this.transitionTo('mom.this-route-throws');\n\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 assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n\n return this.runLoopSettled();\n }\n\n ['@test Default error events move into nested route, prioritizing more specifically named error routes - NEW'](assert) {\n this.addTemplate('grandma.error', 'ERROR: {{model.msg}}');\n this.addTemplate('mom_error', 'MOM ERROR: {{model.msg}}');\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 actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally').then(() => {\n step(assert, 3, 'Application finished booting');\n\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\n assert.equal(this.currentPath, 'grandma.mom_error', 'Initial route fully loaded');\n });\n }\n\n ['@test Slow promises waterfall on startup'](assert) {\n let grandmaDeferred = _runtime.RSVP.defer();\n let 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\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 setupController() {\n step(assert, 4, 'SallyRoute#setupController');\n }\n }));\n\n let promise = this.visit('/grandma/mom/sally').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM SALLY', `Sally template displayed`);\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'LOADING', `The loading template is nested in application template's outlet`);\n\n this.runTask(() => grandmaDeferred.resolve());\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM MOMLOADING', `Mom's child loading route is displayed due to sally's slow promise`);\n\n sallyDeferred.resolve();\n\n return promise;\n }\n ['@test Enter child loading state of pivot route'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('grandma.loading', 'GMONEYLOADING');\n\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 return this.visit('/grandma/mom/sally').then(() => {\n assert.equal(this.currentPath, 'grandma.mom.sally', 'Initial route fully loaded');\n\n let promise = this.visit('/grandma/puppies').then(() => {\n assert.equal(this.currentPath, 'grandma.puppies', 'Finished transition');\n });\n\n assert.equal(this.currentPath, 'grandma.loading', `in pivot route's child loading state`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n [`@test Error events that aren't bubbled don't throw application assertions`](assert) {\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 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 let handledError;\n\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 actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally');\n }\n\n ['@test Setting a query param during a slow transition should work'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('memere.loading', 'MMONEYLOADING');\n\n this.add('route:grandma', _routing.Route.extend({\n beforeModel: function () {\n this.transitionTo('memere', 1);\n }\n }));\n\n this.add('route:memere', _routing.Route.extend({\n queryParams: {\n test: { defaultValue: 1 }\n }\n }));\n\n this.add('route:memere.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n let promise = this.visit('/grandma').then(() => {\n assert.equal(this.currentPath, 'memere.index', 'Transition should be complete');\n });\n let memereController = this.getController('memere');\n\n assert.equal(this.currentPath, 'memere.loading', 'Initial route should be loading');\n\n memereController.set('test', 3);\n\n assert.equal(this.currentPath, 'memere.loading', 'Initial route should still be loading');\n\n assert.equal(memereController.get('test'), 3, 'Controller query param value should have changed');\n deferred.resolve();\n\n return promise;\n }\n });\n});","enifed('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\n this.addTemplate('application', 'hello world');\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.element, { content: 'hello world' });\n });\n }\n\n ['@test topmost template without wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\n this.addTemplate('application', 'hello world');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('hello world');\n });\n }\n });\n});","enifed('ember/tests/service_injection_test', ['@ember/-internals/owner', '@ember/controller', '@ember/service', '@ember/-internals/runtime', 'internal-test-helpers', '@ember/-internals/metal', '@ember/canary-features'], function (_owner, _controller, _service, _runtime, _internalTestHelpers, _metal, _canaryFeatures) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Service Injection', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected and is resolved'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend();\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n\n ['@test Service can be an object proxy and access owner in init GH#16484'](assert) {\n let serviceOwner;\n\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend(_runtime._ProxyMixin, {\n init() {\n this._super(...arguments);\n\n serviceOwner = (0, _owner.getOwner)(this);\n }\n });\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(instance => {\n let 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\n (0, _internalTestHelpers.moduleFor)('Service Injection with ES5 Getters', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected and is resolved without calling `get`'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend({\n name: (0, _metal.computed)(function () {\n return 'The service name';\n })\n });\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(() => {\n let 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\n if (_canaryFeatures.EMBER_MODULE_UNIFICATION) {\n (0, _internalTestHelpers.moduleFor)('Service Injection (MU)', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected with source and is resolved'](assert) {\n let source = 'controller:src/ui/routes/application/controller';\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source })\n }));\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source\n }, MyService);\n\n return this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n\n ['@test Services can be injected with same name, different source, and resolve different instances'](assert) {\n // This test implies that there is a file src/ui/routes/route-a/-services/my-service\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n // This test implies that there is a file src/ui/routes/route-b/-services/my-service\n let routeBSource = 'controller:src/ui/routes/route-b/controller';\n\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeBSource })\n }));\n\n let LocalLookupService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source: routeASource\n }, LocalLookupService);\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source: routeBSource\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof LocalLookupService, 'local lookup service is returned');\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n let serviceFromControllerB = controllerB.get('myService');\n assert.ok(serviceFromControllerB instanceof MyService, 'global service is returned');\n\n assert.notStrictEqual(serviceFromControllerA, serviceFromControllerB);\n });\n }\n\n ['@test Services can be injected with same name, different source, but same resolution result, and share an instance'](assert) {\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n let routeBSource = 'controller:src/ui/routes/route-b/controller';\n\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeBSource })\n }));\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service'\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof MyService);\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n assert.strictEqual(serviceFromControllerA, controllerB.get('myService'));\n });\n }\n\n /*\n * This test demonstrates a failure in the caching system of ember's\n * container around singletons and and local lookup. The local lookup\n * is cached and the global injection is then looked up incorrectly.\n *\n * The paractical rules of Ember's module unification config are such\n * that services cannot be locally looked up, thus this case is really\n * just a demonstration of what could go wrong if we permit arbitrary\n * configuration (such as a singleton type that has local lookup).\n */\n ['@test Services can be injected with same name, one with source one without, and share an instance'](assert) {\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service'\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof MyService, 'global service is returned');\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n let serviceFromControllerB = controllerB.get('myService');\n assert.ok(serviceFromControllerB instanceof MyService, 'global service is returned');\n\n assert.strictEqual(serviceFromControllerA, serviceFromControllerB);\n });\n }\n\n ['@test Service with namespace can be injected and is resolved'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-namespace::my-service')\n }));\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n namespace: 'my-namespace'\n }, MyService);\n\n this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n });\n }\n});","enifed('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\n this.router.map(function () {\n this.route('posts');\n });\n }\n teardown() {\n (0, _instrumentation.reset)();\n super.teardown();\n }\n\n ['@test Nodes without view instances are instrumented'](assert) {\n let called = false;\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n called = true;\n },\n after() {}\n });\n\n return this.visit('/').then(() => {\n assert.equal(this.textValue(), 'Index', 'It rendered the correct template');\n\n assert.ok(called, 'Instrumentation called on first render');\n called = false;\n\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});","enifed(\"ember/version\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = \"3.6.0\";\n});","enifed(\"handlebars\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n // File ignored in coverage tests via setting in .istanbul.yml\n /* Jison generated parser */\n var handlebars = function () {\n var parser = { trace: function trace() {},\n yy: {},\n symbols_: { \"error\": 2, \"root\": 3, \"program\": 4, \"EOF\": 5, \"program_repetition0\": 6, \"statement\": 7, \"mustache\": 8, \"block\": 9, \"rawBlock\": 10, \"partial\": 11, \"partialBlock\": 12, \"content\": 13, \"COMMENT\": 14, \"CONTENT\": 15, \"openRawBlock\": 16, \"rawBlock_repetition_plus0\": 17, \"END_RAW_BLOCK\": 18, \"OPEN_RAW_BLOCK\": 19, \"helperName\": 20, \"openRawBlock_repetition0\": 21, \"openRawBlock_option0\": 22, \"CLOSE_RAW_BLOCK\": 23, \"openBlock\": 24, \"block_option0\": 25, \"closeBlock\": 26, \"openInverse\": 27, \"block_option1\": 28, \"OPEN_BLOCK\": 29, \"openBlock_repetition0\": 30, \"openBlock_option0\": 31, \"openBlock_option1\": 32, \"CLOSE\": 33, \"OPEN_INVERSE\": 34, \"openInverse_repetition0\": 35, \"openInverse_option0\": 36, \"openInverse_option1\": 37, \"openInverseChain\": 38, \"OPEN_INVERSE_CHAIN\": 39, \"openInverseChain_repetition0\": 40, \"openInverseChain_option0\": 41, \"openInverseChain_option1\": 42, \"inverseAndProgram\": 43, \"INVERSE\": 44, \"inverseChain\": 45, \"inverseChain_option0\": 46, \"OPEN_ENDBLOCK\": 47, \"OPEN\": 48, \"mustache_repetition0\": 49, \"mustache_option0\": 50, \"OPEN_UNESCAPED\": 51, \"mustache_repetition1\": 52, \"mustache_option1\": 53, \"CLOSE_UNESCAPED\": 54, \"OPEN_PARTIAL\": 55, \"partialName\": 56, \"partial_repetition0\": 57, \"partial_option0\": 58, \"openPartialBlock\": 59, \"OPEN_PARTIAL_BLOCK\": 60, \"openPartialBlock_repetition0\": 61, \"openPartialBlock_option0\": 62, \"param\": 63, \"sexpr\": 64, \"OPEN_SEXPR\": 65, \"sexpr_repetition0\": 66, \"sexpr_option0\": 67, \"CLOSE_SEXPR\": 68, \"hash\": 69, \"hash_repetition_plus0\": 70, \"hashSegment\": 71, \"ID\": 72, \"EQUALS\": 73, \"blockParams\": 74, \"OPEN_BLOCK_PARAMS\": 75, \"blockParams_repetition_plus0\": 76, \"CLOSE_BLOCK_PARAMS\": 77, \"path\": 78, \"dataName\": 79, \"STRING\": 80, \"NUMBER\": 81, \"BOOLEAN\": 82, \"UNDEFINED\": 83, \"NULL\": 84, \"DATA\": 85, \"pathSegments\": 86, \"SEP\": 87, \"$accept\": 0, \"$end\": 1 },\n terminals_: { 2: \"error\", 5: \"EOF\", 14: \"COMMENT\", 15: \"CONTENT\", 18: \"END_RAW_BLOCK\", 19: \"OPEN_RAW_BLOCK\", 23: \"CLOSE_RAW_BLOCK\", 29: \"OPEN_BLOCK\", 33: \"CLOSE\", 34: \"OPEN_INVERSE\", 39: \"OPEN_INVERSE_CHAIN\", 44: \"INVERSE\", 47: \"OPEN_ENDBLOCK\", 48: \"OPEN\", 51: \"OPEN_UNESCAPED\", 54: \"CLOSE_UNESCAPED\", 55: \"OPEN_PARTIAL\", 60: \"OPEN_PARTIAL_BLOCK\", 65: \"OPEN_SEXPR\", 68: \"CLOSE_SEXPR\", 72: \"ID\", 73: \"EQUALS\", 75: \"OPEN_BLOCK_PARAMS\", 77: \"CLOSE_BLOCK_PARAMS\", 80: \"STRING\", 81: \"NUMBER\", 82: \"BOOLEAN\", 83: \"UNDEFINED\", 84: \"NULL\", 85: \"DATA\", 87: \"SEP\" },\n productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$\n /**/) {\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = yy.prepareProgram($$[$0]);\n break;\n case 3:\n this.$ = $$[$0];\n break;\n case 4:\n this.$ = $$[$0];\n break;\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n this.$ = $$[$0];\n break;\n case 7:\n this.$ = $$[$0];\n break;\n case 8:\n this.$ = $$[$0];\n break;\n case 9:\n this.$ = {\n type: 'CommentStatement',\n value: yy.stripComment($$[$0]),\n strip: yy.stripFlags($$[$0], $$[$0]),\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 10:\n this.$ = {\n type: 'ContentStatement',\n original: $$[$0],\n value: $$[$0],\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 11:\n this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 12:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };\n break;\n case 13:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);\n break;\n case 14:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);\n break;\n case 15:\n this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 16:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 17:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 18:\n this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };\n break;\n case 19:\n var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),\n program = yy.prepareProgram([inverse], $$[$0 - 1].loc);\n program.chained = true;\n\n this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };\n\n break;\n case 20:\n this.$ = $$[$0];\n break;\n case 21:\n this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };\n break;\n case 22:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 23:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 24:\n this.$ = {\n type: 'PartialStatement',\n name: $$[$0 - 3],\n params: $$[$0 - 2],\n hash: $$[$0 - 1],\n indent: '',\n strip: yy.stripFlags($$[$0 - 4], $$[$0]),\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 25:\n this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 26:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };\n break;\n case 27:\n this.$ = $$[$0];\n break;\n case 28:\n this.$ = $$[$0];\n break;\n case 29:\n this.$ = {\n type: 'SubExpression',\n path: $$[$0 - 3],\n params: $$[$0 - 2],\n hash: $$[$0 - 1],\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 30:\n this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 31:\n this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 32:\n this.$ = yy.id($$[$0 - 1]);\n break;\n case 33:\n this.$ = $$[$0];\n break;\n case 34:\n this.$ = $$[$0];\n break;\n case 35:\n this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 36:\n this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };\n break;\n case 37:\n this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };\n break;\n case 38:\n this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };\n break;\n case 39:\n this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };\n break;\n case 40:\n this.$ = $$[$0];\n break;\n case 41:\n this.$ = $$[$0];\n break;\n case 42:\n this.$ = yy.preparePath(true, $$[$0], this._$);\n break;\n case 43:\n this.$ = yy.preparePath(false, $$[$0], this._$);\n break;\n case 44:\n $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];\n break;\n case 45:\n this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];\n break;\n case 46:\n this.$ = [];\n break;\n case 47:\n $$[$0 - 1].push($$[$0]);\n break;\n case 48:\n this.$ = [$$[$0]];\n break;\n case 49:\n $$[$0 - 1].push($$[$0]);\n break;\n case 50:\n this.$ = [];\n break;\n case 51:\n $$[$0 - 1].push($$[$0]);\n break;\n case 58:\n this.$ = [];\n break;\n case 59:\n $$[$0 - 1].push($$[$0]);\n break;\n case 64:\n this.$ = [];\n break;\n case 65:\n $$[$0 - 1].push($$[$0]);\n break;\n case 70:\n this.$ = [];\n break;\n case 71:\n $$[$0 - 1].push($$[$0]);\n break;\n case 78:\n this.$ = [];\n break;\n case 79:\n $$[$0 - 1].push($$[$0]);\n break;\n case 82:\n this.$ = [];\n break;\n case 83:\n $$[$0 - 1].push($$[$0]);\n break;\n case 86:\n this.$ = [];\n break;\n case 87:\n $$[$0 - 1].push($$[$0]);\n break;\n case 90:\n this.$ = [];\n break;\n case 91:\n $$[$0 - 1].push($$[$0]);\n break;\n case 94:\n this.$ = [];\n break;\n case 95:\n $$[$0 - 1].push($$[$0]);\n break;\n case 98:\n this.$ = [$$[$0]];\n break;\n case 99:\n $$[$0 - 1].push($$[$0]);\n break;\n case 100:\n this.$ = [$$[$0]];\n break;\n case 101:\n $$[$0 - 1].push($$[$0]);\n break;\n }\n },\n table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],\n defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] },\n parseError: function parseError(str, hash) {\n throw new Error(str);\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = \"\",\n yylineno = 0,\n yyleng = 0,\n recovering = 0;\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == \"undefined\") this.lexer.yylloc = {};\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === \"function\") this.parseError = this.yy.parseError;\n function lex() {\n var token;\n token = self.lexer.lex() || 1;\n if (typeof token !== \"number\") {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n preErrorSymbol,\n state,\n action,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == \"undefined\") {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === \"undefined\" || !action.length || !action[0]) {\n var errStr = \"\";\n if (!recovering) {\n expected = [];\n for (p in table[state]) if (this.terminals_[p] && p > 2) {\n expected.push(\"'\" + this.terminals_[p] + \"'\");\n }\n if (this.lexer.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + (this.terminals_[symbol] || symbol) + \"'\";\n } else {\n errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1 ? \"end of input\" : \"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n }\n this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });\n }\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) recovering--;\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n if (typeof r !== \"undefined\") {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* Jison generated lexer */\n var lexer = function () {\n var lexer = { EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n setInput: function (input) {\n this._input = input;\n this._more = this._less = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };\n if (this.options.ranges) this.yylloc.range = [0, 0];\n this.offset = 0;\n return this;\n },\n input: function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) this.yylloc.range[1]++;\n\n this._input = this._input.slice(1);\n return ch;\n },\n unput: function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) this.yylineno -= lines.length - 1;\n var r = this.yylloc.range;\n\n this.yylloc = { first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n return this;\n },\n more: function () {\n this._more = true;\n return this;\n },\n less: function (n) {\n this.unput(this.match.slice(n));\n },\n pastInput: function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\\n/g, \"\");\n },\n upcomingInput: function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n showPosition: function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n next: function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) this.done = true;\n\n var token, match, tempMatch, index, lines;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (!this.options.flex) break;\n }\n }\n if (match) {\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) this.yylineno += lines.length;\n this.yylloc = { first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) this.done = false;\n if (token) return token;else return;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), { text: \"\", token: null, line: this.yylineno });\n }\n },\n lex: function lex() {\n var r = this.next();\n if (typeof r !== 'undefined') {\n return r;\n } else {\n return this.lex();\n }\n },\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n popState: function popState() {\n return this.conditionStack.pop();\n },\n _currentRules: function _currentRules() {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n },\n topState: function () {\n return this.conditionStack[this.conditionStack.length - 2];\n },\n pushState: function begin(condition) {\n this.begin(condition);\n } };\n lexer.options = {};\n lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START\n /**/) {\n\n function strip(start, end) {\n return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);\n }\n switch ($avoiding_name_collisions) {\n case 0:\n if (yy_.yytext.slice(-2) === \"\\\\\\\\\") {\n strip(0, 1);\n this.begin(\"mu\");\n } else if (yy_.yytext.slice(-1) === \"\\\\\") {\n strip(0, 1);\n this.begin(\"emu\");\n } else {\n this.begin(\"mu\");\n }\n if (yy_.yytext) return 15;\n\n break;\n case 1:\n return 15;\n break;\n case 2:\n this.popState();\n return 15;\n\n break;\n case 3:\n this.begin('raw');return 15;\n break;\n case 4:\n this.popState();\n // Should be using `this.topState()` below, but it currently\n // returns the second top instead of the first top. Opened an\n // issue about it at https://github.com/zaach/jison/issues/291\n if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {\n return 15;\n } else {\n yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);\n return 'END_RAW_BLOCK';\n }\n\n break;\n case 5:\n return 15;\n break;\n case 6:\n this.popState();\n return 14;\n\n break;\n case 7:\n return 65;\n break;\n case 8:\n return 68;\n break;\n case 9:\n return 19;\n break;\n case 10:\n this.popState();\n this.begin('raw');\n return 23;\n\n break;\n case 11:\n return 55;\n break;\n case 12:\n return 60;\n break;\n case 13:\n return 29;\n break;\n case 14:\n return 47;\n break;\n case 15:\n this.popState();return 44;\n break;\n case 16:\n this.popState();return 44;\n break;\n case 17:\n return 34;\n break;\n case 18:\n return 39;\n break;\n case 19:\n return 51;\n break;\n case 20:\n return 48;\n break;\n case 21:\n this.unput(yy_.yytext);\n this.popState();\n this.begin('com');\n\n break;\n case 22:\n this.popState();\n return 14;\n\n break;\n case 23:\n return 48;\n break;\n case 24:\n return 73;\n break;\n case 25:\n return 72;\n break;\n case 26:\n return 72;\n break;\n case 27:\n return 87;\n break;\n case 28:\n // ignore whitespace\n break;\n case 29:\n this.popState();return 54;\n break;\n case 30:\n this.popState();return 33;\n break;\n case 31:\n yy_.yytext = strip(1, 2).replace(/\\\\\"/g, '\"');return 80;\n break;\n case 32:\n yy_.yytext = strip(1, 2).replace(/\\\\'/g, \"'\");return 80;\n break;\n case 33:\n return 85;\n break;\n case 34:\n return 82;\n break;\n case 35:\n return 82;\n break;\n case 36:\n return 83;\n break;\n case 37:\n return 84;\n break;\n case 38:\n return 81;\n break;\n case 39:\n return 75;\n break;\n case 40:\n return 77;\n break;\n case 41:\n return 72;\n break;\n case 42:\n yy_.yytext = yy_.yytext.replace(/\\\\([\\\\\\]])/g, '$1');return 72;\n break;\n case 43:\n return 'INVALID';\n break;\n case 44:\n return 5;\n break;\n }\n };\n lexer.rules = [/^(?:[^\\x00]*?(?=(\\{\\{)))/, /^(?:[^\\x00]+)/, /^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/, /^(?:\\{\\{\\{\\{(?=[^\\/]))/, /^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/, /^(?:[^\\x00]*?(?=(\\{\\{\\{\\{)))/, /^(?:[\\s\\S]*?--(~)?\\}\\})/, /^(?:\\()/, /^(?:\\))/, /^(?:\\{\\{\\{\\{)/, /^(?:\\}\\}\\}\\})/, /^(?:\\{\\{(~)?>)/, /^(?:\\{\\{(~)?#>)/, /^(?:\\{\\{(~)?#\\*?)/, /^(?:\\{\\{(~)?\\/)/, /^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\^)/, /^(?:\\{\\{(~)?\\s*else\\b)/, /^(?:\\{\\{(~)?\\{)/, /^(?:\\{\\{(~)?&)/, /^(?:\\{\\{(~)?!--)/, /^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/, /^(?:\\{\\{(~)?\\*?)/, /^(?:=)/, /^(?:\\.\\.)/, /^(?:\\.(?=([=~}\\s\\/.)|])))/, /^(?:[\\/.])/, /^(?:\\s+)/, /^(?:\\}(~)?\\}\\})/, /^(?:(~)?\\}\\})/, /^(?:\"(\\\\[\"]|[^\"])*\")/, /^(?:'(\\\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\\s)])))/, /^(?:false(?=([~}\\s)])))/, /^(?:undefined(?=([~}\\s)])))/, /^(?:null(?=([~}\\s)])))/, /^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/, /^(?:as\\s+\\|)/, /^(?:\\|)/, /^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/, /^(?:\\[(\\\\\\]|[^\\]])*\\])/, /^(?:.)/, /^(?:$)/];\n lexer.conditions = { \"mu\": { \"rules\": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], \"inclusive\": false }, \"emu\": { \"rules\": [2], \"inclusive\": false }, \"com\": { \"rules\": [6], \"inclusive\": false }, \"raw\": { \"rules\": [3, 4, 5], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 44], \"inclusive\": true } };\n return lexer;\n }();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }Parser.prototype = parser;parser.Parser = Parser;\n return new Parser();\n }();\n\n const errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\n function Exception(message, node) {\n let loc = node && node.loc,\n line,\n column;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n let tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (let idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n }\n\n Exception.prototype = new Error();\n\n function Visitor() {\n this.parents = [];\n }\n\n Visitor.prototype = {\n constructor: Visitor,\n mutating: false,\n\n // Visits a given value. If mutating, will replace the value if necessary.\n acceptKey: function (node, name) {\n let value = this.accept(node[name]);\n if (this.mutating) {\n // Hacky sanity check: This may have a few false positives for type for the helper\n // methods but will generally do the right thing without a lot of overhead.\n if (value && !Visitor.prototype[value.type]) {\n throw new Exception('Unexpected node type \"' + value.type + '\" found when accepting ' + name + ' on ' + node.type);\n }\n node[name] = value;\n }\n },\n\n // Performs an accept operation with added sanity check to ensure\n // required keys are not removed.\n acceptRequired: function (node, name) {\n this.acceptKey(node, name);\n\n if (!node[name]) {\n throw new Exception(node.type + ' requires ' + name);\n }\n },\n\n // Traverses a given array. If mutating, empty respnses will be removed\n // for child elements.\n acceptArray: function (array) {\n for (let i = 0, l = array.length; i < l; i++) {\n this.acceptKey(array, i);\n\n if (!array[i]) {\n array.splice(i, 1);\n i--;\n l--;\n }\n }\n },\n\n accept: function (object) {\n if (!object) {\n return;\n }\n\n /* istanbul ignore next: Sanity code */\n if (!this[object.type]) {\n throw new Exception('Unknown type: ' + object.type, object);\n }\n\n if (this.current) {\n this.parents.unshift(this.current);\n }\n this.current = object;\n\n let ret = this[object.type](object);\n\n this.current = this.parents.shift();\n\n if (!this.mutating || ret) {\n return ret;\n } else if (ret !== false) {\n return object;\n }\n },\n\n Program: function (program) {\n this.acceptArray(program.body);\n },\n\n MustacheStatement: visitSubExpression,\n Decorator: visitSubExpression,\n\n BlockStatement: visitBlock,\n DecoratorBlock: visitBlock,\n\n PartialStatement: visitPartial,\n PartialBlockStatement: function (partial) {\n visitPartial.call(this, partial);\n\n this.acceptKey(partial, 'program');\n },\n\n ContentStatement: function () /* content */{},\n CommentStatement: function () /* comment */{},\n\n SubExpression: visitSubExpression,\n\n PathExpression: function () /* path */{},\n\n StringLiteral: function () /* string */{},\n NumberLiteral: function () /* number */{},\n BooleanLiteral: function () /* bool */{},\n UndefinedLiteral: function () /* literal */{},\n NullLiteral: function () /* literal */{},\n\n Hash: function (hash) {\n this.acceptArray(hash.pairs);\n },\n HashPair: function (pair) {\n this.acceptRequired(pair, 'value');\n }\n };\n\n function visitSubExpression(mustache) {\n this.acceptRequired(mustache, 'path');\n this.acceptArray(mustache.params);\n this.acceptKey(mustache, 'hash');\n }\n function visitBlock(block) {\n visitSubExpression.call(this, block);\n\n this.acceptKey(block, 'program');\n this.acceptKey(block, 'inverse');\n }\n function visitPartial(partial) {\n this.acceptRequired(partial, 'name');\n this.acceptArray(partial.params);\n this.acceptKey(partial, 'hash');\n }\n\n function WhitespaceControl(options = {}) {\n this.options = options;\n }\n WhitespaceControl.prototype = new Visitor();\n\n WhitespaceControl.prototype.Program = function (program) {\n const doStandalone = !this.options.ignoreStandalone;\n\n let isRoot = !this.isRootSeen;\n this.isRootSeen = true;\n\n let body = program.body;\n for (let i = 0, l = body.length; i < l; i++) {\n let current = body[i],\n strip = this.accept(current);\n\n if (!strip) {\n continue;\n }\n\n let _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),\n _isNextWhitespace = isNextWhitespace(body, i, isRoot),\n openStandalone = strip.openStandalone && _isPrevWhitespace,\n closeStandalone = strip.closeStandalone && _isNextWhitespace,\n inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;\n\n if (strip.close) {\n omitRight(body, i, true);\n }\n if (strip.open) {\n omitLeft(body, i, true);\n }\n\n if (doStandalone && inlineStandalone) {\n omitRight(body, i);\n\n if (omitLeft(body, i)) {\n // If we are on a standalone node, save the indent info for partials\n if (current.type === 'PartialStatement') {\n // Pull out the whitespace from the final line\n current.indent = /([ \\t]+$)/.exec(body[i - 1].original)[1];\n }\n }\n }\n if (doStandalone && openStandalone) {\n omitRight((current.program || current.inverse).body);\n\n // Strip out the previous content node if it's whitespace only\n omitLeft(body, i);\n }\n if (doStandalone && closeStandalone) {\n // Always strip the next node\n omitRight(body, i);\n\n omitLeft((current.inverse || current.program).body);\n }\n }\n\n return program;\n };\n\n WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {\n this.accept(block.program);\n this.accept(block.inverse);\n\n // Find the inverse program that is involed with whitespace stripping.\n let program = block.program || block.inverse,\n inverse = block.program && block.inverse,\n firstInverse = inverse,\n lastInverse = inverse;\n\n if (inverse && inverse.chained) {\n firstInverse = inverse.body[0].program;\n\n // Walk the inverse chain to find the last inverse that is actually in the chain.\n while (lastInverse.chained) {\n lastInverse = lastInverse.body[lastInverse.body.length - 1].program;\n }\n }\n\n let strip = {\n open: block.openStrip.open,\n close: block.closeStrip.close,\n\n // Determine the standalone candiacy. Basically flag our content as being possibly standalone\n // so our parent can determine if we actually are standalone\n openStandalone: isNextWhitespace(program.body),\n closeStandalone: isPrevWhitespace((firstInverse || program).body)\n };\n\n if (block.openStrip.close) {\n omitRight(program.body, null, true);\n }\n\n if (inverse) {\n let inverseStrip = block.inverseStrip;\n\n if (inverseStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n if (inverseStrip.close) {\n omitRight(firstInverse.body, null, true);\n }\n if (block.closeStrip.open) {\n omitLeft(lastInverse.body, null, true);\n }\n\n // Find standalone else statments\n if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {\n omitLeft(program.body);\n omitRight(firstInverse.body);\n }\n } else if (block.closeStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n return strip;\n };\n\n WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {\n return mustache.strip;\n };\n\n WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {\n /* istanbul ignore next */\n let strip = node.strip || {};\n return {\n inlineStandalone: true,\n open: strip.open,\n close: strip.close\n };\n };\n\n function isPrevWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = body.length;\n }\n\n // Nodes that end with newlines are considered whitespace (but are special\n // cased for strip operations)\n let prev = body[i - 1],\n sibling = body[i - 2];\n if (!prev) {\n return isRoot;\n }\n\n if (prev.type === 'ContentStatement') {\n return (sibling || !isRoot ? /\\r?\\n\\s*?$/ : /(^|\\r?\\n)\\s*?$/).test(prev.original);\n }\n }\n function isNextWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = -1;\n }\n\n let next = body[i + 1],\n sibling = body[i + 2];\n if (!next) {\n return isRoot;\n }\n\n if (next.type === 'ContentStatement') {\n return (sibling || !isRoot ? /^\\s*?\\r?\\n/ : /^\\s*?(\\r?\\n|$)/).test(next.original);\n }\n }\n\n // Marks the node to the right of the position as omitted.\n // I.e. {{foo}}' ' will mark the ' ' node as omitted.\n //\n // If i is undefined, then the first child will be marked as such.\n //\n // If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n // content is met.\n function omitRight(body, i, multiple) {\n let current = body[i == null ? 0 : i + 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {\n return;\n }\n\n let original = current.value;\n current.value = current.value.replace(multiple ? /^\\s+/ : /^[ \\t]*\\r?\\n?/, '');\n current.rightStripped = current.value !== original;\n }\n\n // Marks the node to the left of the position as omitted.\n // I.e. ' '{{foo}} will mark the ' ' node as omitted.\n //\n // If i is undefined then the last child will be marked as such.\n //\n // If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n // content is met.\n function omitLeft(body, i, multiple) {\n let current = body[i == null ? body.length - 1 : i - 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {\n return;\n }\n\n // We omit the last node if it's whitespace only and not preceeded by a non-content node.\n let original = current.value;\n current.value = current.value.replace(multiple ? /\\s+$/ : /[ \\t]+$/, '');\n current.leftStripped = current.value !== original;\n return current.leftStripped;\n }\n\n function validateClose(open, close) {\n close = close.path ? close.path.original : close;\n\n if (open.path.original !== close) {\n let errorNode = { loc: open.path.loc };\n\n throw new Exception(open.path.original + \" doesn't match \" + close, errorNode);\n }\n }\n\n function SourceLocation(source, locInfo) {\n this.source = source;\n this.start = {\n line: locInfo.first_line,\n column: locInfo.first_column\n };\n this.end = {\n line: locInfo.last_line,\n column: locInfo.last_column\n };\n }\n\n function id(token) {\n if (/^\\[.*\\]$/.test(token)) {\n return token.substr(1, token.length - 2);\n } else {\n return token;\n }\n }\n\n function stripFlags(open, close) {\n return {\n open: open.charAt(2) === '~',\n close: close.charAt(close.length - 3) === '~'\n };\n }\n\n function stripComment(comment) {\n return comment.replace(/^\\{\\{~?\\!-?-?/, '').replace(/-?-?~?\\}\\}$/, '');\n }\n\n function preparePath(data, parts, loc) {\n loc = this.locInfo(loc);\n\n let original = data ? '@' : '',\n dig = [],\n depth = 0;\n\n for (let i = 0, l = parts.length; i < l; i++) {\n let part = parts[i].part,\n\n // If we have [] syntax then we do not treat path references as operators,\n // i.e. foo.[this] resolves to approximately context.foo['this']\n isLiteral = parts[i].original !== part;\n original += (parts[i].separator || '') + part;\n\n if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {\n if (dig.length > 0) {\n throw new Exception('Invalid path: ' + original, { loc });\n } else if (part === '..') {\n depth++;\n }\n } else {\n dig.push(part);\n }\n }\n\n return {\n type: 'PathExpression',\n data,\n depth,\n parts: dig,\n original,\n loc\n };\n }\n\n function prepareMustache(path, params, hash, open, strip, locInfo) {\n // Must use charAt to support IE pre-10\n let escapeFlag = open.charAt(3) || open.charAt(2),\n escaped = escapeFlag !== '{' && escapeFlag !== '&';\n\n let decorator = /\\*/.test(open);\n return {\n type: decorator ? 'Decorator' : 'MustacheStatement',\n path,\n params,\n hash,\n escaped,\n strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n function prepareRawBlock(openRawBlock, contents, close, locInfo) {\n validateClose(openRawBlock, close);\n\n locInfo = this.locInfo(locInfo);\n let program = {\n type: 'Program',\n body: contents,\n strip: {},\n loc: locInfo\n };\n\n return {\n type: 'BlockStatement',\n path: openRawBlock.path,\n params: openRawBlock.params,\n hash: openRawBlock.hash,\n program,\n openStrip: {},\n inverseStrip: {},\n closeStrip: {},\n loc: locInfo\n };\n }\n\n function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {\n if (close && close.path) {\n validateClose(openBlock, close);\n }\n\n let decorator = /\\*/.test(openBlock.open);\n\n program.blockParams = openBlock.blockParams;\n\n let inverse, inverseStrip;\n\n if (inverseAndProgram) {\n if (decorator) {\n throw new Exception('Unexpected inverse block on decorator', inverseAndProgram);\n }\n\n if (inverseAndProgram.chain) {\n inverseAndProgram.program.body[0].closeStrip = close.strip;\n }\n\n inverseStrip = inverseAndProgram.strip;\n inverse = inverseAndProgram.program;\n }\n\n if (inverted) {\n inverted = inverse;\n inverse = program;\n program = inverted;\n }\n\n return {\n type: decorator ? 'DecoratorBlock' : 'BlockStatement',\n path: openBlock.path,\n params: openBlock.params,\n hash: openBlock.hash,\n program,\n inverse,\n openStrip: openBlock.strip,\n inverseStrip,\n closeStrip: close && close.strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n function prepareProgram(statements, loc) {\n if (!loc && statements.length) {\n const firstLoc = statements[0].loc,\n lastLoc = statements[statements.length - 1].loc;\n\n /* istanbul ignore else */\n if (firstLoc && lastLoc) {\n loc = {\n source: firstLoc.source,\n start: {\n line: firstLoc.start.line,\n column: firstLoc.start.column\n },\n end: {\n line: lastLoc.end.line,\n column: lastLoc.end.column\n }\n };\n }\n }\n\n return {\n type: 'Program',\n body: statements,\n strip: {},\n loc: loc\n };\n }\n\n function preparePartialBlock(open, program, close, locInfo) {\n validateClose(open, close);\n\n return {\n type: 'PartialBlockStatement',\n name: open.path,\n params: open.params,\n hash: open.hash,\n program,\n openStrip: open.strip,\n closeStrip: close && close.strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n var Helpers = /*#__PURE__*/Object.freeze({\n SourceLocation: SourceLocation,\n id: id,\n stripFlags: stripFlags,\n stripComment: stripComment,\n preparePath: preparePath,\n prepareMustache: prepareMustache,\n prepareRawBlock: prepareRawBlock,\n prepareBlock: prepareBlock,\n prepareProgram: prepareProgram,\n preparePartialBlock: preparePartialBlock\n });\n\n function extend(obj /* , ...source */) {\n for (let i = 1; i < arguments.length; i++) {\n for (let key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n }\n\n let toString = Object.prototype.toString;\n\n // Sourced from lodash\n // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n /* eslint-disable func-style */\n let isFunction = function (value) {\n return typeof value === 'function';\n };\n // fallback for older versions of Chrome and Safari\n /* istanbul ignore next */\n if (isFunction(/x/)) {\n isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n }\n\n let yy = {};\n extend(yy, Helpers);\n\n function parse(input, options) {\n // Just return if an already-compiled AST was passed in.\n if (input.type === 'Program') {\n return input;\n }\n\n handlebars.yy = yy;\n\n // Altering the shared object here, but this is ok as parser is a sync operation\n yy.locInfo = function (locInfo) {\n return new yy.SourceLocation(options && options.srcName, locInfo);\n };\n\n let strip = new WhitespaceControl(options);\n return strip.accept(handlebars.parse(input));\n }\n\n exports.parser = handlebars;\n exports.parse = parse;\n});","enifed('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/matchers', 'internal-test-helpers/lib/run', '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/abstract-rendering', 'internal-test-helpers/lib/test-cases/rendering', 'internal-test-helpers/lib/test-cases/router', 'internal-test-helpers/lib/test-cases/autoboot-application', 'internal-test-helpers/lib/test-cases/default-resolver-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, _matchers, _run, _abstract, _abstractApplication, _application, _queryParam, _abstractRendering, _rendering, _router, _autobootApplication, _defaultResolverApplication, _testResolver, _browserDetect, _registryCheck) {\n 'use strict';\n\n exports.__esModule = true;\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, '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, '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, '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, 'AbstractRenderingTestCase', {\n enumerable: true,\n get: function () {\n return _abstractRendering.default;\n }\n });\n Object.defineProperty(exports, 'RenderingTestCase', {\n enumerable: true,\n get: function () {\n return _rendering.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, 'DefaultResolverApplicationTestCase', {\n enumerable: true,\n get: function () {\n return _defaultResolverApplication.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, 'isIE11', {\n enumerable: true,\n get: function () {\n return _browserDetect.isIE11;\n }\n });\n Object.defineProperty(exports, 'isEdge', {\n enumerable: true,\n get: function () {\n return _browserDetect.isEdge;\n }\n });\n Object.defineProperty(exports, 'verifyInjection', {\n enumerable: true,\n get: function () {\n return _registryCheck.verifyInjection;\n }\n });\n Object.defineProperty(exports, 'verifyRegistration', {\n enumerable: true,\n get: function () {\n return _registryCheck.verifyRegistration;\n }\n });\n});","enifed('internal-test-helpers/lib/apply-mixins', ['exports', '@ember/polyfills', 'internal-test-helpers/lib/get-all-property-names'], function (exports, _polyfills, _getAllPropertyNames) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = applyMixins;\n\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 let mixin;\n\n if (isGenerator(mixinOrGenerator)) {\n let generator = mixinOrGenerator;\n mixin = {};\n\n generator.cases.forEach((value, idx) => {\n (0, _polyfills.assign)(mixin, generator.generate(value, idx));\n });\n\n (0, _polyfills.assign)(TestClass.prototype, mixin);\n } else if (typeof mixinOrGenerator === 'function') {\n let properties = (0, _getAllPropertyNames.default)(mixinOrGenerator);\n mixin = new mixinOrGenerator();\n\n properties.forEach(name => {\n TestClass.prototype[name] = function () {\n return mixin[name].apply(mixin, arguments);\n };\n });\n } else {\n mixin = mixinOrGenerator;\n (0, _polyfills.assign)(TestClass.prototype, mixin);\n }\n });\n\n return TestClass;\n }\n});","enifed('internal-test-helpers/lib/browser-detect', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n // `window.ActiveXObject` is \"falsey\" in IE11 (but not `undefined` or `false`)\n // `\"ActiveXObject\" in window` returns `true` in all IE versions\n // only IE11 will pass _both_ of these conditions\n const isIE11 = exports.isIE11 = !window.ActiveXObject && 'ActiveXObject' in window;\n const isEdge = exports.isEdge = /Edge/.test(navigator.userAgent);\n});","enifed('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 exports.__esModule = true;\n exports.default = buildOwner;\n\n\n class ResolverWrapper {\n constructor(resolver) {\n this.resolver = resolver;\n }\n\n create() {\n return this.resolver;\n }\n }\n\n function buildOwner(options = {}) {\n let ownerOptions = options.ownerOptions || {};\n let resolver = options.resolver;\n let bootOptions = options.bootOptions || {};\n\n let Owner = _runtime.Object.extend(_runtime.RegistryProxyMixin, _runtime.ContainerProxyMixin);\n\n let namespace = _runtime.Object.create({\n Resolver: new ResolverWrapper(resolver)\n });\n\n let fallbackRegistry = _application.default.buildRegistry(namespace);\n fallbackRegistry.register('router:main', _routing.Router);\n\n let registry = new _container.Registry({\n fallback: fallbackRegistry\n });\n\n _instance.default.setupRegistry(registry, bootOptions);\n\n let owner = Owner.create({\n __registry__: registry,\n __container__: null\n }, ownerOptions);\n\n let container = registry.container({ owner });\n owner.__container__ = container;\n\n return owner;\n }\n});","enifed('internal-test-helpers/lib/confirm-export', ['exports', 'require'], function (exports, _require2) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = confirmExport;\n\n\n function getDescriptor(obj, path) {\n let parts = path.split('.');\n let value = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n let part = parts[i];\n value = value[part];\n if (!value) {\n return undefined;\n }\n }\n let last = parts[parts.length - 1];\n return Object.getOwnPropertyDescriptor(value, last);\n }\n\n function confirmExport(Ember, assert, path, moduleId, exportName) {\n try {\n let desc = getDescriptor(Ember, path);\n assert.ok(desc, `the ${path} property exists on the Ember global`);\n\n if (typeof exportName === 'string') {\n let mod = (0, _require2.default)(moduleId);\n assert.equal(desc.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 let mod = (0, _require2.default)(moduleId);\n assert.equal(desc.get, mod[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, mod[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 occured while testing ${path} is exported from ${moduleId}.`,\n source: error\n });\n }\n }\n});","enifed('internal-test-helpers/lib/ember-dev/assertion', ['exports', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n const BREAK = {};\n /*\n This assertion class 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 class AssertionAssert {\n constructor(env) {\n this.env = env;\n }\n reset() {}\n assert() {}\n inject() {\n let expectAssertion = (func, expectedMessage) => {\n let { assert } = QUnit.config.current;\n if (this.env.runningProdBuild) {\n assert.ok(true, 'Assertions disabled in production builds.');\n return;\n }\n let sawCall = false;\n let actualMessage = undefined;\n // The try-catch statement is used to \"exit\" `func` as soon as\n // the first useful assertion has been produced.\n try {\n (0, _utils.callWithStub)(this.env, 'assert', func, (message, test) => {\n sawCall = true;\n if ((0, _utils.checkTest)(test)) {\n return;\n }\n actualMessage = message;\n throw BREAK;\n });\n } catch (e) {\n if (e !== BREAK) {\n throw e;\n }\n }\n check(assert, sawCall, actualMessage, expectedMessage);\n };\n let ignoreAssertion = func => {\n (0, _utils.callWithStub)(this.env, 'assert', func);\n };\n window.expectAssertion = expectAssertion;\n window.ignoreAssertion = ignoreAssertion;\n }\n restore() {\n window.expectAssertion = null;\n window.ignoreAssertion = null;\n }\n }\n exports.default = AssertionAssert;\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});","enifed('internal-test-helpers/lib/ember-dev/containers', ['exports', '@ember/-internals/container'], function (exports, _container) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n function ContainersAssert(env) {\n this.env = env;\n }\n\n const { _leakTracking: containerLeakTracking } = _container.Container;\n\n ContainersAssert.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n if (containerLeakTracking === undefined) return;\n let { config } = QUnit;\n let { testName, testId, module: { name: moduleName }, finish: originalFinish } = config.current;\n config.current.finish = function () {\n originalFinish.call(this);\n originalFinish = undefined;\n config.queue.unshift(function () {\n if (containerLeakTracking.hasContainers()) {\n containerLeakTracking.reset();\n // eslint-disable-next-line no-console\n console.assert(false, `Leaked container after test ${moduleName}: ${testName} testId=${testId}`);\n }\n });\n };\n },\n restore: function () {}\n };\n\n exports.default = ContainersAssert;\n});","enifed('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 exports.__esModule = true;\n\n class DebugAssert {\n constructor(methodName, env) {\n this.methodName = methodName;\n this.env = env;\n this.tracker = null;\n }\n inject() {}\n restore() {\n this.reset();\n }\n reset() {\n if (this.tracker) {\n this.tracker.restoreMethod();\n }\n this.tracker = null;\n }\n assert() {\n if (this.tracker) {\n this.tracker.assert();\n }\n }\n // Run an expectation callback within the context of a new tracker, optionally\n // accepting a function to run, which asserts immediately\n runExpectation(func, callback) {\n let originalTracker = null;\n // When helpers are passed a callback, they get a new tracker context\n if (func) {\n originalTracker = this.tracker;\n this.tracker = null;\n }\n if (!this.tracker) {\n this.tracker = new _methodCallTracker.default(this.env, this.methodName);\n }\n // Yield to caller with tracker instance\n callback(this.tracker);\n // Once the given callback is invoked, the pending assertions should be\n // flushed immediately\n if (func) {\n func();\n this.assert();\n this.reset();\n this.tracker = originalTracker;\n }\n }\n }\n exports.default = DebugAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/deprecation', ['exports', 'internal-test-helpers/lib/ember-dev/debug', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _debug, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n class DeprecationAssert extends _debug.default {\n constructor(env) {\n super('deprecate', env);\n }\n inject() {\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 let expectNoDeprecation = func => {\n if (typeof func !== 'function') {\n func = undefined;\n }\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoDeprecation was called after expectDeprecation was called!');\n }\n tracker.expectNoCalls();\n });\n };\n // Expect a deprecation to happen within a function, or if no function\n // is pass, from the time of calling until the end of the test. Can be called\n // multiple times to assert deprecations with different specific messages\n // were fired.\n //\n // expectDeprecation(function() {\n // Ember.deprecate(\"Old And Busted\");\n // }, /* optionalStringOrRegex */);\n //\n // expectDeprecation(/* optionalStringOrRegex */);\n // Ember.deprecate(\"Old And Busted\");\n //\n let expectDeprecation = (func, message) => {\n let actualFunc;\n if (typeof func !== 'function') {\n message = func;\n actualFunc = undefined;\n } else {\n actualFunc = func;\n }\n this.runExpectation(actualFunc, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectDeprecation was called after expectNoDeprecation was called!');\n }\n tracker.expectCall(message, ['id', 'until']);\n });\n };\n let ignoreDeprecation = func => {\n (0, _utils.callWithStub)(this.env, 'deprecate', func);\n };\n window.expectNoDeprecation = expectNoDeprecation;\n window.expectDeprecation = expectDeprecation;\n window.ignoreDeprecation = ignoreDeprecation;\n }\n restore() {\n super.restore();\n window.expectDeprecation = null;\n window.expectNoDeprecation = null;\n window.ignoreDeprecation = null;\n }\n }\n exports.default = DeprecationAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/index', ['exports', 'internal-test-helpers/lib/ember-dev/deprecation', 'internal-test-helpers/lib/ember-dev/warning', 'internal-test-helpers/lib/ember-dev/assertion', 'internal-test-helpers/lib/ember-dev/run-loop', 'internal-test-helpers/lib/ember-dev/namespaces', 'internal-test-helpers/lib/ember-dev/containers', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _deprecation, _warning, _assertion, _runLoop, _namespaces, _containers, _utils) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n var EmberDevTestHelperAssert = (0, _utils.buildCompositeAssert)([_deprecation.default, _warning.default, _assertion.default, _runLoop.default, _namespaces.default, _containers.default]);\n\n exports.default = EmberDevTestHelperAssert;\n});","enifed('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 exports.__esModule = true;\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 stubMethod() {\n if (this._originalMethod) {\n // Method is already stubbed\n return;\n }\n let env = this._env;\n let methodName = this._methodName;\n this._originalMethod = env.getDebugFunction(methodName);\n env.setDebugFunction(methodName, (message, test, options) => {\n let resultOfTest = (0, _utils.checkTest)(test);\n this._actuals.push([message, resultOfTest, options]);\n });\n }\n restoreMethod() {\n if (this._originalMethod) {\n this._env.setDebugFunction(this._methodName, this._originalMethod);\n }\n }\n expectCall(message, options) {\n this.stubMethod();\n this._expectedMessages.push(message || /.*/);\n this._expectedOptionLists.push(options);\n }\n expectNoCalls() {\n this.stubMethod();\n this._isExpectingNoCalls = true;\n }\n isExpectingNoCalls() {\n return this._isExpectingNoCalls;\n }\n isExpectingCalls() {\n return !this._isExpectingNoCalls && this._expectedMessages.length;\n }\n assert() {\n let { assert } = QUnit.config.current;\n let env = this._env;\n let methodName = this._methodName;\n let isExpectingNoCalls = this._isExpectingNoCalls;\n let expectedMessages = this._expectedMessages;\n let expectedOptionLists = this._expectedOptionLists;\n let actuals = this._actuals;\n let o, i, j;\n if (!isExpectingNoCalls && expectedMessages.length === 0 && actuals.length === 0) {\n return;\n }\n if (env.runningProdBuild) {\n assert.ok(true, `calls to Ember.${methodName} disabled in production builds.`);\n return;\n }\n if (isExpectingNoCalls) {\n let actualMessages = [];\n for (i = 0; i < actuals.length; i++) {\n if (!actuals[i][1]) {\n actualMessages.push(actuals[i][0]);\n }\n }\n assert.ok(actualMessages.length === 0, `Expected no Ember.${methodName} calls, got ${actuals.length}: ${actualMessages.join(', ')}`);\n return;\n }\n let actual;\n let match = undefined;\n for (o = 0; o < expectedMessages.length; o++) {\n const expectedMessage = expectedMessages[o];\n const expectedOptionList = expectedOptionLists[o];\n for (i = 0; i < actuals.length; i++) {\n let matchesMessage = false;\n let matchesOptionList = false;\n actual = actuals[i];\n if (actual[1] === true) {\n continue;\n }\n if (expectedMessage instanceof RegExp && expectedMessage.test(actual[0])) {\n matchesMessage = true;\n } else if (expectedMessage === actual[0]) {\n matchesMessage = true;\n }\n if (expectedOptionList === undefined) {\n matchesOptionList = true;\n } else if (actual[2]) {\n matchesOptionList = true;\n for (j = 0; j < expectedOptionList.length; j++) {\n matchesOptionList = matchesOptionList && actual[2].hasOwnProperty(expectedOptionList[j]);\n }\n }\n if (matchesMessage && matchesOptionList) {\n match = actual;\n break;\n }\n }\n const expectedOptionsMessage = expectedOptionList ? `and options: { ${expectedOptionList.join(', ')} }` : 'and no options';\n const actualOptionsMessage = actual && actual[2] ? `and options: { ${Object.keys(actual[2]).join(', ')} }` : 'and no options';\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 }\n exports.default = MethodCallTracker;\n});","enifed('internal-test-helpers/lib/ember-dev/namespaces', ['exports', '@ember/runloop', '@ember/-internals/metal'], function (exports, _runloop, _metal) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n function NamespacesAssert(env) {\n this.env = env;\n }\n\n NamespacesAssert.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n let { assert } = 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 let namespaces = _metal.NAMESPACES.slice();\n for (let i = 0; i < namespaces.length; i++) {\n namespaces[i].destroy();\n }\n });\n }\n let keys = Object.keys(_metal.NAMESPACES_BY_ID);\n if (keys.length > 0) {\n assert.ok(false, 'Should not have any NAMESPACES_BY_ID after tests');\n for (let i = 0; i < keys.length; i++) {\n delete _metal.NAMESPACES_BY_ID[keys[i]];\n }\n }\n },\n restore: function () {}\n };\n\n exports.default = NamespacesAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/run-loop', ['exports', '@ember/runloop'], function (exports, _runloop) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n function RunLoopAssertion(env) {\n this.env = env;\n }\n\n RunLoopAssertion.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n let { assert } = QUnit.config.current;\n\n if ((0, _runloop.getCurrentRunLoop)()) {\n assert.ok(false, 'Should not be in a run loop at end of test');\n while ((0, _runloop.getCurrentRunLoop)()) {\n (0, _runloop.end)();\n }\n }\n\n if ((0, _runloop.hasScheduledTimers)()) {\n assert.ok(false, 'Ember run should not have scheduled timers at end of test');\n (0, _runloop.cancelTimers)();\n }\n },\n restore: function () {}\n };\n\n exports.default = RunLoopAssertion;\n});","enifed(\"internal-test-helpers/lib/ember-dev/setup-qunit\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = setupQUnit;\n function setupQUnit(assertion, _qunitGlobal) {\n let qunitGlobal = QUnit;\n if (_qunitGlobal) {\n qunitGlobal = _qunitGlobal;\n }\n let originalModule = qunitGlobal.module;\n qunitGlobal.module = function (name, _options) {\n let options = _options || {};\n let originalSetup = options.setup || options.beforeEach || function () {};\n let originalTeardown = options.teardown || options.afterEach || function () {};\n delete options.setup;\n delete options.teardown;\n options.beforeEach = function () {\n assertion.reset();\n assertion.inject();\n return originalSetup.apply(this, arguments);\n };\n options.afterEach = function () {\n let result = originalTeardown.apply(this, arguments);\n assertion.assert();\n assertion.restore();\n return result;\n };\n return originalModule(name, options);\n };\n }\n});","enifed('internal-test-helpers/lib/ember-dev/utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.buildCompositeAssert = buildCompositeAssert;\n exports.callWithStub = callWithStub;\n exports.checkTest = checkTest;\n function callForEach(prop, func) {\n return function () {\n for (let i = 0, l = this[prop].length; i < l; i++) {\n this[prop][i][func]();\n }\n };\n }\n function buildCompositeAssert(assertClasses) {\n function Composite(env) {\n this.asserts = assertClasses.map(Assert => new Assert(env));\n }\n Composite.prototype = {\n reset: callForEach('asserts', 'reset'),\n inject: callForEach('asserts', 'inject'),\n assert: callForEach('asserts', 'assert'),\n restore: callForEach('asserts', 'restore')\n };\n return Composite;\n }\n function noop() {}\n function callWithStub(env, name, func, debugStub = noop) {\n let originalFunc = env.getDebugFunction(name);\n try {\n env.setDebugFunction(name, debugStub);\n func();\n } finally {\n env.setDebugFunction(name, originalFunc);\n }\n }\n function checkTest(test) {\n return typeof test === 'function' ? test() : test;\n }\n});","enifed('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 exports.__esModule = true;\n\n class WarningAssert extends _debug.default {\n constructor(env) {\n super('warn', env);\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 let expectNoWarning = func => {\n if (typeof func !== 'function') {\n func = undefined;\n }\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoWarning was called after expectWarning was called!');\n }\n tracker.expectNoCalls();\n });\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 let expectWarning = (func, message) => {\n let actualFunc;\n if (typeof func !== 'function') {\n message = func;\n actualFunc = undefined;\n } else {\n actualFunc = func;\n }\n this.runExpectation(actualFunc, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectWarning was called after expectNoWarning was called!');\n }\n tracker.expectCall(message);\n });\n };\n let ignoreWarning = func => {\n (0, _utils.callWithStub)(this.env, 'warn', func);\n };\n window.expectNoWarning = expectNoWarning;\n window.expectWarning = expectWarning;\n window.ignoreWarning = ignoreWarning;\n }\n restore() {\n super.restore();\n window.expectWarning = null;\n window.expectNoWarning = null;\n window.ignoreWarning = null;\n }\n }\n exports.default = WarningAssert;\n});","enifed('internal-test-helpers/lib/equal-inner-html', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = equalInnerHTML;\n // detect side-effects of cloning svg elements in IE9-11\n let ieSVGInnerHTML = (() => {\n if (!document.createElementNS) {\n return false;\n }\n let div = document.createElement('div');\n let node = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n div.appendChild(node);\n let 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)}>`);\n }\n\n return actualHTML;\n }\n\n function equalInnerHTML(assert, fragment, html) {\n let actualHTML = normalizeInnerHTML(fragment.innerHTML);\n\n assert.pushResult({\n result: actualHTML === html,\n actual: actualHTML,\n expected: html\n });\n }\n});","enifed('internal-test-helpers/lib/equal-tokens', ['exports', 'simple-html-tokenizer'], function (exports, _simpleHtmlTokenizer) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = equalTokens;\n\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 if (a[0] < b[0]) {\n return -1;\n }\n return 0;\n });\n }\n });\n }\n\n function equalTokens(actualContainer, expectedHTML, message = null) {\n let actual = generateTokens(actualContainer);\n let expected = generateTokens(expectedHTML);\n\n normalizeTokens(actual.tokens);\n normalizeTokens(expected.tokens);\n\n let { assert } = QUnit.config.current;\n let 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});","enifed('internal-test-helpers/lib/factory', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = factory;\n function setProperties(object, properties) {\n for (let key in properties) {\n if (properties.hasOwnProperty(key)) {\n object[key] = properties[key];\n }\n }\n }\n\n let guids = 0;\n\n function factory() {\n /*jshint validthis: true */\n\n function Klass(options) {\n setProperties(this, options);\n this._guid = guids++;\n this.isDestroyed = false;\n }\n\n Klass.prototype.constructor = Klass;\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\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 let Parent = this;\n\n Child.prototype = new Parent();\n Child.prototype.constructor = Child;\n\n setProperties(Child, Klass);\n setProperties(Child.prototype, options);\n\n Child.create = create;\n Child.extend = extend;\n Child.reopen = extend;\n\n Child.reopenClass = reopenClass;\n\n return Child;\n }\n }\n});","enifed(\"internal-test-helpers/lib/get-all-property-names\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = getAllPropertyNames;\n function getAllPropertyNames(Klass) {\n let proto = Klass.prototype;\n let properties = new Set();\n\n while (proto !== Object.prototype) {\n let names = Object.getOwnPropertyNames(proto);\n names.forEach(name => properties.add(name));\n proto = Object.getPrototypeOf(proto);\n }\n\n return properties;\n }\n});","enifed(\"internal-test-helpers/lib/get-text-of\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = getTextOf;\n function getTextOf(elem) {\n return elem.textContent.trim();\n }\n});","enifed('internal-test-helpers/lib/matchers', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.regex = regex;\n exports.classes = classes;\n exports.styles = styles;\n exports.equalsElement = equalsElement;\n const HTMLElement = window.HTMLElement;\n const 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 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 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 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\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 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\n let expectedAttrs = {};\n let expectedCount = 0;\n\n for (let name in attributes) {\n let expected = attributes[name];\n if (expected !== null) {\n expectedCount++;\n }\n\n let matcher = isMatcher(expected) ? expected : equalsAttr(expected);\n\n expectedAttrs[name] = matcher;\n\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 let actualAttributes = {};\n\n for (let 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});","enifed('internal-test-helpers/lib/module-for', ['exports', '@ember/canary-features', 'internal-test-helpers/lib/apply-mixins', 'internal-test-helpers/lib/get-all-property-names', 'rsvp'], function (exports, _canaryFeatures, _applyMixins, _getAllPropertyNames, _rsvp) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = moduleFor;\n function moduleFor(description, TestClass, ...mixins) {\n QUnit.module(description, {\n beforeEach: function (...args) {\n let instance = new TestClass(...args);\n this.instance = instance;\n if (instance.beforeEach) {\n return instance.beforeEach(...args);\n }\n },\n\n afterEach: function () {\n let promises = [];\n let instance = this.instance;\n this.instance = null;\n if (instance.teardown) {\n promises.push(instance.teardown());\n }\n if (instance.afterEach) {\n promises.push(instance.afterEach());\n }\n\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 // Remove after we can update to QUnit that includes\n // https://github.com/qunitjs/qunit/pull/1246\n let filteredPromises = promises.filter(Boolean);\n if (filteredPromises.length > 0) {\n return (0, _rsvp.all)(filteredPromises);\n }\n }\n });\n\n if (mixins.length > 0) {\n (0, _applyMixins.default)(TestClass, ...mixins);\n }\n\n let properties = (0, _getAllPropertyNames.default)(TestClass);\n properties.forEach(generateTest);\n\n function shouldTest(features) {\n return features.every(feature => {\n if (feature[0] === '!' && (0, _canaryFeatures.isEnabled)(feature.slice(1))) {\n return false;\n } else if (!(0, _canaryFeatures.isEnabled)(feature)) {\n return false;\n } else {\n return true;\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 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 let match = /^@feature\\(([A-Z_a-z-!]+)\\) /.exec(name);\n\n if (match) {\n let 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});","enifed('internal-test-helpers/lib/registry-check', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.verifyRegistration = verifyRegistration;\n exports.verifyInjection = verifyInjection;\n function verifyRegistration(assert, owner, fullName) {\n assert.ok(owner.resolveRegistration(fullName), `has registration: ${fullName}`);\n }\n\n function verifyInjection(assert, owner, fullName, property, injectionName) {\n let registry = owner.__registry__;\n let injections;\n\n if (fullName.indexOf(':') === -1) {\n injections = registry.getTypeInjections(fullName);\n } else {\n injections = registry.getInjections(registry.normalize(fullName));\n }\n\n let normalizedName = registry.normalize(injectionName);\n let hasInjection = false;\n let injection;\n\n for (let i = 0, l = injections.length; i < l; i++) {\n injection = injections[i];\n if (injection.property === property && injection.specifier === normalizedName) {\n hasInjection = true;\n break;\n }\n }\n\n assert.ok(hasInjection, `has injection: ${fullName}.${property} = ${injectionName}`);\n }\n});","enifed('internal-test-helpers/lib/run', ['exports', '@ember/runloop'], function (exports, _runloop) {\n 'use strict';\n\n exports.__esModule = true;\n exports.runAppend = runAppend;\n exports.runDestroy = runDestroy;\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)(toDestroy, 'destroy');\n }\n }\n});","enifed('internal-test-helpers/lib/strip', ['exports'], function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.default = strip;\n function strip([...strings], ...values) {\n let str = strings.map((string, index) => {\n let interpolated = values[index];\n return string + (interpolated !== undefined ? interpolated : '');\n }).join('');\n return str.split('\\n').map(s => s.trim()).join('');\n }\n});","enifed('internal-test-helpers/lib/system/synthetic-events', ['exports', '@ember/runloop', '@ember/polyfills'], function (exports, _runloop, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n exports.elMatches = undefined;\n exports.matches = matches;\n exports.click = click;\n exports.focus = focus;\n exports.blur = blur;\n exports.fireEvent = fireEvent;\n\n\n const DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };\n /* globals Element */\n\n const KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];\n const MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n\n const elMatches = exports.elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);\n\n function matches(el, selector) {\n return elMatches.call(el, selector);\n }\n\n function isFocusable(el) {\n let focusableTags = ['INPUT', 'BUTTON', 'LINK', 'SELECT', 'A', 'TEXTAREA'];\n let { tagName, type } = 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 if (isFocusable(el)) {\n (0, _runloop.run)(null, function () {\n let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // 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 if (browserIsNotFocused) {\n fireEvent(el, 'focusin');\n }\n\n // makes `document.activeElement` be `el`. If the browser is focused, it also fires a focus event\n el.focus();\n\n // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it\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 let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n fireEvent(el, 'focusout');\n\n // makes `document.activeElement` be `body`.\n // If the browser is focused, it also fires a blur event\n el.blur();\n\n // 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 if (browserIsNotFocused) {\n fireEvent(el, 'blur');\n }\n });\n }\n }\n\n function fireEvent(element, type, options = {}) {\n if (!element) {\n return;\n }\n let event;\n if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {\n let rect = element.getBoundingClientRect();\n let x = rect.left + 1;\n let y = rect.top + 1;\n let simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, (0, _polyfills.assign)(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n element.dispatchEvent(event);\n\n return event;\n }\n\n function buildBasicEvent(type, options = {}) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n return event;\n }\n\n function buildMouseEvent(type, options = {}) {\n let event;\n try {\n event = document.createEvent('MouseEvents');\n let eventOpts = (0, _polyfills.assign)({}, DEFAULT_EVENT_OPTIONS, options);\n\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 return event;\n }\n\n function buildKeyboardEvent(type, options = {}) {\n let event;\n try {\n event = document.createEvent('KeyEvents');\n let eventOpts = (0, _polyfills.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 return event;\n }\n});","enifed('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 exports.__esModule = true;\n class AbstractApplicationTestCase extends _abstract.default {\n _ensureInstance(bootOptions) {\n if (this._applicationInstancePromise) {\n return this._applicationInstancePromise;\n }\n\n return this._applicationInstancePromise = this.runTask(() => this.application.boot()).then(app => {\n this.applicationInstance = app.buildInstance();\n\n return this.applicationInstance.boot(bootOptions);\n });\n }\n\n visit(url, options) {\n // TODO: THIS IS HORRIBLE\n // the promise returned by `ApplicationInstance.protoype.visit` does **not**\n // currently guarantee rendering is completed\n return this.runTask(() => {\n return this._ensureInstance(options).then(instance => instance.visit(url));\n });\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\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() /* string, options */{\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n }\n exports.default = AbstractApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/abstract-rendering', ['exports', '@ember/polyfills', '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, _polyfills, _emberTemplateCompiler, _views, _glimmer, _testResolver, _abstract, _buildOwner, _run) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const TextNode = window.Text;\n\n class AbstractRenderingTestCase extends _abstract.default {\n constructor() {\n super(...arguments);\n let bootOptions = this.getBootOptions();\n\n let owner = this.owner = (0, _buildOwner.default)({\n ownerOptions: this.getOwnerOptions(),\n resolver: this.getResolver(),\n bootOptions\n });\n\n this.renderer = this.owner.lookup('renderer:-dom');\n this.element = document.querySelector('#qunit-fixture');\n this.component = null;\n\n owner.register('event_dispatcher:main', _views.EventDispatcher);\n owner.inject('event_dispatcher:main', '_viewRegistry', '-view-registry:main');\n if (!bootOptions || bootOptions.isInteractive !== false) {\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 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, { ComponentClass = null, template = null }) {\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 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 let { owner } = this;\n\n owner.register('template:-top-level', this.compile(templateStr, {\n moduleName: '-top-level'\n }));\n\n let attrs = (0, _polyfills.assign)({}, context, {\n tagName: '',\n layoutName: '-top-level'\n });\n\n owner.register('component:-top-level', _glimmer.Component.extend(attrs));\n\n this.component = owner.lookup('component:-top-level');\n\n (0, _run.runAppend)(this.component);\n }\n\n rerender() {\n this.component.rerender();\n }\n\n registerHelper(name, funcOrClassBody) {\n let 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 registerPartial(name, template) {\n let owner = this.env.owner || this.owner;\n if (typeof template === 'string') {\n owner.register(`template:${name}`, this.compile(template, { moduleName: `my-app/templates/-${name}.hbs` }));\n }\n }\n\n registerComponent(name, { ComponentClass = _glimmer.Component, template = null }) {\n let { owner } = 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 registerComponentManager(name, manager) {\n let owner = this.env.owner || this.owner;\n owner.register(`component-manager:${name}`, manager);\n }\n\n registerTemplate(name, template) {\n let { owner } = this;\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 exports.default = AbstractRenderingTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/abstract', ['exports', '@ember/polyfills', '@ember/runloop', 'internal-test-helpers/lib/test-cases/node-query', 'internal-test-helpers/lib/equal-inner-html', 'internal-test-helpers/lib/equal-tokens', 'internal-test-helpers/lib/matchers', 'rsvp'], function (exports, _polyfills, _runloop, _nodeQuery, _equalInnerHtml, _equalTokens, _matchers, _rsvp) {\n 'use strict';\n\n exports.__esModule = true;\n\n\n const TextNode = window.Text; /* global Element */\n\n const HTMLElement = window.HTMLElement;\n const 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\n let { fixture } = this;\n if (fixture) {\n this.setupFixture(fixture);\n }\n }\n\n teardown() {}\n afterEach() {}\n\n runTask(callback) {\n return (0, _runloop.run)(callback);\n }\n\n runTaskNext() {\n return new _rsvp.Promise(resolve => {\n return (0, _runloop.next)(resolve);\n });\n }\n\n setupFixture(innerHTML) {\n let fixture = document.getElementById('qunit-fixture');\n fixture.innerHTML = innerHTML;\n }\n\n // The following methods require `this.element` to work\n\n get firstChild() {\n return this.nthChild(0);\n }\n\n nthChild(n) {\n let i = 0;\n let node = this.element.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 let count = 0;\n let node = this.element.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, this.element);\n } else if (sel !== undefined) {\n throw new Error(`Invalid this.$(${sel})`);\n } else {\n return _nodeQuery.default.element(this.element);\n }\n }\n\n wrap(element) {\n return _nodeQuery.default.element(element);\n }\n\n click(selector) {\n let element;\n if (typeof selector === 'string') {\n element = this.element.querySelector(selector);\n } else {\n element = selector;\n }\n\n let event = element.click();\n\n return this.runLoopSettled(event);\n }\n\n // TODO: Find a better name 😎\n runLoopSettled(value) {\n return new _rsvp.Promise(function (resolve) {\n // Every 5ms, poll for the async thing to have finished\n let 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 }\n\n // Stop polling\n clearInterval(watcher);\n\n // Synchronously resolve the promise\n resolve(value);\n }, 5);\n });\n }\n\n textValue() {\n return this.element.textContent;\n }\n\n takeSnapshot() {\n let snapshot = this.snapshot = [];\n\n let node = this.element.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, this.element, html);\n }\n\n assertHTML(html) {\n (0, _equalTokens.default)(this.element, html, `#qunit-fixture content should be: \\`${html}\\``);\n }\n\n assertElement(node, { ElementType = HTMLElement, tagName, attrs = null, content = null }) {\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, { ElementType = HTMLElement, tagName = 'div', attrs = null, content = null }) {\n attrs = (0, _polyfills.assign)({}, { id: (0, _matchers.regex)(/^ember\\d*$/), class: (0, _matchers.classes)('ember-view') }, attrs || {});\n this.assertElement(node, { ElementType, tagName, attrs, content });\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\n this.assert.strictEqual(newSnapshot.length, oldSnapshot.length, 'Same number of nodes');\n\n for (let 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 this.runTask(() => this.rerender());\n this.assertInvariants();\n }\n }\n exports.default = AbstractTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/application', ['exports', 'internal-test-helpers/lib/test-cases/test-resolver-application', '@ember/application', '@ember/-internals/routing', '@ember/polyfills'], function (exports, _testResolverApplication, _application, _routing, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n class ApplicationTestCase extends _testResolverApplication.default {\n constructor() {\n super(...arguments);\n\n let { applicationOptions } = this;\n this.application = this.runTask(this.createApplication.bind(this, applicationOptions));\n\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 (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: false\n });\n }\n\n get appRouter() {\n return this.applicationInstance.lookup('router:main');\n }\n\n transitionTo() {\n return this.runTask(() => {\n return this.appRouter.transitionTo(...arguments);\n });\n }\n }\n exports.default = ApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/autoboot-application', ['exports', 'internal-test-helpers/lib/test-cases/test-resolver-application', '@ember/application', '@ember/polyfills', '@ember/-internals/routing'], function (exports, _testResolverApplication, _application, _polyfills, _routing) {\n 'use strict';\n\n exports.__esModule = true;\n class AutobootApplicationTestCase extends _testResolverApplication.default {\n createApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, options);\n let 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 let { application } = this;\n\n if (!application) {\n return undefined;\n }\n\n return application.__deprecatedInstance__;\n }\n }\n exports.default = AutobootApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/default-resolver-application', ['exports', 'internal-test-helpers/lib/test-cases/abstract-application', '@ember/application/globals-resolver', '@ember/application', '@ember/-internals/glimmer', '@ember/polyfills', '@ember/-internals/routing'], function (exports, _abstractApplication, _globalsResolver, _application, _glimmer, _polyfills, _routing) {\n 'use strict';\n\n exports.__esModule = true;\n class ApplicationTestCase extends _abstractApplication.default {\n createApplication() {\n let application = this.application = _application.default.create(this.applicationOptions);\n application.Router = _routing.Router.extend(this.routerOptions);\n return application;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n name: 'TestApp',\n autoboot: false,\n Resolver: _globalsResolver.default\n });\n }\n\n afterEach() {\n (0, _glimmer.setTemplates)({});\n return super.afterEach();\n }\n\n get appRouter() {\n return this.applicationInstance.lookup('router:main');\n }\n\n transitionTo() {\n return this.runTask(() => {\n return this.appRouter.transitionTo(...arguments);\n });\n }\n\n addTemplate(name, templateString) {\n let compiled = this.compile(templateString);\n (0, _glimmer.setTemplate)(name, compiled);\n return compiled;\n }\n }\n exports.default = ApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/node-query', ['exports', '@ember/debug', 'internal-test-helpers/lib/system/synthetic-events'], function (exports, _debug, _syntheticEvents) {\n 'use strict';\n\n exports.__esModule = true;\n /* global Node */\n\n class NodeQuery {\n static query(selector, context = document) {\n (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 (0, _debug.assert)('NodeQuery must be initialized with a literal array', Array.isArray(nodes));\n this.nodes = nodes;\n\n for (let i = 0; i < nodes.length; i++) {\n this[i] = nodes[i];\n }\n\n this.length = nodes.length;\n\n Object.freeze(this);\n }\n\n find(selector) {\n assertSingle(this);\n\n return this[0].querySelector(selector);\n }\n\n findAll(selector) {\n let nodes = [];\n\n this.nodes.forEach(node => {\n nodes.push(...node.querySelectorAll(selector));\n });\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 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\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\n return this.nodes[0][name];\n }\n\n setProp(name, value) {\n this.nodes.forEach(node => node[name] = value);\n\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 exports.default = NodeQuery;\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 let out = [];\n\n for (let i = 0; i < nodes.length; i++) {\n out.push(nodes[i]);\n }\n\n return out;\n }\n});","enifed('internal-test-helpers/lib/test-cases/query-param', ['exports', '@ember/controller', '@ember/-internals/routing', '@ember/runloop', 'internal-test-helpers/lib/test-cases/application'], function (exports, _controller, _routing, _runloop, _application) {\n 'use strict';\n\n exports.__esModule = true;\n class QueryParamTestCase extends _application.default {\n constructor() {\n super(...arguments);\n\n let testCase = this;\n testCase.expectedPushURL = null;\n testCase.expectedReplaceURL = null;\n\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 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 setAndFlush(obj, prop, value) {\n return (0, _runloop.run)(obj, 'set', prop, value);\n }\n\n assertCurrentPath(path, message = `current path equals '${path}'`) {\n this.assert.equal(this.appRouter.get('location.path'), path, message);\n }\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 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 /**\n Sets up a Controller for a given route with a custom property/url key mapping.\n @public\n @method setMappedQPController\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 exports.default = QueryParamTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/rendering', ['exports', 'internal-test-helpers/lib/test-cases/abstract-rendering', '@ember/-internals/container'], function (exports, _abstractRendering, _container) {\n 'use strict';\n\n exports.__esModule = true;\n class RenderingTestCase extends _abstractRendering.default {\n constructor() {\n super(...arguments);\n let { owner } = this;\n\n this.env = owner.lookup('service:-glimmer-environment');\n this.templateOptions = owner.lookup(_container.privatize`template-compiler:main`);\n this.compileTimeLookup = this.templateOptions.resolver;\n this.runtimeResolver = this.compileTimeLookup.resolver;\n }\n }\n exports.default = RenderingTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/router', ['exports', 'internal-test-helpers/lib/test-cases/application'], function (exports, _application) {\n 'use strict';\n\n exports.__esModule = true;\n class RouterTestCase extends _application.default {\n constructor() {\n super(...arguments);\n\n this.router.map(function () {\n this.route('parent', { path: '/' }, function () {\n this.route('child');\n this.route('sister');\n this.route('brother');\n });\n this.route('dynamic', { path: '/dynamic/:dynamic_id' });\n this.route('dynamicWithChild', { path: '/dynamic-with-child/:dynamic_id' }, function () {\n this.route('child', { path: '/:child_id' });\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 exports.default = RouterTestCase;\n});","enifed('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', '@ember/polyfills'], function (exports, _abstractApplication, _testResolver, _glimmer, _polyfills) {\n 'use strict';\n\n exports.__esModule = true;\n class TestResolverApplicationTestCase extends _abstractApplication.default {\n get applicationOptions() {\n return (0, _polyfills.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}.hbs`\n }));\n }\n\n addComponent(name, { ComponentClass = _glimmer.Component, template = null }) {\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 exports.default = TestResolverApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-resolver', ['exports', 'ember-template-compiler'], function (exports, _emberTemplateCompiler) {\n 'use strict';\n\n exports.__esModule = true;\n exports.ModuleBasedResolver = undefined;\n\n\n const DELIMITER = '%';\n\n function serializeKey(specifier, source, namespace) {\n let [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 resolve(specifier) {\n return this._registered[specifier] || this._registered[serializeKey(specifier)];\n }\n expandLocalLookup(specifier, source, namespace) {\n if (specifier.indexOf('://') !== -1) {\n return specifier; // an already expanded specifier\n }\n\n if (source || namespace) {\n let key = serializeKey(specifier, source, namespace);\n if (this._registered[key]) {\n return key; // like local lookup\n }\n\n key = serializeKey(specifier);\n if (this._registered[key]) {\n return specifier; // top level resolution despite source/namespace\n }\n }\n\n return specifier; // didn't know how to expand it\n }\n add(lookup, factory) {\n let key;\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 key = serializeKey(lookup);\n break;\n case 'object':\n key = serializeKey(lookup.specifier, lookup.source, lookup.namespace);\n break;\n default:\n throw new Error('Specifier string has an unknown type');\n }\n\n return this._registered[key] = factory;\n }\n addTemplate(templateName, template) {\n let templateType = typeof template;\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 return this._registered[serializeKey(`template:${templateName}`)] = (0, _emberTemplateCompiler.compile)(template, {\n moduleName: `my-app/templates/${templateName}.hbs`\n });\n }\n static create() {\n return new this();\n }\n }\n\n exports.default = Resolver;\n\n\n /*\n * A resolver with moduleBasedResolver = true handles error and loading\n * substates differently than a standard resolver.\n */\n class ModuleBasedResolver extends Resolver {\n get moduleBasedResolver() {\n return true;\n }\n }\n\n exports.ModuleBasedResolver = ModuleBasedResolver;\n});","enifed('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});","/*global enifed, module */\nenifed('node-module', ['exports'], function(_exports) {\n var IS_NODE = typeof module === 'object' && typeof module.require === 'function';\n if (IS_NODE) {\n _exports.require = module.require;\n _exports.module = module;\n _exports.IS_NODE = IS_NODE;\n } else {\n _exports.require = null;\n _exports.module = null;\n _exports.IS_NODE = IS_NODE;\n }\n});\n","enifed(\"route-recognizer\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n var createObject = Object.create;\n function createMap() {\n var map = createObject(null);\n map[\"__\"] = undefined;\n delete map[\"__\"];\n return map;\n }\n\n var Target = function Target(path, matcher, delegate) {\n this.path = path;\n this.matcher = matcher;\n this.delegate = delegate;\n };\n Target.prototype.to = function to(target, callback) {\n var delegate = this.delegate;\n if (delegate && delegate.willAddRoute) {\n target = delegate.willAddRoute(this.matcher.target, target);\n }\n this.matcher.add(this.path, target);\n if (callback) {\n if (callback.length === 0) {\n throw new Error(\"You must have an argument in the function passed to `to`\");\n }\n this.matcher.addChild(this.path, target, callback, this.delegate);\n }\n };\n var Matcher = function Matcher(target) {\n this.routes = createMap();\n this.children = createMap();\n this.target = target;\n };\n Matcher.prototype.add = function add(path, target) {\n this.routes[path] = target;\n };\n Matcher.prototype.addChild = function addChild(path, target, callback, delegate) {\n var matcher = new Matcher(target);\n this.children[path] = matcher;\n var match = generateMatch(path, matcher, delegate);\n if (delegate && delegate.contextEntered) {\n delegate.contextEntered(target, match);\n }\n callback(match);\n };\n function generateMatch(startingPath, matcher, delegate) {\n function match(path, callback) {\n var fullPath = startingPath + path;\n if (callback) {\n callback(generateMatch(fullPath, matcher, delegate));\n } else {\n return new Target(fullPath, matcher, delegate);\n }\n }\n\n return match;\n }\n function addRoute(routeArray, path, handler) {\n var len = 0;\n for (var i = 0; i < routeArray.length; i++) {\n len += routeArray[i].path.length;\n }\n path = path.substr(len);\n var route = { path: path, handler: handler };\n routeArray.push(route);\n }\n function eachRoute(baseRoute, matcher, callback, binding) {\n var routes = matcher.routes;\n var paths = Object.keys(routes);\n for (var i = 0; i < paths.length; i++) {\n var path = paths[i];\n var routeArray = baseRoute.slice();\n addRoute(routeArray, path, routes[path]);\n var nested = matcher.children[path];\n if (nested) {\n eachRoute(routeArray, nested, callback, binding);\n } else {\n callback.call(binding, routeArray);\n }\n }\n }\n var map = function (callback, addRouteCallback) {\n var matcher = new Matcher();\n callback(generateMatch(\"\", matcher, this.delegate));\n eachRoute([], matcher, function (routes) {\n if (addRouteCallback) {\n addRouteCallback(this, routes);\n } else {\n this.add(routes);\n }\n }, this);\n };\n\n // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n // values that are not reserved (i.e., unicode characters, emoji, etc). The reserved\n // chars are \"/\" and \"%\".\n // Safe to call multiple times on the same path.\n // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n function normalizePath(path) {\n return path.split(\"/\").map(normalizeSegment).join(\"/\");\n }\n // We want to ensure the characters \"%\" and \"/\" remain in percent-encoded\n // form when normalizing paths, so replace them with their encoded form after\n // decoding the rest of the path\n var SEGMENT_RESERVED_CHARS = /%|\\//g;\n function normalizeSegment(segment) {\n if (segment.length < 3 || segment.indexOf(\"%\") === -1) {\n return segment;\n }\n return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);\n }\n // We do not want to encode these characters when generating dynamic path segments\n // See https://tools.ietf.org/html/rfc3986#section-3.3\n // sub-delims: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n // others allowed by RFC 3986: \":\", \"@\"\n //\n // First encode the entire path segment, then decode any of the encoded special chars.\n //\n // The chars \"!\", \"'\", \"(\", \")\", \"*\" do not get changed by `encodeURIComponent`,\n // so the possible encoded chars are:\n // ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].\n var PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;\n function encodePathSegment(str) {\n return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);\n }\n\n var escapeRegex = /(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)/g;\n var isArray = Array.isArray;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n function getParam(params, key) {\n if (typeof params !== \"object\" || params === null) {\n throw new Error(\"You must pass an object as the second argument to `generate`.\");\n }\n if (!hasOwnProperty.call(params, key)) {\n throw new Error(\"You must provide param `\" + key + \"` to `generate`.\");\n }\n var value = params[key];\n var str = typeof value === \"string\" ? value : \"\" + value;\n if (str.length === 0) {\n throw new Error(\"You must provide a param `\" + key + \"`.\");\n }\n return str;\n }\n var eachChar = [];\n eachChar[0 /* Static */] = function (segment, currentState) {\n var state = currentState;\n var value = segment.value;\n for (var i = 0; i < value.length; i++) {\n var ch = value.charCodeAt(i);\n state = state.put(ch, false, false);\n }\n return state;\n };\n eachChar[1 /* Dynamic */] = function (_, currentState) {\n return currentState.put(47 /* SLASH */, true, true);\n };\n eachChar[2 /* Star */] = function (_, currentState) {\n return currentState.put(-1 /* ANY */, false, true);\n };\n eachChar[4 /* Epsilon */] = function (_, currentState) {\n return currentState;\n };\n var regex = [];\n regex[0 /* Static */] = function (segment) {\n return segment.value.replace(escapeRegex, \"\\\\$1\");\n };\n regex[1 /* Dynamic */] = function () {\n return \"([^/]+)\";\n };\n regex[2 /* Star */] = function () {\n return \"(.+)\";\n };\n regex[4 /* Epsilon */] = function () {\n return \"\";\n };\n var generate = [];\n generate[0 /* Static */] = function (segment) {\n return segment.value;\n };\n generate[1 /* Dynamic */] = function (segment, params) {\n var value = getParam(params, segment.value);\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n return encodePathSegment(value);\n } else {\n return value;\n }\n };\n generate[2 /* Star */] = function (segment, params) {\n return getParam(params, segment.value);\n };\n generate[4 /* Epsilon */] = function () {\n return \"\";\n };\n var EmptyObject = Object.freeze({});\n var EmptyArray = Object.freeze([]);\n // The `names` will be populated with the paramter name for each dynamic/star\n // segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star\n // segment, indicating whether it should be decoded during recognition.\n function parse(segments, route, types) {\n // normalize route as not starting with a \"/\". Recognition will\n // also normalize.\n if (route.length > 0 && route.charCodeAt(0) === 47 /* SLASH */) {\n route = route.substr(1);\n }\n var parts = route.split(\"/\");\n var names = undefined;\n var shouldDecodes = undefined;\n for (var i = 0; i < parts.length; i++) {\n var part = parts[i];\n var flags = 0;\n var type = 0;\n if (part === \"\") {\n type = 4 /* Epsilon */;\n } else if (part.charCodeAt(0) === 58 /* COLON */) {\n type = 1 /* Dynamic */;\n } else if (part.charCodeAt(0) === 42 /* STAR */) {\n type = 2 /* Star */;\n } else {\n type = 0 /* Static */;\n }\n flags = 2 << type;\n if (flags & 12 /* Named */) {\n part = part.slice(1);\n names = names || [];\n names.push(part);\n shouldDecodes = shouldDecodes || [];\n shouldDecodes.push((flags & 4 /* Decoded */) !== 0);\n }\n if (flags & 14 /* Counted */) {\n types[type]++;\n }\n segments.push({\n type: type,\n value: normalizeSegment(part)\n });\n }\n return {\n names: names || EmptyArray,\n shouldDecodes: shouldDecodes || EmptyArray\n };\n }\n function isEqualCharSpec(spec, char, negate) {\n return spec.char === char && spec.negate === negate;\n }\n // A State has a character specification and (`charSpec`) and a list of possible\n // subsequent states (`nextStates`).\n //\n // If a State is an accepting state, it will also have several additional\n // properties:\n //\n // * `regex`: A regular expression that is used to extract parameters from paths\n // that reached this accepting state.\n // * `handlers`: Information on how to convert the list of captures into calls\n // to registered handlers with the specified parameters\n // * `types`: How many static, dynamic or star segments in this route. Used to\n // decide which route to use if multiple registered routes match a path.\n //\n // Currently, State is implemented naively by looping over `nextStates` and\n // comparing a character specification against a character. A more efficient\n // implementation would use a hash of keys pointing at one or more next states.\n var State = function State(states, id, char, negate, repeat) {\n this.states = states;\n this.id = id;\n this.char = char;\n this.negate = negate;\n this.nextStates = repeat ? id : null;\n this.pattern = \"\";\n this._regex = undefined;\n this.handlers = undefined;\n this.types = undefined;\n };\n State.prototype.regex = function regex$1() {\n if (!this._regex) {\n this._regex = new RegExp(this.pattern);\n }\n return this._regex;\n };\n State.prototype.get = function get(char, negate) {\n var this$1 = this;\n\n var nextStates = this.nextStates;\n if (nextStates === null) {\n return;\n }\n if (isArray(nextStates)) {\n for (var i = 0; i < nextStates.length; i++) {\n var child = this$1.states[nextStates[i]];\n if (isEqualCharSpec(child, char, negate)) {\n return child;\n }\n }\n } else {\n var child$1 = this.states[nextStates];\n if (isEqualCharSpec(child$1, char, negate)) {\n return child$1;\n }\n }\n };\n State.prototype.put = function put(char, negate, repeat) {\n var state;\n // If the character specification already exists in a child of the current\n // state, just return that state.\n if (state = this.get(char, negate)) {\n return state;\n }\n // Make a new state for the character spec\n var states = this.states;\n state = new State(states, states.length, char, negate, repeat);\n states[states.length] = state;\n // Insert the new state as a child of the current state\n if (this.nextStates == null) {\n this.nextStates = state.id;\n } else if (isArray(this.nextStates)) {\n this.nextStates.push(state.id);\n } else {\n this.nextStates = [this.nextStates, state.id];\n }\n // Return the new state\n return state;\n };\n // Find a list of child states matching the next character\n State.prototype.match = function match(ch) {\n var this$1 = this;\n\n var nextStates = this.nextStates;\n if (!nextStates) {\n return [];\n }\n var returned = [];\n if (isArray(nextStates)) {\n for (var i = 0; i < nextStates.length; i++) {\n var child = this$1.states[nextStates[i]];\n if (isMatch(child, ch)) {\n returned.push(child);\n }\n }\n } else {\n var child$1 = this.states[nextStates];\n if (isMatch(child$1, ch)) {\n returned.push(child$1);\n }\n }\n return returned;\n };\n function isMatch(spec, char) {\n return spec.negate ? spec.char !== char && spec.char !== -1 /* ANY */ : spec.char === char || spec.char === -1 /* ANY */;\n }\n // This is a somewhat naive strategy, but should work in a lot of cases\n // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n //\n // This strategy generally prefers more static and less dynamic matching.\n // Specifically, it\n //\n // * prefers fewer stars to more, then\n // * prefers using stars for less of the match to more, then\n // * prefers fewer dynamic segments to more, then\n // * prefers more static segments to more\n function sortSolutions(states) {\n return states.sort(function (a, b) {\n var ref = a.types || [0, 0, 0];\n var astatics = ref[0];\n var adynamics = ref[1];\n var astars = ref[2];\n var ref$1 = b.types || [0, 0, 0];\n var bstatics = ref$1[0];\n var bdynamics = ref$1[1];\n var bstars = ref$1[2];\n if (astars !== bstars) {\n return astars - bstars;\n }\n if (astars) {\n if (astatics !== bstatics) {\n return bstatics - astatics;\n }\n if (adynamics !== bdynamics) {\n return bdynamics - adynamics;\n }\n }\n if (adynamics !== bdynamics) {\n return adynamics - bdynamics;\n }\n if (astatics !== bstatics) {\n return bstatics - astatics;\n }\n return 0;\n });\n }\n function recognizeChar(states, ch) {\n var nextStates = [];\n for (var i = 0, l = states.length; i < l; i++) {\n var state = states[i];\n nextStates = nextStates.concat(state.match(ch));\n }\n return nextStates;\n }\n var RecognizeResults = function RecognizeResults(queryParams) {\n this.length = 0;\n this.queryParams = queryParams || {};\n };\n\n RecognizeResults.prototype.splice = Array.prototype.splice;\n RecognizeResults.prototype.slice = Array.prototype.slice;\n RecognizeResults.prototype.push = Array.prototype.push;\n function findHandler(state, originalPath, queryParams) {\n var handlers = state.handlers;\n var regex = state.regex();\n if (!regex || !handlers) {\n throw new Error(\"state not initialized\");\n }\n var captures = originalPath.match(regex);\n var currentCapture = 1;\n var result = new RecognizeResults(queryParams);\n result.length = handlers.length;\n for (var i = 0; i < handlers.length; i++) {\n var handler = handlers[i];\n var names = handler.names;\n var shouldDecodes = handler.shouldDecodes;\n var params = EmptyObject;\n var isDynamic = false;\n if (names !== EmptyArray && shouldDecodes !== EmptyArray) {\n for (var j = 0; j < names.length; j++) {\n isDynamic = true;\n var name = names[j];\n var capture = captures && captures[currentCapture++];\n if (params === EmptyObject) {\n params = {};\n }\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {\n params[name] = capture && decodeURIComponent(capture);\n } else {\n params[name] = capture;\n }\n }\n }\n result[i] = {\n handler: handler.handler,\n params: params,\n isDynamic: isDynamic\n };\n }\n return result;\n }\n function decodeQueryParamPart(part) {\n // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n part = part.replace(/\\+/gm, \"%20\");\n var result;\n try {\n result = decodeURIComponent(part);\n } catch (error) {\n result = \"\";\n }\n return result;\n }\n var RouteRecognizer = function RouteRecognizer() {\n this.names = createMap();\n var states = [];\n var state = new State(states, 0, -1 /* ANY */, true, false);\n states[0] = state;\n this.states = states;\n this.rootState = state;\n };\n RouteRecognizer.prototype.add = function add(routes, options) {\n var currentState = this.rootState;\n var pattern = \"^\";\n var types = [0, 0, 0];\n var handlers = new Array(routes.length);\n var allSegments = [];\n var isEmpty = true;\n var j = 0;\n for (var i = 0; i < routes.length; i++) {\n var route = routes[i];\n var ref = parse(allSegments, route.path, types);\n var names = ref.names;\n var shouldDecodes = ref.shouldDecodes;\n // preserve j so it points to the start of newly added segments\n for (; j < allSegments.length; j++) {\n var segment = allSegments[j];\n if (segment.type === 4 /* Epsilon */) {\n continue;\n }\n isEmpty = false;\n // Add a \"/\" for the new segment\n currentState = currentState.put(47 /* SLASH */, false, false);\n pattern += \"/\";\n // Add a representation of the segment to the NFA and regex\n currentState = eachChar[segment.type](segment, currentState);\n pattern += regex[segment.type](segment);\n }\n handlers[i] = {\n handler: route.handler,\n names: names,\n shouldDecodes: shouldDecodes\n };\n }\n if (isEmpty) {\n currentState = currentState.put(47 /* SLASH */, false, false);\n pattern += \"/\";\n }\n currentState.handlers = handlers;\n currentState.pattern = pattern + \"$\";\n currentState.types = types;\n var name;\n if (typeof options === \"object\" && options !== null && options.as) {\n name = options.as;\n }\n if (name) {\n // if (this.names[name]) {\n // throw new Error(\"You may not add a duplicate route named `\" + name + \"`.\");\n // }\n this.names[name] = {\n segments: allSegments,\n handlers: handlers\n };\n }\n };\n RouteRecognizer.prototype.handlersFor = function handlersFor(name) {\n var route = this.names[name];\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n var result = new Array(route.handlers.length);\n for (var i = 0; i < route.handlers.length; i++) {\n var handler = route.handlers[i];\n result[i] = handler;\n }\n return result;\n };\n RouteRecognizer.prototype.hasRoute = function hasRoute(name) {\n return !!this.names[name];\n };\n RouteRecognizer.prototype.generate = function generate$1(name, params) {\n var route = this.names[name];\n var output = \"\";\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n var segments = route.segments;\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n if (segment.type === 4 /* Epsilon */) {\n continue;\n }\n output += \"/\";\n output += generate[segment.type](segment, params);\n }\n if (output.charAt(0) !== \"/\") {\n output = \"/\" + output;\n }\n if (params && params.queryParams) {\n output += this.generateQueryString(params.queryParams);\n }\n return output;\n };\n RouteRecognizer.prototype.generateQueryString = function generateQueryString(params) {\n var pairs = [];\n var keys = Object.keys(params);\n keys.sort();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = params[key];\n if (value == null) {\n continue;\n }\n var pair = encodeURIComponent(key);\n if (isArray(value)) {\n for (var j = 0; j < value.length; j++) {\n var arrayPair = key + \"[]\" + \"=\" + encodeURIComponent(value[j]);\n pairs.push(arrayPair);\n }\n } else {\n pair += \"=\" + encodeURIComponent(value);\n pairs.push(pair);\n }\n }\n if (pairs.length === 0) {\n return \"\";\n }\n return \"?\" + pairs.join(\"&\");\n };\n RouteRecognizer.prototype.parseQueryString = function parseQueryString(queryString) {\n var pairs = queryString.split(\"&\");\n var queryParams = {};\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i].split(\"=\"),\n key = decodeQueryParamPart(pair[0]),\n keyLength = key.length,\n isArray = false,\n value = void 0;\n if (pair.length === 1) {\n value = \"true\";\n } else {\n // Handle arrays\n if (keyLength > 2 && key.slice(keyLength - 2) === \"[]\") {\n isArray = true;\n key = key.slice(0, keyLength - 2);\n if (!queryParams[key]) {\n queryParams[key] = [];\n }\n }\n value = pair[1] ? decodeQueryParamPart(pair[1]) : \"\";\n }\n if (isArray) {\n queryParams[key].push(value);\n } else {\n queryParams[key] = value;\n }\n }\n return queryParams;\n };\n RouteRecognizer.prototype.recognize = function recognize(path) {\n var results;\n var states = [this.rootState];\n var queryParams = {};\n var isSlashDropped = false;\n var hashStart = path.indexOf(\"#\");\n if (hashStart !== -1) {\n path = path.substr(0, hashStart);\n }\n var queryStart = path.indexOf(\"?\");\n if (queryStart !== -1) {\n var queryString = path.substr(queryStart + 1, path.length);\n path = path.substr(0, queryStart);\n queryParams = this.parseQueryString(queryString);\n }\n if (path.charAt(0) !== \"/\") {\n path = \"/\" + path;\n }\n var originalPath = path;\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n path = normalizePath(path);\n } else {\n path = decodeURI(path);\n originalPath = decodeURI(originalPath);\n }\n var pathLen = path.length;\n if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n path = path.substr(0, pathLen - 1);\n originalPath = originalPath.substr(0, originalPath.length - 1);\n isSlashDropped = true;\n }\n for (var i = 0; i < path.length; i++) {\n states = recognizeChar(states, path.charCodeAt(i));\n if (!states.length) {\n break;\n }\n }\n var solutions = [];\n for (var i$1 = 0; i$1 < states.length; i$1++) {\n if (states[i$1].handlers) {\n solutions.push(states[i$1]);\n }\n }\n states = sortSolutions(solutions);\n var state = solutions[0];\n if (state && state.handlers) {\n // if a trailing slash was dropped and a star segment is the last segment\n // specified, put the trailing slash back\n if (isSlashDropped && state.pattern && state.pattern.slice(-5) === \"(.+)$\") {\n originalPath = originalPath + \"/\";\n }\n results = findHandler(state, originalPath, queryParams);\n }\n return results;\n };\n RouteRecognizer.VERSION = \"0.3.4\";\n // Set to false to opt-out of encoding and decoding path segments.\n // See https://github.com/tildeio/route-recognizer/pull/55\n RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS = true;\n RouteRecognizer.Normalizer = {\n normalizeSegment: normalizeSegment, normalizePath: normalizePath, encodePathSegment: encodePathSegment\n };\n RouteRecognizer.prototype.map = map;\n\n exports.default = RouteRecognizer;\n});","enifed('router_js', ['exports', 'rsvp', 'route-recognizer'], function (exports, _rsvp, _routeRecognizer) {\n 'use strict';\n\n exports.__esModule = true;\n exports.InternalRouteInfo = exports.TransitionError = exports.TransitionState = exports.QUERY_PARAMS_SYMBOL = exports.PARAMS_SYMBOL = exports.STATE_SYMBOL = exports.logAbort = exports.InternalTransition = undefined;\n\n\n const TransitionAbortedError = function () {\n TransitionAbortedError.prototype = Object.create(Error.prototype);\n TransitionAbortedError.prototype.constructor = TransitionAbortedError;\n function TransitionAbortedError(message) {\n let error = Error.call(this, message);\n this.name = 'TransitionAborted';\n this.message = message || 'TransitionAborted';\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TransitionAbortedError);\n } else {\n this.stack = error.stack;\n }\n }\n return TransitionAbortedError;\n }();\n\n const slice = Array.prototype.slice;\n const hasOwnProperty = Object.prototype.hasOwnProperty;\n /**\n Determines if an object is Promise by checking if it is \"thenable\".\n **/\n function isPromise(p) {\n return p !== null && typeof p === 'object' && typeof p.then === 'function';\n }\n function merge(hash, other) {\n for (let prop in other) {\n if (hasOwnProperty.call(other, prop)) {\n hash[prop] = other[prop];\n }\n }\n }\n /**\n @private\n \n Extracts query params from the end of an array\n **/\n function extractQueryParams(array) {\n let len = array && array.length,\n head,\n queryParams;\n if (len && len > 0) {\n let obj = array[len - 1];\n if (isQueryParams(obj)) {\n queryParams = obj.queryParams;\n head = slice.call(array, 0, len - 1);\n return [head, queryParams];\n }\n }\n return [array, null];\n }\n function isQueryParams(obj) {\n return obj && hasOwnProperty.call(obj, 'queryParams');\n }\n /**\n @private\n \n Coerces query param properties and array elements into strings.\n **/\n function coerceQueryParamsToString(queryParams) {\n for (let key in queryParams) {\n let val = queryParams[key];\n if (typeof val === 'number') {\n queryParams[key] = '' + val;\n } else if (Array.isArray(val)) {\n for (let i = 0, l = val.length; i < l; i++) {\n val[i] = '' + val[i];\n }\n }\n }\n }\n /**\n @private\n */\n function log(router, ...args) {\n if (!router.log) {\n return;\n }\n if (arguments.length === 2) {\n let [sequence, msg] = args;\n router.log('Transition #' + sequence + ': ' + msg);\n } else {\n let [msg] = args;\n router.log(msg);\n }\n }\n function isParam(object) {\n return typeof object === 'string' || object instanceof String || typeof object === 'number' || object instanceof Number;\n }\n function forEach(array, callback) {\n for (let i = 0, l = array.length; i < l && callback(array[i]) !== false; i++) {\n // empty intentionally\n }\n }\n function getChangelist(oldObject, newObject) {\n let key;\n let results = {\n all: {},\n changed: {},\n removed: {}\n };\n merge(results.all, newObject);\n let didChange = false;\n coerceQueryParamsToString(oldObject);\n coerceQueryParamsToString(newObject);\n // Calculate removals\n for (key in oldObject) {\n if (hasOwnProperty.call(oldObject, key)) {\n if (!hasOwnProperty.call(newObject, key)) {\n didChange = true;\n results.removed[key] = oldObject[key];\n }\n }\n }\n // Calculate changes\n for (key in newObject) {\n if (hasOwnProperty.call(newObject, key)) {\n let oldElement = oldObject[key];\n let newElement = newObject[key];\n if (isArray(oldElement) && isArray(newElement)) {\n if (oldElement.length !== newElement.length) {\n results.changed[key] = newObject[key];\n didChange = true;\n } else {\n for (let i = 0, l = oldElement.length; i < l; i++) {\n if (oldElement[i] !== newElement[i]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n } else if (oldObject[key] !== newObject[key]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n return didChange ? results : undefined;\n }\n function isArray(obj) {\n return Array.isArray(obj);\n }\n function promiseLabel(label) {\n return 'Router: ' + label;\n }\n\n const STATE_SYMBOL = `__STATE__-2619860001345920-3322w3`;\n const PARAMS_SYMBOL = `__PARAMS__-261986232992830203-23323`;\n const QUERY_PARAMS_SYMBOL = `__QPS__-2619863929824844-32323`;\n /**\n A Transition is a thennable (a promise-like object) that represents\n an attempt to transition to another route. It can be aborted, either\n explicitly via `abort` or by attempting another transition while a\n previous one is still underway. An aborted transition can also\n be `retry()`d later.\n \n @class Transition\n @constructor\n @param {Object} router\n @param {Object} intent\n @param {Object} state\n @param {Object} error\n @private\n */\n class Transition {\n constructor(router, intent, state, error = undefined, previousTransition = undefined) {\n this.from = null;\n this.to = undefined;\n this.isAborted = false;\n this.isActive = true;\n this.urlMethod = 'update';\n this.resolveIndex = 0;\n this.queryParamsOnly = false;\n this.isTransition = true;\n this.isCausedByAbortingTransition = false;\n this.isCausedByInitialTransition = false;\n this.isCausedByAbortingReplaceTransition = false;\n this._visibleQueryParams = {};\n this[STATE_SYMBOL] = state || router.state;\n this.intent = intent;\n this.router = router;\n this.data = intent && intent.data || {};\n this.resolvedModels = {};\n this[QUERY_PARAMS_SYMBOL] = {};\n this.promise = undefined;\n this.error = undefined;\n this[PARAMS_SYMBOL] = {};\n this.routeInfos = [];\n this.targetName = undefined;\n this.pivotHandler = undefined;\n this.sequence = -1;\n if (error) {\n this.promise = _rsvp.Promise.reject(error);\n this.error = error;\n return;\n }\n // if you're doing multiple redirects, need the new transition to know if it\n // is actually part of the first transition or not. Any further redirects\n // in the initial transition also need to know if they are part of the\n // initial transition\n this.isCausedByAbortingTransition = !!previousTransition;\n this.isCausedByInitialTransition = !!previousTransition && (previousTransition.isCausedByInitialTransition || previousTransition.sequence === 0);\n // Every transition in the chain is a replace\n this.isCausedByAbortingReplaceTransition = !!previousTransition && previousTransition.urlMethod === 'replace' && (!previousTransition.isCausedByAbortingTransition || previousTransition.isCausedByAbortingReplaceTransition);\n if (state) {\n this[PARAMS_SYMBOL] = state.params;\n this[QUERY_PARAMS_SYMBOL] = state.queryParams;\n this.routeInfos = state.routeInfos;\n let len = state.routeInfos.length;\n if (len) {\n this.targetName = state.routeInfos[len - 1].name;\n }\n for (let i = 0; i < len; ++i) {\n let handlerInfo = state.routeInfos[i];\n // TODO: this all seems hacky\n if (!handlerInfo.isResolved) {\n break;\n }\n this.pivotHandler = handlerInfo.route;\n }\n this.sequence = router.currentSequence++;\n this.promise = state.resolve(() => {\n if (this.isAborted) {\n return _rsvp.Promise.reject(false, promiseLabel('Transition aborted - reject'));\n }\n return _rsvp.Promise.resolve(true);\n }, this).catch(result => {\n return _rsvp.Promise.reject(this.router.transitionDidError(result, this));\n }, promiseLabel('Handle Abort'));\n } else {\n this.promise = _rsvp.Promise.resolve(this[STATE_SYMBOL]);\n this[PARAMS_SYMBOL] = {};\n }\n }\n /**\n The Transition's internal promise. Calling `.then` on this property\n is that same as calling `.then` on the Transition object itself, but\n this property is exposed for when you want to pass around a\n Transition's promise, but not the Transition object itself, since\n Transition object can be externally `abort`ed, while the promise\n cannot.\n @property promise\n @type {Object}\n @public\n */\n /**\n Custom state can be stored on a Transition's `data` object.\n This can be useful for decorating a Transition within an earlier\n hook and shared with a later hook. Properties set on `data` will\n be copied to new transitions generated by calling `retry` on this\n transition.\n @property data\n @type {Object}\n @public\n */\n /**\n A standard promise hook that resolves if the transition\n succeeds and rejects if it fails/redirects/aborts.\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n then(onFulfilled, onRejected, label) {\n return this.promise.then(onFulfilled, onRejected, label);\n }\n /**\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n catch(onRejection, label) {\n return this.promise.catch(onRejection, label);\n }\n /**\n Forwards to the internal `promise` property which you can\n use in situations where you want to pass around a thennable,\n but not the Transition itself.\n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n @public\n */\n finally(callback, label) {\n return this.promise.finally(callback, label);\n }\n /**\n Aborts the Transition. Note you can also implicitly abort a transition\n by initiating another transition while a previous one is underway.\n @method abort\n @return {Transition} this transition\n @public\n */\n abort() {\n this.rollback();\n let transition = new Transition(this.router, undefined, undefined, undefined);\n transition.to = this.from;\n transition.from = this.from;\n transition.isAborted = true;\n this.router.routeWillChange(transition);\n this.router.routeDidChange(transition);\n return this;\n }\n rollback() {\n if (!this.isAborted) {\n log(this.router, this.sequence, this.targetName + ': transition was aborted');\n if (this.intent !== undefined && this.intent !== null) {\n this.intent.preTransitionState = this.router.state;\n }\n this.isAborted = true;\n this.isActive = false;\n this.router.activeTransition = undefined;\n }\n }\n redirect(newTransition) {\n this.rollback();\n this.router.routeWillChange(newTransition);\n }\n /**\n Retries a previously-aborted transition (making sure to abort the\n transition if it's still active). Returns a new transition that\n represents the new attempt to transition.\n @method retry\n @return {Transition} new transition\n @public\n */\n retry() {\n // TODO: add tests for merged state retry()s\n this.abort();\n let newTransition = this.router.transitionByIntent(this.intent, false);\n // inheriting a `null` urlMethod is not valid\n // the urlMethod is only set to `null` when\n // the transition is initiated *after* the url\n // has been updated (i.e. `router.handleURL`)\n //\n // in that scenario, the url method cannot be\n // inherited for a new transition because then\n // the url would not update even though it should\n if (this.urlMethod !== null) {\n newTransition.method(this.urlMethod);\n }\n return newTransition;\n }\n /**\n Sets the URL-changing method to be employed at the end of a\n successful transition. By default, a new Transition will just\n use `updateURL`, but passing 'replace' to this method will\n cause the URL to update using 'replaceWith' instead. Omitting\n a parameter will disable the URL change, allowing for transitions\n that don't update the URL at completion (this is also used for\n handleURL, since the URL has already changed before the\n transition took place).\n @method method\n @param {String} method the type of URL-changing method to use\n at the end of a transition. Accepted values are 'replace',\n falsy values, or any other non-falsy value (which is\n interpreted as an updateURL transition).\n @return {Transition} this transition\n @public\n */\n method(method) {\n this.urlMethod = method;\n return this;\n }\n // Alias 'trigger' as 'send'\n send(ignoreFailure, _name, err, transition, handler) {\n this.trigger(ignoreFailure, _name, err, transition, handler);\n }\n /**\n Fires an event on the current list of resolved/resolving\n handlers within this transition. Useful for firing events\n on route hierarchies that haven't fully been entered yet.\n Note: This method is also aliased as `send`\n @method trigger\n @param {Boolean} [ignoreFailure=false] a boolean specifying whether unhandled events throw an error\n @param {String} name the name of the event to fire\n @public\n */\n trigger(ignoreFailure, name, ...args) {\n this.router.triggerEvent(this[STATE_SYMBOL].routeInfos.slice(0, this.resolveIndex + 1), ignoreFailure, name, args);\n }\n /**\n Transitions are aborted and their promises rejected\n when redirects occur; this method returns a promise\n that will follow any redirects that occur and fulfill\n with the value fulfilled by any redirecting transitions\n that occur.\n @method followRedirects\n @return {Promise} a promise that fulfills with the same\n value that the final redirecting transition fulfills with\n @public\n */\n followRedirects() {\n let router = this.router;\n return this.promise.catch(function (reason) {\n if (router.activeTransition) {\n return router.activeTransition.followRedirects();\n }\n return _rsvp.Promise.reject(reason);\n });\n }\n toString() {\n return 'Transition (sequence ' + this.sequence + ')';\n }\n /**\n @private\n */\n log(message) {\n log(this.router, this.sequence, message);\n }\n }\n /**\n @private\n \n Logs and returns an instance of TransitionAborted.\n */\n function logAbort(transition) {\n log(transition.router, transition.sequence, 'detected abort.');\n return new TransitionAbortedError();\n }\n function isTransition(obj) {\n return typeof obj === 'object' && obj instanceof Transition && obj.isTransition;\n }\n function prepareResult(obj) {\n if (isTransition(obj)) {\n return null;\n }\n return obj;\n }\n\n let ROUTE_INFOS = new WeakMap();\n function toReadOnlyRouteInfo(routeInfos, queryParams = {}, includeAttributes = false) {\n return routeInfos.map((info, i) => {\n let { name, params, paramNames, context } = info;\n if (ROUTE_INFOS.has(info) && includeAttributes) {\n let routeInfo = ROUTE_INFOS.get(info);\n let routeInfoWithAttribute = createRouteInfoWithAttributes(routeInfo, context);\n ROUTE_INFOS.set(info, routeInfoWithAttribute);\n return routeInfoWithAttribute;\n }\n let routeInfo = {\n find(predicate, thisArg) {\n let publicInfo;\n let arr = [];\n if (predicate.length === 3) {\n arr = routeInfos.map(info => ROUTE_INFOS.get(info));\n }\n for (let i = 0; routeInfos.length > i; i++) {\n publicInfo = ROUTE_INFOS.get(routeInfos[i]);\n if (predicate.call(thisArg, publicInfo, i, arr)) {\n return publicInfo;\n }\n }\n return undefined;\n },\n get name() {\n return name;\n },\n get paramNames() {\n return paramNames;\n },\n get parent() {\n let parent = routeInfos[i - 1];\n if (parent === undefined) {\n return null;\n }\n return ROUTE_INFOS.get(parent);\n },\n get child() {\n let child = routeInfos[i + 1];\n if (child === undefined) {\n return null;\n }\n return ROUTE_INFOS.get(child);\n },\n get localName() {\n let parts = this.name.split('.');\n return parts[parts.length - 1];\n },\n get params() {\n return params;\n },\n get queryParams() {\n return queryParams;\n }\n };\n if (includeAttributes) {\n routeInfo = createRouteInfoWithAttributes(routeInfo, context);\n }\n ROUTE_INFOS.set(info, routeInfo);\n return routeInfo;\n });\n }\n function createRouteInfoWithAttributes(routeInfo, context) {\n let attributes = {\n get attributes() {\n return context;\n }\n };\n if (Object.isFrozen(routeInfo) || routeInfo.hasOwnProperty('attributes')) {\n return Object.assign({}, routeInfo, attributes);\n }\n return Object.assign(routeInfo, attributes);\n }\n class InternalRouteInfo {\n constructor(router, name, paramNames, route) {\n this._routePromise = undefined;\n this._route = null;\n this.params = {};\n this.isResolved = false;\n this.name = name;\n this.paramNames = paramNames;\n this.router = router;\n if (route) {\n this._processRoute(route);\n }\n }\n getModel(_transition) {\n return _rsvp.Promise.resolve(this.context);\n }\n serialize(_context) {\n return this.params || {};\n }\n resolve(shouldContinue, transition) {\n return _rsvp.Promise.resolve(this.routePromise).then(route => this.checkForAbort(shouldContinue, route)).then(() => this.runBeforeModelHook(transition)).then(() => this.checkForAbort(shouldContinue, null)).then(() => this.getModel(transition)).then(resolvedModel => this.checkForAbort(shouldContinue, resolvedModel)).then(resolvedModel => this.runAfterModelHook(transition, resolvedModel)).then(resolvedModel => this.becomeResolved(transition, resolvedModel));\n }\n becomeResolved(transition, resolvedContext) {\n let params = this.serialize(resolvedContext);\n if (transition) {\n this.stashResolvedModel(transition, resolvedContext);\n transition[PARAMS_SYMBOL] = transition[PARAMS_SYMBOL] || {};\n transition[PARAMS_SYMBOL][this.name] = params;\n }\n let context;\n let contextsMatch = resolvedContext === this.context;\n if ('context' in this || !contextsMatch) {\n context = resolvedContext;\n }\n let cached = ROUTE_INFOS.get(this);\n let resolved = new ResolvedRouteInfo(this.router, this.name, this.paramNames, params, this.route, context);\n if (cached !== undefined) {\n ROUTE_INFOS.set(resolved, cached);\n }\n return resolved;\n }\n shouldSupercede(routeInfo) {\n // Prefer this newer routeInfo over `other` if:\n // 1) The other one doesn't exist\n // 2) The names don't match\n // 3) This route has a context that doesn't match\n // the other one (or the other one doesn't have one).\n // 4) This route has parameters that don't match the other.\n if (!routeInfo) {\n return true;\n }\n let contextsMatch = routeInfo.context === this.context;\n return routeInfo.name !== this.name || 'context' in this && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, routeInfo.params);\n }\n get route() {\n // _route could be set to either a route object or undefined, so we\n // compare against null to know when it's been set\n if (this._route !== null) {\n return this._route;\n }\n return this.fetchRoute();\n }\n set route(route) {\n this._route = route;\n }\n get routePromise() {\n if (this._routePromise) {\n return this._routePromise;\n }\n this.fetchRoute();\n return this._routePromise;\n }\n set routePromise(routePromise) {\n this._routePromise = routePromise;\n }\n log(transition, message) {\n if (transition.log) {\n transition.log(this.name + ': ' + message);\n }\n }\n updateRoute(route) {\n return this.route = route;\n }\n runBeforeModelHook(transition) {\n if (transition.trigger) {\n transition.trigger(true, 'willResolveModel', transition, this.route);\n }\n let result;\n if (this.route) {\n if (this.route.beforeModel !== undefined) {\n result = this.route.beforeModel(transition);\n }\n }\n if (isTransition(result)) {\n result = null;\n }\n return _rsvp.Promise.resolve(result);\n }\n runAfterModelHook(transition, resolvedModel) {\n // Stash the resolved model on the payload.\n // This makes it possible for users to swap out\n // the resolved model in afterModel.\n let name = this.name;\n this.stashResolvedModel(transition, resolvedModel);\n let result;\n if (this.route !== undefined) {\n if (this.route.afterModel !== undefined) {\n result = this.route.afterModel(resolvedModel, transition);\n }\n }\n result = prepareResult(result);\n return _rsvp.Promise.resolve(result).then(() => {\n // Ignore the fulfilled value returned from afterModel.\n // Return the value stashed in resolvedModels, which\n // might have been swapped out in afterModel.\n return transition.resolvedModels[name];\n });\n }\n checkForAbort(shouldContinue, value) {\n return _rsvp.Promise.resolve(shouldContinue()).then(function () {\n // We don't care about shouldContinue's resolve value;\n // pass along the original value passed to this fn.\n return value;\n }, null);\n }\n stashResolvedModel(transition, resolvedModel) {\n transition.resolvedModels = transition.resolvedModels || {};\n transition.resolvedModels[this.name] = resolvedModel;\n }\n fetchRoute() {\n let route = this.router.getRoute(this.name);\n return this._processRoute(route);\n }\n _processRoute(route) {\n // Setup a routePromise so that we can wait for asynchronously loaded routes\n this.routePromise = _rsvp.Promise.resolve(route);\n // Wait until the 'route' property has been updated when chaining to a route\n // that is a promise\n if (isPromise(route)) {\n this.routePromise = this.routePromise.then(r => {\n return this.updateRoute(r);\n });\n // set to undefined to avoid recursive loop in the route getter\n return this.route = undefined;\n } else if (route) {\n return this.updateRoute(route);\n }\n return undefined;\n }\n }\n class ResolvedRouteInfo extends InternalRouteInfo {\n constructor(router, name, paramNames, params, route, context) {\n super(router, name, paramNames, route);\n this.params = params;\n this.isResolved = true;\n this.context = context;\n }\n resolve(_shouldContinue, transition) {\n // A ResolvedRouteInfo just resolved with itself.\n if (transition && transition.resolvedModels) {\n transition.resolvedModels[this.name] = this.context;\n }\n return _rsvp.Promise.resolve(this);\n }\n }\n class UnresolvedRouteInfoByParam extends InternalRouteInfo {\n constructor(router, name, paramNames, params, route) {\n super(router, name, paramNames, route);\n this.params = {};\n this.params = params;\n }\n getModel(transition) {\n let fullParams = this.params;\n if (transition && transition[QUERY_PARAMS_SYMBOL]) {\n fullParams = {};\n merge(fullParams, this.params);\n fullParams.queryParams = transition[QUERY_PARAMS_SYMBOL];\n }\n let route = this.route;\n let result = undefined;\n if (route.deserialize) {\n result = route.deserialize(fullParams, transition);\n } else if (route.model) {\n result = route.model(fullParams, transition);\n }\n if (result && isTransition(result)) {\n result = undefined;\n }\n return _rsvp.Promise.resolve(result);\n }\n }\n class UnresolvedRouteInfoByObject extends InternalRouteInfo {\n constructor(router, name, paramNames, context) {\n super(router, name, paramNames);\n this.context = context;\n this.serializer = this.router.getSerializer(name);\n }\n getModel(transition) {\n if (this.router.log !== undefined) {\n this.router.log(this.name + ': resolving provided model');\n }\n return super.getModel(transition);\n }\n /**\n @private\n Serializes a route using its custom `serialize` method or\n by a default that looks up the expected property name from\n the dynamic segment.\n @param {Object} model the model to be serialized for this route\n */\n serialize(model) {\n let { paramNames, context } = this;\n if (!model) {\n model = context;\n }\n let object = {};\n if (isParam(model)) {\n object[paramNames[0]] = model;\n return object;\n }\n // Use custom serialize if it exists.\n if (this.serializer) {\n // invoke this.serializer unbound (getSerializer returns a stateless function)\n return this.serializer.call(null, model, paramNames);\n } else if (this.route !== undefined) {\n if (this.route.serialize) {\n return this.route.serialize(model, paramNames);\n }\n }\n if (paramNames.length !== 1) {\n return;\n }\n let name = paramNames[0];\n if (/_id$/.test(name)) {\n object[name] = model.id;\n } else {\n object[name] = model;\n }\n return object;\n }\n }\n function paramsMatch(a, b) {\n if (!a !== !b) {\n // Only one is null.\n return false;\n }\n if (!a) {\n // Both must be null.\n return true;\n }\n // Note: this assumes that both params have the same\n // number of keys, but since we're comparing the\n // same routes, they should.\n for (let k in a) {\n if (a.hasOwnProperty(k) && a[k] !== b[k]) {\n return false;\n }\n }\n return true;\n }\n\n class TransitionIntent {\n constructor(router, data = {}) {\n this.router = router;\n this.data = data;\n }\n }\n\n class TransitionState {\n constructor() {\n this.routeInfos = [];\n this.queryParams = {};\n this.params = {};\n }\n promiseLabel(label) {\n let targetName = '';\n forEach(this.routeInfos, function (routeInfo) {\n if (targetName !== '') {\n targetName += '.';\n }\n targetName += routeInfo.name;\n return true;\n });\n return promiseLabel(\"'\" + targetName + \"': \" + label);\n }\n resolve(shouldContinue, transition) {\n // First, calculate params for this state. This is useful\n // information to provide to the various route hooks.\n let params = this.params;\n forEach(this.routeInfos, routeInfo => {\n params[routeInfo.name] = routeInfo.params || {};\n return true;\n });\n transition.resolveIndex = 0;\n let currentState = this;\n let wasAborted = false;\n // The prelude RSVP.resolve() asyncs us into the promise land.\n return _rsvp.Promise.resolve(null, this.promiseLabel('Start transition')).then(resolveOneRouteInfo, null, this.promiseLabel('Resolve route')).catch(handleError, this.promiseLabel('Handle error'));\n function innerShouldContinue() {\n return _rsvp.Promise.resolve(shouldContinue(), currentState.promiseLabel('Check if should continue')).catch(function (reason) {\n // We distinguish between errors that occurred\n // during resolution (e.g. before\"Model/model/afterModel),\n // and aborts due to a rejecting promise from shouldContinue().\n wasAborted = true;\n return _rsvp.Promise.reject(reason);\n }, currentState.promiseLabel('Handle abort'));\n }\n function handleError(error) {\n // This is the only possible\n // reject value of TransitionState#resolve\n let routeInfos = currentState.routeInfos;\n let errorHandlerIndex = transition.resolveIndex >= routeInfos.length ? routeInfos.length - 1 : transition.resolveIndex;\n return _rsvp.Promise.reject(new TransitionError(error, currentState.routeInfos[errorHandlerIndex].route, wasAborted, currentState));\n }\n function proceed(resolvedRouteInfo) {\n let wasAlreadyResolved = currentState.routeInfos[transition.resolveIndex].isResolved;\n // Swap the previously unresolved routeInfo with\n // the resolved routeInfo\n currentState.routeInfos[transition.resolveIndex++] = resolvedRouteInfo;\n if (!wasAlreadyResolved) {\n // Call the redirect hook. The reason we call it here\n // vs. afterModel is so that redirects into child\n // routes don't re-run the model hooks for this\n // already-resolved route.\n let { route } = resolvedRouteInfo;\n if (route !== undefined) {\n if (route.redirect) {\n route.redirect(resolvedRouteInfo.context, transition);\n }\n }\n }\n // Proceed after ensuring that the redirect hook\n // didn't abort this transition by transitioning elsewhere.\n return innerShouldContinue().then(resolveOneRouteInfo, null, currentState.promiseLabel('Resolve route'));\n }\n function resolveOneRouteInfo() {\n if (transition.resolveIndex === currentState.routeInfos.length) {\n // This is is the only possible\n // fulfill value of TransitionState#resolve\n return currentState;\n }\n let routeInfo = currentState.routeInfos[transition.resolveIndex];\n return routeInfo.resolve(innerShouldContinue, transition).then(proceed, null, currentState.promiseLabel('Proceed'));\n }\n }\n }\n class TransitionError {\n constructor(error, route, wasAborted, state) {\n this.error = error;\n this.route = route;\n this.wasAborted = wasAborted;\n this.state = state;\n }\n }\n\n class NamedTransitionIntent extends TransitionIntent {\n constructor(router, name, pivotHandler, contexts = [], queryParams = {}, data) {\n super(router, data);\n this.preTransitionState = undefined;\n this.name = name;\n this.pivotHandler = pivotHandler;\n this.contexts = contexts;\n this.queryParams = queryParams;\n }\n applyToState(oldState, isIntermediate) {\n // TODO: WTF fix me\n let partitionedArgs = extractQueryParams([this.name].concat(this.contexts)),\n pureArgs = partitionedArgs[0],\n handlers = this.router.recognizer.handlersFor(pureArgs[0]);\n let targetRouteName = handlers[handlers.length - 1].handler;\n return this.applyToHandlers(oldState, handlers, targetRouteName, isIntermediate, false);\n }\n applyToHandlers(oldState, parsedHandlers, targetRouteName, isIntermediate, checkingIfActive) {\n let i, len;\n let newState = new TransitionState();\n let objects = this.contexts.slice(0);\n let invalidateIndex = parsedHandlers.length;\n // Pivot handlers are provided for refresh transitions\n if (this.pivotHandler) {\n for (i = 0, len = parsedHandlers.length; i < len; ++i) {\n if (parsedHandlers[i].handler === this.pivotHandler.routeName) {\n invalidateIndex = i;\n break;\n }\n }\n }\n for (i = parsedHandlers.length - 1; i >= 0; --i) {\n let result = parsedHandlers[i];\n let name = result.handler;\n let oldHandlerInfo = oldState.routeInfos[i];\n let newHandlerInfo = null;\n if (result.names.length > 0) {\n if (i >= invalidateIndex) {\n newHandlerInfo = this.createParamHandlerInfo(name, result.names, objects, oldHandlerInfo);\n } else {\n newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, result.names, objects, oldHandlerInfo, targetRouteName, i);\n }\n } else {\n // This route has no dynamic segment.\n // Therefore treat as a param-based handlerInfo\n // with empty params. This will cause the `model`\n // hook to be called with empty params, which is desirable.\n newHandlerInfo = this.createParamHandlerInfo(name, result.names, objects, oldHandlerInfo);\n }\n if (checkingIfActive) {\n // If we're performing an isActive check, we want to\n // serialize URL params with the provided context, but\n // ignore mismatches between old and new context.\n newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);\n let oldContext = oldHandlerInfo && oldHandlerInfo.context;\n if (result.names.length > 0 && oldHandlerInfo.context !== undefined && newHandlerInfo.context === oldContext) {\n // If contexts match in isActive test, assume params also match.\n // This allows for flexibility in not requiring that every last\n // handler provide a `serialize` method\n newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;\n }\n newHandlerInfo.context = oldContext;\n }\n let handlerToUse = oldHandlerInfo;\n if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {\n invalidateIndex = Math.min(i, invalidateIndex);\n handlerToUse = newHandlerInfo;\n }\n if (isIntermediate && !checkingIfActive) {\n handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);\n }\n newState.routeInfos.unshift(handlerToUse);\n }\n if (objects.length > 0) {\n throw new Error('More context objects were passed than there are dynamic segments for the route: ' + targetRouteName);\n }\n if (!isIntermediate) {\n this.invalidateChildren(newState.routeInfos, invalidateIndex);\n }\n merge(newState.queryParams, this.queryParams || {});\n return newState;\n }\n invalidateChildren(handlerInfos, invalidateIndex) {\n for (let i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {\n let handlerInfo = handlerInfos[i];\n if (handlerInfo.isResolved) {\n let { name, params, route, paramNames } = handlerInfos[i];\n handlerInfos[i] = new UnresolvedRouteInfoByParam(this.router, name, paramNames, params, route);\n }\n }\n }\n getHandlerInfoForDynamicSegment(name, names, objects, oldHandlerInfo, _targetRouteName, i) {\n let objectToUse;\n if (objects.length > 0) {\n // Use the objects provided for this transition.\n objectToUse = objects[objects.length - 1];\n if (isParam(objectToUse)) {\n return this.createParamHandlerInfo(name, names, objects, oldHandlerInfo);\n } else {\n objects.pop();\n }\n } else if (oldHandlerInfo && oldHandlerInfo.name === name) {\n // Reuse the matching oldHandlerInfo\n return oldHandlerInfo;\n } else {\n if (this.preTransitionState) {\n let preTransitionHandlerInfo = this.preTransitionState.routeInfos[i];\n objectToUse = preTransitionHandlerInfo && preTransitionHandlerInfo.context;\n } else {\n // Ideally we should throw this error to provide maximal\n // information to the user that not enough context objects\n // were provided, but this proves too cumbersome in Ember\n // in cases where inner template helpers are evaluated\n // before parent helpers un-render, in which cases this\n // error somewhat prematurely fires.\n //throw new Error(\"Not enough context objects were provided to complete a transition to \" + targetRouteName + \". Specifically, the \" + name + \" route needs an object that can be serialized into its dynamic URL segments [\" + names.join(', ') + \"]\");\n return oldHandlerInfo;\n }\n }\n return new UnresolvedRouteInfoByObject(this.router, name, names, objectToUse);\n }\n createParamHandlerInfo(name, names, objects, oldHandlerInfo) {\n let params = {};\n // Soak up all the provided string/numbers\n let numNames = names.length;\n while (numNames--) {\n // Only use old params if the names match with the new handler\n let oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};\n let peek = objects[objects.length - 1];\n let paramName = names[numNames];\n if (isParam(peek)) {\n params[paramName] = '' + objects.pop();\n } else {\n // If we're here, this means only some of the params\n // were string/number params, so try and use a param\n // value from a previous handler.\n if (oldParams.hasOwnProperty(paramName)) {\n params[paramName] = oldParams[paramName];\n } else {\n throw new Error(\"You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route \" + name);\n }\n }\n }\n return new UnresolvedRouteInfoByParam(this.router, name, names, params);\n }\n }\n\n const UnrecognizedURLError = function () {\n UnrecognizedURLError.prototype = Object.create(Error.prototype);\n UnrecognizedURLError.prototype.constructor = UnrecognizedURLError;\n function UnrecognizedURLError(message) {\n let error = Error.call(this, message);\n this.name = 'UnrecognizedURLError';\n this.message = message || 'UnrecognizedURL';\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UnrecognizedURLError);\n } else {\n this.stack = error.stack;\n }\n }\n return UnrecognizedURLError;\n }();\n\n class URLTransitionIntent extends TransitionIntent {\n constructor(router, url, data) {\n super(router, data);\n this.url = url;\n this.preTransitionState = undefined;\n }\n applyToState(oldState) {\n let newState = new TransitionState();\n let results = this.router.recognizer.recognize(this.url),\n i,\n len;\n if (!results) {\n throw new UnrecognizedURLError(this.url);\n }\n let statesDiffer = false;\n let _url = this.url;\n // Checks if a handler is accessible by URL. If it is not, an error is thrown.\n // For the case where the handler is loaded asynchronously, the error will be\n // thrown once it is loaded.\n function checkHandlerAccessibility(handler) {\n if (handler && handler.inaccessibleByURL) {\n throw new UnrecognizedURLError(_url);\n }\n return handler;\n }\n for (i = 0, len = results.length; i < len; ++i) {\n let result = results[i];\n let name = result.handler;\n let paramNames = [];\n if (this.router.recognizer.hasRoute(name)) {\n paramNames = this.router.recognizer.handlersFor(name)[i].names;\n }\n let newRouteInfo = new UnresolvedRouteInfoByParam(this.router, name, paramNames, result.params);\n let route = newRouteInfo.route;\n if (route) {\n checkHandlerAccessibility(route);\n } else {\n // If the hanlder is being loaded asynchronously, check if we can\n // access it after it has resolved\n newRouteInfo.routePromise = newRouteInfo.routePromise.then(checkHandlerAccessibility);\n }\n let oldRouteInfo = oldState.routeInfos[i];\n if (statesDiffer || newRouteInfo.shouldSupercede(oldRouteInfo)) {\n statesDiffer = true;\n newState.routeInfos[i] = newRouteInfo;\n } else {\n newState.routeInfos[i] = oldRouteInfo;\n }\n }\n merge(newState.queryParams, results.queryParams);\n return newState;\n }\n }\n\n class Router {\n constructor(logger) {\n this._lastQueryParams = {};\n this.state = undefined;\n this.oldState = undefined;\n this.activeTransition = undefined;\n this.currentRouteInfos = undefined;\n this._changedQueryParams = undefined;\n this.currentSequence = 0;\n this.log = logger;\n this.recognizer = new _routeRecognizer.default();\n this.reset();\n }\n /**\n The main entry point into the router. The API is essentially\n the same as the `map` method in `route-recognizer`.\n This method extracts the String handler at the last `.to()`\n call and uses it as the name of the whole route.\n @param {Function} callback\n */\n map(callback) {\n this.recognizer.map(callback, function (recognizer, routes) {\n for (let i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {\n let route = routes[i];\n let handler = route.handler;\n recognizer.add(routes, { as: handler });\n proceed = route.path === '/' || route.path === '' || handler.slice(-6) === '.index';\n }\n });\n }\n hasRoute(route) {\n return this.recognizer.hasRoute(route);\n }\n queryParamsTransition(changelist, wasTransitioning, oldState, newState) {\n this.fireQueryParamDidChange(newState, changelist);\n if (!wasTransitioning && this.activeTransition) {\n // One of the routes in queryParamsDidChange\n // caused a transition. Just return that transition.\n return this.activeTransition;\n } else {\n // Running queryParamsDidChange didn't change anything.\n // Just update query params and be on our way.\n // We have to return a noop transition that will\n // perform a URL update at the end. This gives\n // the user the ability to set the url update\n // method (default is replaceState).\n let newTransition = new Transition(this, undefined, undefined);\n newTransition.queryParamsOnly = true;\n oldState.queryParams = this.finalizeQueryParamChange(newState.routeInfos, newState.queryParams, newTransition);\n newTransition[QUERY_PARAMS_SYMBOL] = newState.queryParams;\n this.toReadOnlyInfos(newTransition, newState);\n this.routeWillChange(newTransition);\n newTransition.promise = newTransition.promise.then(result => {\n this._updateURL(newTransition, oldState);\n this.didTransition(this.currentRouteInfos);\n this.toInfos(newTransition, newState.routeInfos, true);\n this.routeDidChange(newTransition);\n return result;\n }, null, promiseLabel('Transition complete'));\n return newTransition;\n }\n }\n transitionByIntent(intent, isIntermediate) {\n try {\n return this.getTransitionByIntent(intent, isIntermediate);\n } catch (e) {\n return new Transition(this, intent, undefined, e, undefined);\n }\n }\n recognize(url) {\n let intent = new URLTransitionIntent(this, url);\n let newState = this.generateNewState(intent);\n if (newState === null) {\n return newState;\n }\n let readonlyInfos = toReadOnlyRouteInfo(newState.routeInfos, newState.queryParams);\n return readonlyInfos[readonlyInfos.length - 1];\n }\n recognizeAndLoad(url) {\n let intent = new URLTransitionIntent(this, url);\n let newState = this.generateNewState(intent);\n if (newState === null) {\n return _rsvp.Promise.reject(`URL ${url} was not recognized`);\n }\n let newTransition = new Transition(this, intent, newState, undefined);\n return newTransition.then(() => {\n let routeInfosWithAttributes = toReadOnlyRouteInfo(newState.routeInfos, newTransition[QUERY_PARAMS_SYMBOL], true);\n return routeInfosWithAttributes[routeInfosWithAttributes.length - 1];\n });\n }\n generateNewState(intent) {\n try {\n return intent.applyToState(this.state, false);\n } catch (e) {\n return null;\n }\n }\n getTransitionByIntent(intent, isIntermediate) {\n let wasTransitioning = !!this.activeTransition;\n let oldState = wasTransitioning ? this.activeTransition[STATE_SYMBOL] : this.state;\n let newTransition;\n let newState = intent.applyToState(oldState, isIntermediate);\n let queryParamChangelist = getChangelist(oldState.queryParams, newState.queryParams);\n if (routeInfosEqual(newState.routeInfos, oldState.routeInfos)) {\n // This is a no-op transition. See if query params changed.\n if (queryParamChangelist) {\n let newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);\n newTransition.queryParamsOnly = true;\n return newTransition;\n }\n // No-op. No need to create a new transition.\n return this.activeTransition || new Transition(this, undefined, undefined);\n }\n if (isIntermediate) {\n this.setupContexts(newState);\n let transition = this.activeTransition;\n if (!transition.isCausedByAbortingTransition) {\n transition = new Transition(this, undefined, undefined);\n transition.from = transition.from;\n }\n this.toInfos(transition, newState.routeInfos);\n this.routeWillChange(transition);\n return this.activeTransition;\n }\n // Create a new transition to the destination route.\n newTransition = new Transition(this, intent, newState, undefined, this.activeTransition);\n // transition is to same route with same params, only query params differ.\n // not caught above probably because refresh() has been used\n if (routeInfosSameExceptQueryParams(newState.routeInfos, oldState.routeInfos)) {\n newTransition.queryParamsOnly = true;\n }\n this.toReadOnlyInfos(newTransition, newState);\n // Abort and usurp any previously active transition.\n if (this.activeTransition) {\n this.activeTransition.redirect(newTransition);\n }\n this.activeTransition = newTransition;\n // Transition promises by default resolve with resolved state.\n // For our purposes, swap out the promise to resolve\n // after the transition has been finalized.\n newTransition.promise = newTransition.promise.then(result => {\n return this.finalizeTransition(newTransition, result);\n }, null, promiseLabel('Settle transition promise when transition is finalized'));\n if (!wasTransitioning) {\n this.notifyExistingHandlers(newState, newTransition);\n }\n this.fireQueryParamDidChange(newState, queryParamChangelist);\n return newTransition;\n }\n /**\n @private\n Begins and returns a Transition based on the provided\n arguments. Accepts arguments in the form of both URL\n transitions and named transitions.\n @param {Router} router\n @param {Array[Object]} args arguments passed to transitionTo,\n replaceWith, or handleURL\n */\n doTransition(name, modelsArray = [], isIntermediate = false) {\n let lastArg = modelsArray[modelsArray.length - 1];\n let queryParams = {};\n if (lastArg !== undefined && lastArg.hasOwnProperty('queryParams')) {\n queryParams = modelsArray.pop().queryParams;\n }\n let intent;\n if (name === undefined) {\n log(this, 'Updating query params');\n // A query param update is really just a transition\n // into the route you're already on.\n let { routeInfos } = this.state;\n intent = new NamedTransitionIntent(this, routeInfos[routeInfos.length - 1].name, undefined, [], queryParams);\n } else if (name.charAt(0) === '/') {\n log(this, 'Attempting URL transition to ' + name);\n intent = new URLTransitionIntent(this, name);\n } else {\n log(this, 'Attempting transition to ' + name);\n intent = new NamedTransitionIntent(this, name, undefined, modelsArray, queryParams);\n }\n return this.transitionByIntent(intent, isIntermediate);\n }\n /**\n @private\n Updates the URL (if necessary) and calls `setupContexts`\n to update the router's array of `currentRouteInfos`.\n */\n finalizeTransition(transition, newState) {\n try {\n log(transition.router, transition.sequence, 'Resolved all models on destination route; finalizing transition.');\n let routeInfos = newState.routeInfos;\n // Run all the necessary enter/setup/exit hooks\n this.setupContexts(newState, transition);\n // Check if a redirect occurred in enter/setup\n if (transition.isAborted) {\n // TODO: cleaner way? distinguish b/w targetRouteInfos?\n this.state.routeInfos = this.currentRouteInfos;\n return _rsvp.Promise.reject(logAbort(transition));\n }\n this._updateURL(transition, newState);\n transition.isActive = false;\n this.activeTransition = undefined;\n this.triggerEvent(this.currentRouteInfos, true, 'didTransition', []);\n this.didTransition(this.currentRouteInfos);\n this.toInfos(transition, newState.routeInfos, true);\n this.routeDidChange(transition);\n log(this, transition.sequence, 'TRANSITION COMPLETE.');\n // Resolve with the final route.\n return routeInfos[routeInfos.length - 1].route;\n } catch (e) {\n if (!(e instanceof TransitionAbortedError)) {\n let infos = transition[STATE_SYMBOL].routeInfos;\n transition.trigger(true, 'error', e, transition, infos[infos.length - 1].route);\n transition.abort();\n }\n throw e;\n }\n }\n /**\n @private\n Takes an Array of `RouteInfo`s, figures out which ones are\n exiting, entering, or changing contexts, and calls the\n proper route hooks.\n For example, consider the following tree of routes. Each route is\n followed by the URL segment it handles.\n ```\n |~index (\"/\")\n | |~posts (\"/posts\")\n | | |-showPost (\"/:id\")\n | | |-newPost (\"/new\")\n | | |-editPost (\"/edit\")\n | |~about (\"/about/:id\")\n ```\n Consider the following transitions:\n 1. A URL transition to `/posts/1`.\n 1. Triggers the `*model` callbacks on the\n `index`, `posts`, and `showPost` routes\n 2. Triggers the `enter` callback on the same\n 3. Triggers the `setup` callback on the same\n 2. A direct transition to `newPost`\n 1. Triggers the `exit` callback on `showPost`\n 2. Triggers the `enter` callback on `newPost`\n 3. Triggers the `setup` callback on `newPost`\n 3. A direct transition to `about` with a specified\n context object\n 1. Triggers the `exit` callback on `newPost`\n and `posts`\n 2. Triggers the `serialize` callback on `about`\n 3. Triggers the `enter` callback on `about`\n 4. Triggers the `setup` callback on `about`\n @param {Router} transition\n @param {TransitionState} newState\n */\n setupContexts(newState, transition) {\n let partition = this.partitionRoutes(this.state, newState);\n let i, l, route;\n for (i = 0, l = partition.exited.length; i < l; i++) {\n route = partition.exited[i].route;\n delete route.context;\n if (route !== undefined) {\n if (route._internalReset !== undefined) {\n route._internalReset(true, transition);\n }\n if (route.exit !== undefined) {\n route.exit(transition);\n }\n }\n }\n let oldState = this.oldState = this.state;\n this.state = newState;\n let currentRouteInfos = this.currentRouteInfos = partition.unchanged.slice();\n try {\n for (i = 0, l = partition.reset.length; i < l; i++) {\n route = partition.reset[i].route;\n if (route !== undefined) {\n if (route._internalReset !== undefined) {\n route._internalReset(false, transition);\n }\n }\n }\n for (i = 0, l = partition.updatedContext.length; i < l; i++) {\n this.routeEnteredOrUpdated(currentRouteInfos, partition.updatedContext[i], false, transition);\n }\n for (i = 0, l = partition.entered.length; i < l; i++) {\n this.routeEnteredOrUpdated(currentRouteInfos, partition.entered[i], true, transition);\n }\n } catch (e) {\n this.state = oldState;\n this.currentRouteInfos = oldState.routeInfos;\n throw e;\n }\n this.state.queryParams = this.finalizeQueryParamChange(currentRouteInfos, newState.queryParams, transition);\n }\n /**\n @private\n Fires queryParamsDidChange event\n */\n fireQueryParamDidChange(newState, queryParamChangelist) {\n // If queryParams changed trigger event\n if (queryParamChangelist) {\n // This is a little hacky but we need some way of storing\n // changed query params given that no activeTransition\n // is guaranteed to have occurred.\n this._changedQueryParams = queryParamChangelist.all;\n this.triggerEvent(newState.routeInfos, true, 'queryParamsDidChange', [queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);\n this._changedQueryParams = undefined;\n }\n }\n /**\n @private\n Helper method used by setupContexts. Handles errors or redirects\n that may happen in enter/setup.\n */\n routeEnteredOrUpdated(currentRouteInfos, routeInfo, enter, transition) {\n let route = routeInfo.route,\n context = routeInfo.context;\n function _routeEnteredOrUpdated(route) {\n if (enter) {\n if (route.enter !== undefined) {\n route.enter(transition);\n }\n }\n if (transition && transition.isAborted) {\n throw new TransitionAbortedError();\n }\n route.context = context;\n if (route.contextDidChange !== undefined) {\n route.contextDidChange();\n }\n if (route.setup !== undefined) {\n route.setup(context, transition);\n }\n if (transition && transition.isAborted) {\n throw new TransitionAbortedError();\n }\n currentRouteInfos.push(routeInfo);\n return route;\n }\n // If the route doesn't exist, it means we haven't resolved the route promise yet\n if (route === undefined) {\n routeInfo.routePromise = routeInfo.routePromise.then(_routeEnteredOrUpdated);\n } else {\n _routeEnteredOrUpdated(route);\n }\n return true;\n }\n /**\n @private\n This function is called when transitioning from one URL to\n another to determine which routes are no longer active,\n which routes are newly active, and which routes remain\n active but have their context changed.\n Take a list of old routes and new routes and partition\n them into four buckets:\n * unchanged: the route was active in both the old and\n new URL, and its context remains the same\n * updated context: the route was active in both the\n old and new URL, but its context changed. The route's\n `setup` method, if any, will be called with the new\n context.\n * exited: the route was active in the old URL, but is\n no longer active.\n * entered: the route was not active in the old URL, but\n is now active.\n The PartitionedRoutes structure has four fields:\n * `updatedContext`: a list of `RouteInfo` objects that\n represent routes that remain active but have a changed\n context\n * `entered`: a list of `RouteInfo` objects that represent\n routes that are newly active\n * `exited`: a list of `RouteInfo` objects that are no\n longer active.\n * `unchanged`: a list of `RouteInfo` objects that remain active.\n @param {Array[InternalRouteInfo]} oldRoutes a list of the route\n information for the previous URL (or `[]` if this is the\n first handled transition)\n @param {Array[InternalRouteInfo]} newRoutes a list of the route\n information for the new URL\n @return {Partition}\n */\n partitionRoutes(oldState, newState) {\n let oldRouteInfos = oldState.routeInfos;\n let newRouteInfos = newState.routeInfos;\n let routes = {\n updatedContext: [],\n exited: [],\n entered: [],\n unchanged: [],\n reset: []\n };\n let routeChanged,\n contextChanged = false,\n i,\n l;\n for (i = 0, l = newRouteInfos.length; i < l; i++) {\n let oldRouteInfo = oldRouteInfos[i],\n newRouteInfo = newRouteInfos[i];\n if (!oldRouteInfo || oldRouteInfo.route !== newRouteInfo.route) {\n routeChanged = true;\n }\n if (routeChanged) {\n routes.entered.push(newRouteInfo);\n if (oldRouteInfo) {\n routes.exited.unshift(oldRouteInfo);\n }\n } else if (contextChanged || oldRouteInfo.context !== newRouteInfo.context) {\n contextChanged = true;\n routes.updatedContext.push(newRouteInfo);\n } else {\n routes.unchanged.push(oldRouteInfo);\n }\n }\n for (i = newRouteInfos.length, l = oldRouteInfos.length; i < l; i++) {\n routes.exited.unshift(oldRouteInfos[i]);\n }\n routes.reset = routes.updatedContext.slice();\n routes.reset.reverse();\n return routes;\n }\n _updateURL(transition, state) {\n let urlMethod = transition.urlMethod;\n if (!urlMethod) {\n return;\n }\n let { routeInfos } = state;\n let { name: routeName } = routeInfos[routeInfos.length - 1];\n let params = {};\n for (let i = routeInfos.length - 1; i >= 0; --i) {\n let routeInfo = routeInfos[i];\n merge(params, routeInfo.params);\n if (routeInfo.route.inaccessibleByURL) {\n urlMethod = null;\n }\n }\n if (urlMethod) {\n params.queryParams = transition._visibleQueryParams || state.queryParams;\n let url = this.recognizer.generate(routeName, params);\n // transitions during the initial transition must always use replaceURL.\n // When the app boots, you are at a url, e.g. /foo. If some route\n // redirects to bar as part of the initial transition, you don't want to\n // add a history entry for /foo. If you do, pressing back will immediately\n // hit the redirect again and take you back to /bar, thus killing the back\n // button\n let initial = transition.isCausedByInitialTransition;\n // say you are at / and you click a link to route /foo. In /foo's\n // route, the transition is aborted using replacewith('/bar').\n // Because the current url is still /, the history entry for / is\n // removed from the history. Clicking back will take you to the page\n // you were on before /, which is often not even the app, thus killing\n // the back button. That's why updateURL is always correct for an\n // aborting transition that's not the initial transition\n let replaceAndNotAborting = urlMethod === 'replace' && !transition.isCausedByAbortingTransition;\n // because calling refresh causes an aborted transition, this needs to be\n // special cased - if the initial transition is a replace transition, the\n // urlMethod should be honored here.\n let isQueryParamsRefreshTransition = transition.queryParamsOnly && urlMethod === 'replace';\n // say you are at / and you a `replaceWith(/foo)` is called. Then, that\n // transition is aborted with `replaceWith(/bar)`. At the end, we should\n // end up with /bar replacing /. We are replacing the replace. We only\n // will replace the initial route if all subsequent aborts are also\n // replaces. However, there is some ambiguity around the correct behavior\n // here.\n let replacingReplace = urlMethod === 'replace' && transition.isCausedByAbortingReplaceTransition;\n if (initial || replaceAndNotAborting || isQueryParamsRefreshTransition || replacingReplace) {\n this.replaceURL(url);\n } else {\n this.updateURL(url);\n }\n }\n }\n finalizeQueryParamChange(resolvedHandlers, newQueryParams, transition) {\n // We fire a finalizeQueryParamChange event which\n // gives the new route hierarchy a chance to tell\n // us which query params it's consuming and what\n // their final values are. If a query param is\n // no longer consumed in the final route hierarchy,\n // its serialized segment will be removed\n // from the URL.\n for (let k in newQueryParams) {\n if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {\n delete newQueryParams[k];\n }\n }\n let finalQueryParamsArray = [];\n this.triggerEvent(resolvedHandlers, true, 'finalizeQueryParamChange', [newQueryParams, finalQueryParamsArray, transition]);\n if (transition) {\n transition._visibleQueryParams = {};\n }\n let finalQueryParams = {};\n for (let i = 0, len = finalQueryParamsArray.length; i < len; ++i) {\n let qp = finalQueryParamsArray[i];\n finalQueryParams[qp.key] = qp.value;\n if (transition && qp.visible !== false) {\n transition._visibleQueryParams[qp.key] = qp.value;\n }\n }\n return finalQueryParams;\n }\n toReadOnlyInfos(newTransition, newState) {\n let oldRouteInfos = this.state.routeInfos;\n this.fromInfos(newTransition, oldRouteInfos);\n this.toInfos(newTransition, newState.routeInfos);\n this._lastQueryParams = newState.queryParams;\n }\n fromInfos(newTransition, oldRouteInfos) {\n if (newTransition !== undefined && oldRouteInfos.length > 0) {\n let fromInfos = toReadOnlyRouteInfo(oldRouteInfos, Object.assign({}, this._lastQueryParams), true);\n newTransition.from = fromInfos[fromInfos.length - 1] || null;\n }\n }\n toInfos(newTransition, newRouteInfos, includeAttributes = false) {\n if (newTransition !== undefined && newRouteInfos.length > 0) {\n let toInfos = toReadOnlyRouteInfo(newRouteInfos, Object.assign({}, newTransition[QUERY_PARAMS_SYMBOL]), includeAttributes);\n newTransition.to = toInfos[toInfos.length - 1] || null;\n }\n }\n notifyExistingHandlers(newState, newTransition) {\n let oldRouteInfos = this.state.routeInfos,\n i,\n oldRouteInfoLen,\n oldHandler,\n newRouteInfo;\n oldRouteInfoLen = oldRouteInfos.length;\n for (i = 0; i < oldRouteInfoLen; i++) {\n oldHandler = oldRouteInfos[i];\n newRouteInfo = newState.routeInfos[i];\n if (!newRouteInfo || oldHandler.name !== newRouteInfo.name) {\n break;\n }\n if (!newRouteInfo.isResolved) {}\n }\n this.triggerEvent(oldRouteInfos, true, 'willTransition', [newTransition]);\n this.routeWillChange(newTransition);\n this.willTransition(oldRouteInfos, newState.routeInfos, newTransition);\n }\n /**\n Clears the current and target route routes and triggers exit\n on each of them starting at the leaf and traversing up through\n its ancestors.\n */\n reset() {\n if (this.state) {\n forEach(this.state.routeInfos.slice().reverse(), function (routeInfo) {\n let route = routeInfo.route;\n if (route !== undefined) {\n if (route.exit !== undefined) {\n route.exit();\n }\n }\n return true;\n });\n }\n this.oldState = undefined;\n this.state = new TransitionState();\n this.currentRouteInfos = undefined;\n }\n /**\n let handler = routeInfo.handler;\n The entry point for handling a change to the URL (usually\n via the back and forward button).\n Returns an Array of handlers and the parameters associated\n with those parameters.\n @param {String} url a URL to process\n @return {Array} an Array of `[handler, parameter]` tuples\n */\n handleURL(url) {\n // Perform a URL-based transition, but don't change\n // the URL afterward, since it already happened.\n if (url.charAt(0) !== '/') {\n url = '/' + url;\n }\n return this.doTransition(url).method(null);\n }\n /**\n Transition into the specified named route.\n If necessary, trigger the exit callback on any routes\n that are no longer represented by the target route.\n @param {String} name the name of the route\n */\n transitionTo(name, ...contexts) {\n if (typeof name === 'object') {\n contexts.push(name);\n return this.doTransition(undefined, contexts, false);\n }\n return this.doTransition(name, contexts);\n }\n intermediateTransitionTo(name, ...args) {\n return this.doTransition(name, args, true);\n }\n refresh(pivotRoute) {\n let previousTransition = this.activeTransition;\n let state = previousTransition ? previousTransition[STATE_SYMBOL] : this.state;\n let routeInfos = state.routeInfos;\n if (pivotRoute === undefined) {\n pivotRoute = routeInfos[0].route;\n }\n log(this, 'Starting a refresh transition');\n let name = routeInfos[routeInfos.length - 1].name;\n let intent = new NamedTransitionIntent(this, name, pivotRoute, [], this._changedQueryParams || state.queryParams);\n let newTransition = this.transitionByIntent(intent, false);\n // if the previous transition is a replace transition, that needs to be preserved\n if (previousTransition && previousTransition.urlMethod === 'replace') {\n newTransition.method(previousTransition.urlMethod);\n }\n return newTransition;\n }\n /**\n Identical to `transitionTo` except that the current URL will be replaced\n if possible.\n This method is intended primarily for use with `replaceState`.\n @param {String} name the name of the route\n */\n replaceWith(name) {\n return this.doTransition(name).method('replace');\n }\n /**\n Take a named route and context objects and generate a\n URL.\n @param {String} name the name of the route to generate\n a URL for\n @param {...Object} objects a list of objects to serialize\n @return {String} a URL\n */\n generate(routeName, ...args) {\n let partitionedArgs = extractQueryParams(args),\n suppliedParams = partitionedArgs[0],\n queryParams = partitionedArgs[1];\n // Construct a TransitionIntent with the provided params\n // and apply it to the present state of the router.\n let intent = new NamedTransitionIntent(this, routeName, undefined, suppliedParams);\n let state = intent.applyToState(this.state, false);\n let params = {};\n for (let i = 0, len = state.routeInfos.length; i < len; ++i) {\n let routeInfo = state.routeInfos[i];\n let routeParams = routeInfo.serialize();\n merge(params, routeParams);\n }\n params.queryParams = queryParams;\n return this.recognizer.generate(routeName, params);\n }\n applyIntent(routeName, contexts) {\n let intent = new NamedTransitionIntent(this, routeName, undefined, contexts);\n let state = this.activeTransition && this.activeTransition[STATE_SYMBOL] || this.state;\n return intent.applyToState(state, false);\n }\n isActiveIntent(routeName, contexts, queryParams, _state) {\n let state = _state || this.state,\n targetRouteInfos = state.routeInfos,\n routeInfo,\n len;\n if (!targetRouteInfos.length) {\n return false;\n }\n let targetHandler = targetRouteInfos[targetRouteInfos.length - 1].name;\n let recogHandlers = this.recognizer.handlersFor(targetHandler);\n let index = 0;\n for (len = recogHandlers.length; index < len; ++index) {\n routeInfo = targetRouteInfos[index];\n if (routeInfo.name === routeName) {\n break;\n }\n }\n if (index === recogHandlers.length) {\n // The provided route name isn't even in the route hierarchy.\n return false;\n }\n let testState = new TransitionState();\n testState.routeInfos = targetRouteInfos.slice(0, index + 1);\n recogHandlers = recogHandlers.slice(0, index + 1);\n let intent = new NamedTransitionIntent(this, targetHandler, undefined, contexts);\n let newState = intent.applyToHandlers(testState, recogHandlers, targetHandler, true, true);\n let routesEqual = routeInfosEqual(newState.routeInfos, testState.routeInfos);\n if (!queryParams || !routesEqual) {\n return routesEqual;\n }\n // Get a hash of QPs that will still be active on new route\n let activeQPsOnNewHandler = {};\n merge(activeQPsOnNewHandler, queryParams);\n let activeQueryParams = state.queryParams;\n for (let key in activeQueryParams) {\n if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {\n activeQPsOnNewHandler[key] = activeQueryParams[key];\n }\n }\n return routesEqual && !getChangelist(activeQPsOnNewHandler, queryParams);\n }\n isActive(routeName, ...args) {\n let partitionedArgs = extractQueryParams(args);\n return this.isActiveIntent(routeName, partitionedArgs[0], partitionedArgs[1]);\n }\n trigger(name, ...args) {\n this.triggerEvent(this.currentRouteInfos, false, name, args);\n }\n }\n function routeInfosEqual(routeInfos, otherRouteInfos) {\n if (routeInfos.length !== otherRouteInfos.length) {\n return false;\n }\n for (let i = 0, len = routeInfos.length; i < len; ++i) {\n if (routeInfos[i] !== otherRouteInfos[i]) {\n return false;\n }\n }\n return true;\n }\n function routeInfosSameExceptQueryParams(routeInfos, otherRouteInfos) {\n if (routeInfos.length !== otherRouteInfos.length) {\n return false;\n }\n for (let i = 0, len = routeInfos.length; i < len; ++i) {\n if (routeInfos[i].name !== otherRouteInfos[i].name) {\n return false;\n }\n if (!paramsEqual(routeInfos[i].params, otherRouteInfos[i].params)) {\n return false;\n }\n }\n return true;\n }\n function paramsEqual(params, otherParams) {\n if (!params && !otherParams) {\n return true;\n } else if (!params && !!otherParams || !!params && !otherParams) {\n // one is falsy but other is not;\n return false;\n }\n let keys = Object.keys(params);\n let otherKeys = Object.keys(otherParams);\n if (keys.length !== otherKeys.length) {\n return false;\n }\n for (let i = 0, len = keys.length; i < len; ++i) {\n let key = keys[i];\n if (params[key] !== otherParams[key]) {\n return false;\n }\n }\n return true;\n }\n\n exports.default = Router;\n exports.InternalTransition = Transition;\n exports.logAbort = logAbort;\n exports.STATE_SYMBOL = STATE_SYMBOL;\n exports.PARAMS_SYMBOL = PARAMS_SYMBOL;\n exports.QUERY_PARAMS_SYMBOL = QUERY_PARAMS_SYMBOL;\n exports.TransitionState = TransitionState;\n exports.TransitionError = TransitionError;\n exports.InternalRouteInfo = InternalRouteInfo;\n});","enifed('rsvp', ['exports', 'node-module'], function (exports, _nodeModule) {\n 'use strict';\n\n exports.__esModule = true;\n exports.filter = exports.async = exports.map = exports.reject = exports.resolve = exports.off = exports.on = exports.configure = exports.denodeify = exports.defer = exports.rethrow = exports.hashSettled = exports.hash = exports.race = exports.allSettled = exports.all = exports.EventTarget = exports.Promise = exports.cast = exports.asap = undefined;\n function callbacksFor(object) {\n let callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n }\n\n /**\n @class RSVP.EventTarget\n */\n var EventTarget = {\n\n /**\n `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n Example:\n ```javascript\n let object = {};\n RSVP.EventTarget.mixin(object);\n object.on('finished', function(event) {\n // handle event\n });\n object.trigger('finished', { detail: value });\n ```\n `EventTarget.mixin` also works with prototypes:\n ```javascript\n let Person = function() {};\n RSVP.EventTarget.mixin(Person.prototype);\n let yehuda = new Person();\n let tom = new Person();\n yehuda.on('poke', function(event) {\n console.log('Yehuda says OW');\n });\n tom.on('poke', function(event) {\n console.log('Tom says OW');\n });\n yehuda.trigger('poke');\n tom.trigger('poke');\n ```\n @method mixin\n @for RSVP.EventTarget\n @private\n @param {Object} object object to extend with EventTarget methods\n */\n mixin(object) {\n object.on = this.on;\n object.off = this.off;\n object.trigger = this.trigger;\n object._promiseCallbacks = undefined;\n return object;\n },\n\n /**\n Registers a callback to be executed when `eventName` is triggered\n ```javascript\n object.on('event', function(eventInfo){\n // handle the event\n });\n object.trigger('event');\n ```\n @method on\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to listen for\n @param {Function} callback function to be called when the event is triggered.\n */\n on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n let allCallbacks = callbacksFor(this);\n let callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (callbacks.indexOf(callback) === -1) {\n callbacks.push(callback);\n }\n },\n\n /**\n You can use `off` to stop firing a particular callback for an event:\n ```javascript\n function doStuff() { // do stuff! }\n object.on('stuff', doStuff);\n object.trigger('stuff'); // doStuff will be called\n // Unregister ONLY the doStuff callback\n object.off('stuff', doStuff);\n object.trigger('stuff'); // doStuff will NOT be called\n ```\n If you don't pass a `callback` argument to `off`, ALL callbacks for the\n event will not be executed when the event fires. For example:\n ```javascript\n let callback1 = function(){};\n let callback2 = function(){};\n object.on('stuff', callback1);\n object.on('stuff', callback2);\n object.trigger('stuff'); // callback1 and callback2 will be executed.\n object.off('stuff');\n object.trigger('stuff'); // callback1 and callback2 will not be executed!\n ```\n @method off\n @for RSVP.EventTarget\n @private\n @param {String} eventName event to stop listening to\n @param {Function} callback optional argument. If given, only the function\n given will be removed from the event's callback queue. If no `callback`\n argument is given, all callbacks will be removed from the event's callback\n queue.\n */\n off(eventName, callback) {\n let allCallbacks = callbacksFor(this);\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n let callbacks = allCallbacks[eventName];\n let index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n\n /**\n Use `trigger` to fire custom events. For example:\n ```javascript\n object.on('foo', function(){\n console.log('foo event happened!');\n });\n object.trigger('foo');\n // 'foo event happened!' logged to the console\n ```\n You can also pass a value as a second argument to `trigger` that will be\n passed as an argument to all event listeners for the event:\n ```javascript\n object.on('foo', function(value){\n console.log(value.name);\n });\n object.trigger('foo', { name: 'bar' });\n // 'bar' logged to the console\n ```\n @method trigger\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to be triggered\n @param {*} options optional value to be passed to any event handlers for\n the given `eventName`\n */\n trigger(eventName, options, label) {\n let allCallbacks = callbacksFor(this);\n\n let callbacks = allCallbacks[eventName];\n if (callbacks) {\n // Don't cache the callbacks.length since it may grow\n let callback;\n for (let i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n callback(options, label);\n }\n }\n }\n };\n\n const config = {\n instrument: false\n };\n\n EventTarget['mixin'](config);\n\n function configure(name, value) {\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n }\n\n const queue = [];\n\n function scheduleFlush() {\n setTimeout(() => {\n for (let i = 0; i < queue.length; i++) {\n let entry = queue[i];\n\n let payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n }\n\n function instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: Date.now(),\n error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n }\n\n /**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n \n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n let promise = RSVP.Promise.resolve(1);\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n function resolve$$1(object, label) {\n /*jshint validthis:true */\n let Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n let promise = new Constructor(noop, label);\n resolve$1(promise, object);\n return promise;\n }\n\n function withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function objectOrFunction(x) {\n let type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n }\n\n function noop() {}\n\n const PENDING = void 0;\n const FULFILLED = 1;\n const REJECTED = 2;\n\n const TRY_CATCH_ERROR = { error: null };\n\n function getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n TRY_CATCH_ERROR.error = error;\n return TRY_CATCH_ERROR;\n }\n }\n\n let tryCatchCallback;\n function tryCatcher() {\n try {\n let target = tryCatchCallback;\n tryCatchCallback = null;\n return target.apply(this, arguments);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n }\n\n function tryCatch(fn) {\n tryCatchCallback = fn;\n return tryCatcher;\n }\n\n function handleForeignThenable(promise, thenable, then$$1) {\n config.async(promise => {\n let sealed = false;\n let result = tryCatch(then$$1).call(thenable, value => {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable === value) {\n fulfill(promise, value);\n } else {\n resolve$1(promise, value);\n }\n }, reason => {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && result === TRY_CATCH_ERROR) {\n sealed = true;\n let error = TRY_CATCH_ERROR.error;\n TRY_CATCH_ERROR.error = null;\n reject(promise, error);\n }\n }, promise);\n }\n\n function handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, value => {\n if (thenable === value) {\n fulfill(promise, value);\n } else {\n resolve$1(promise, value);\n }\n }, reason => reject(promise, reason));\n }\n }\n\n function handleMaybeThenable(promise, maybeThenable, then$$1) {\n let isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$$1;\n\n if (isOwnThenable) {\n handleOwnThenable(promise, maybeThenable);\n } else if (then$$1 === TRY_CATCH_ERROR) {\n let error = TRY_CATCH_ERROR.error;\n TRY_CATCH_ERROR.error = null;\n reject(promise, error);\n } else if (typeof then$$1 === 'function') {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n\n function resolve$1(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n }\n\n function publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n }\n\n function fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (config.instrument) {\n instrument('fulfilled', promise);\n }\n } else {\n config.async(publish, promise);\n }\n }\n\n function reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n config.async(publishRejection, promise);\n }\n\n function subscribe(parent, child, onFulfillment, onRejection) {\n let subscribers = parent._subscribers;\n let length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n config.async(publish, parent);\n }\n }\n\n function publish(promise) {\n let subscribers = promise._subscribers;\n let settled = promise._state;\n\n if (config.instrument) {\n instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n let child,\n callback,\n result = promise._result;\n\n for (let i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, result);\n } else {\n callback(result);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function invokeCallback(state, promise, callback, result) {\n let hasCallback = typeof callback === 'function';\n let value;\n\n if (hasCallback) {\n value = tryCatch(callback)(result);\n } else {\n value = result;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (value === promise) {\n reject(promise, withOwnPromise());\n } else if (value === TRY_CATCH_ERROR) {\n let error = TRY_CATCH_ERROR.error;\n TRY_CATCH_ERROR.error = null; // release\n reject(promise, error);\n } else if (hasCallback) {\n resolve$1(promise, value);\n } else if (state === FULFILLED) {\n fulfill(promise, value);\n } else if (state === REJECTED) {\n reject(promise, value);\n }\n }\n\n function initializePromise(promise, resolver) {\n let resolved = false;\n try {\n resolver(value => {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve$1(promise, value);\n }, reason => {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n }\n\n function then(onFulfillment, onRejection, label) {\n let parent = this;\n let state = parent._state;\n\n if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n config.instrument && instrument('chained', parent, parent);\n return parent;\n }\n\n parent._onError = null;\n\n let child = new parent.constructor(noop, label);\n let result = parent._result;\n\n config.instrument && instrument('chained', parent, child);\n\n if (state === PENDING) {\n subscribe(parent, child, onFulfillment, onRejection);\n } else {\n let callback = state === FULFILLED ? onFulfillment : onRejection;\n config.async(() => invokeCallback(state, child, callback, result));\n }\n\n return child;\n }\n\n class Enumerator {\n constructor(Constructor, input, abortOnReject, label) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop, label);\n this._abortOnReject = abortOnReject;\n this._isUsingOwnPromise = Constructor === Promise;\n this._isUsingOwnResolve = Constructor.resolve === resolve$$1;\n\n this._init(...arguments);\n }\n\n _init(Constructor, input) {\n let len = input.length || 0;\n this.length = len;\n this._remaining = len;\n this._result = new Array(len);\n\n this._enumerate(input);\n }\n\n _enumerate(input) {\n let length = this.length;\n let promise = this.promise;\n\n for (let i = 0; promise._state === PENDING && i < length; i++) {\n this._eachEntry(input[i], i, true);\n }\n this._checkFullfillment();\n }\n\n _checkFullfillment() {\n if (this._remaining === 0) {\n let result = this._result;\n fulfill(this.promise, result);\n this._result = null;\n }\n }\n\n _settleMaybeThenable(entry, i, firstPass) {\n let c = this._instanceConstructor;\n\n if (this._isUsingOwnResolve) {\n let then$$1 = getThen(entry);\n\n if (then$$1 === then && entry._state !== PENDING) {\n entry._onError = null;\n this._settledAt(entry._state, i, entry._result, firstPass);\n } else if (typeof then$$1 !== 'function') {\n this._settledAt(FULFILLED, i, entry, firstPass);\n } else if (this._isUsingOwnPromise) {\n let promise = new c(noop);\n handleMaybeThenable(promise, entry, then$$1);\n this._willSettleAt(promise, i, firstPass);\n } else {\n this._willSettleAt(new c(resolve => resolve(entry)), i, firstPass);\n }\n } else {\n this._willSettleAt(c.resolve(entry), i, firstPass);\n }\n }\n\n _eachEntry(entry, i, firstPass) {\n if (entry !== null && typeof entry === 'object') {\n this._settleMaybeThenable(entry, i, firstPass);\n } else {\n this._setResultAt(FULFILLED, i, entry, firstPass);\n }\n }\n\n _settledAt(state, i, value, firstPass) {\n let promise = this.promise;\n\n if (promise._state === PENDING) {\n if (this._abortOnReject && state === REJECTED) {\n reject(promise, value);\n } else {\n this._setResultAt(state, i, value, firstPass);\n this._checkFullfillment();\n }\n }\n }\n\n _setResultAt(state, i, value, firstPass) {\n this._remaining--;\n this._result[i] = value;\n }\n\n _willSettleAt(promise, i, firstPass) {\n subscribe(promise, undefined, value => this._settledAt(FULFILLED, i, value, firstPass), reason => this._settledAt(REJECTED, i, reason, firstPass));\n }\n }\n\n function setSettledResult(state, i, value) {\n this._remaining--;\n if (state === FULFILLED) {\n this._result[i] = {\n state: 'fulfilled',\n value: value\n };\n } else {\n this._result[i] = {\n state: 'rejected',\n reason: value\n };\n }\n }\n\n /**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n \n Example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n \n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n \n Example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error(\"2\"));\n let promise3 = RSVP.reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n \n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n */\n function all(entries, label) {\n if (!Array.isArray(entries)) {\n return this.reject(new TypeError(\"Promise.all must be called with an array\"), label);\n }\n return new Enumerator(this, entries, true /* abort on reject */, label).promise;\n }\n\n /**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n \n Example:\n \n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n \n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n \n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n \n An example real-world use case is implementing timeouts:\n \n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n \n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n */\n function race(entries, label) {\n /*jshint validthis:true */\n let Constructor = this;\n\n let promise = new Constructor(noop, label);\n\n if (!Array.isArray(entries)) {\n reject(promise, new TypeError('Promise.race must be called with an array'));\n return promise;\n }\n\n for (let i = 0; promise._state === PENDING && i < entries.length; i++) {\n subscribe(Constructor.resolve(entries[i]), undefined, value => resolve$1(promise, value), reason => reject(promise, reason));\n }\n\n return promise;\n }\n\n /**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n \n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n let promise = RSVP.Promise.reject(new Error('WHOOPS'));\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n function reject$1(reason, label) {\n /*jshint validthis:true */\n let Constructor = this;\n let promise = new Constructor(noop, label);\n reject(promise, reason);\n return promise;\n }\n\n const guidKey = 'rsvp_' + Date.now() + '-';\n let counter = 0;\n\n function needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n \n Terminology\n -----------\n \n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n \n A promise can be in one of three states: pending, fulfilled, or rejected.\n \n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n \n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n \n \n Basic Usage:\n ------------\n \n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n \n // on failure\n reject(reason);\n });\n \n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Advanced Usage:\n ---------------\n \n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n \n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n \n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n \n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n \n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Unlike callbacks, promises are great composable primitives.\n \n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n \n return values;\n });\n ```\n \n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n */\n class Promise {\n constructor(resolver, label) {\n this._id = counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n config.instrument && instrument('created', this);\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n _onError(reason) {\n config.after(() => {\n if (this._onError) {\n config.trigger('error', reason, this._label);\n }\n });\n }\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn\\'t find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n catch(onRejection, label) {\n return this.then(undefined, onRejection, label);\n }\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuthor();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuthor();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n finally(callback, label) {\n let promise = this;\n let constructor = promise.constructor;\n\n return promise.then(value => constructor.resolve(callback()).then(() => value), reason => constructor.resolve(callback()).then(() => {\n throw reason;\n }), label);\n }\n }\n\n Promise.cast = resolve$$1; // deprecated\n Promise.all = all;\n Promise.race = race;\n Promise.resolve = resolve$$1;\n Promise.reject = reject$1;\n\n Promise.prototype._guidKey = guidKey;\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we\\'re unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n Promise.prototype.then = then;\n\n function makeObject(_, argumentNames) {\n let obj = {};\n let length = _.length;\n let args = new Array(length);\n\n for (let x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (let i = 0; i < argumentNames.length; i++) {\n let name = argumentNames[i];\n obj[name] = args[i + 1];\n }\n\n return obj;\n }\n\n function arrayResult(_) {\n let length = _.length;\n let args = new Array(length - 1);\n\n for (let i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n }\n\n function wrapThenable(then, promise) {\n return {\n then(onFulFillment, onRejection) {\n return then.call(promise, onFulFillment, onRejection);\n }\n };\n }\n\n /**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n \n ```javascript\n let fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n \n into:\n \n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n \n readFile('myfile.txt').then(handleData, handleError);\n ```\n \n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n \n ```javascript\n let request = RSVP.denodeify(require('request'));\n \n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n \n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n \n ```javascript\n let request = RSVP.denodeify(require('request'), true);\n \n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n \n Or if you pass it an array with names it returns the parameters as a hash:\n \n ```javascript\n let request = RSVP.denodeify(require('request'), ['res', 'body']);\n \n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n \n Sometimes you need to retain the `this`:\n \n ```javascript\n let app = require('express')();\n let render = RSVP.denodeify(app.render.bind(app));\n ```\n \n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n \n ```javascript\n let request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n \n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n \n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n \n ```javascript\n let fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n \n you can chain the operations together using `then` from the returned promise:\n \n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n let writeFile = RSVP.denodeify(fs.writeFile);\n \n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n \n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n */\n function denodeify(nodeFunc, options) {\n let fn = function () {\n let l = arguments.length;\n let args = new Array(l + 1);\n let promiseInput = false;\n\n for (let i = 0; i < l; ++i) {\n let arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === TRY_CATCH_ERROR) {\n let error = TRY_CATCH_ERROR.error;\n TRY_CATCH_ERROR.error = null;\n let p = new Promise(noop);\n reject(p, error);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n let promise = new Promise(noop);\n\n args[l] = function (err, val) {\n if (err) {\n reject(promise, err);\n } else if (options === undefined) {\n resolve$1(promise, val);\n } else if (options === true) {\n resolve$1(promise, arrayResult(arguments));\n } else if (Array.isArray(options)) {\n resolve$1(promise, makeObject(arguments, options));\n } else {\n resolve$1(promise, val);\n }\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, this);\n } else {\n return handleValueInput(promise, args, nodeFunc, this);\n }\n };\n\n fn.__proto__ = nodeFunc;\n\n return fn;\n }\n\n function handleValueInput(promise, args, nodeFunc, self) {\n let result = tryCatch(nodeFunc).apply(self, args);\n if (result === TRY_CATCH_ERROR) {\n let error = TRY_CATCH_ERROR.error;\n TRY_CATCH_ERROR.error = null;\n reject(promise, error);\n }\n return promise;\n }\n\n function handlePromiseInput(promise, args, nodeFunc, self) {\n return Promise.all(args).then(args => handleValueInput(promise, args, nodeFunc, self));\n }\n\n function needsPromiseInput(arg) {\n if (arg !== null && typeof arg === 'object') {\n if (arg.constructor === Promise) {\n return true;\n } else {\n return getThen(arg);\n }\n } else {\n return false;\n }\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.all`.\n \n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n function all$1(array, label) {\n return Promise.all(array, label);\n }\n\n class AllSettled extends Enumerator {\n constructor(Constructor, entries, label) {\n super(Constructor, entries, false /* don't abort on reject */, label);\n }\n }\n\n AllSettled.prototype._setResultAt = setSettledResult;\n\n /**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n Example:\n ```javascript\n let promise1 = RSVP.Promise.resolve(1);\n let promise2 = RSVP.Promise.reject(new Error('2'));\n let promise3 = RSVP.Promise.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n */\n\n function allSettled(entries, label) {\n if (!Array.isArray(entries)) {\n return Promise.reject(new TypeError(\"Promise.allSettled must be called with an array\"), label);\n }\n\n return new AllSettled(Promise, entries, label).promise;\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.race`.\n \n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n function race$1(array, label) {\n return Promise.race(array, label);\n }\n\n class PromiseHash extends Enumerator {\n constructor(Constructor, object, abortOnReject = true, label) {\n super(Constructor, object, abortOnReject, label);\n }\n\n _init(Constructor, object) {\n this._result = {};\n this._enumerate(object);\n }\n\n _enumerate(input) {\n let keys = Object.keys(input);\n\n let length = keys.length;\n let promise = this.promise;\n this._remaining = length;\n\n let key, val;\n for (let i = 0; promise._state === PENDING && i < length; i++) {\n key = keys[i];\n val = input[key];\n this._eachEntry(val, key, true);\n }\n\n this._checkFullfillment();\n }\n }\n\n /**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n \n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n \n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n \n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n \n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n \n let myObject = new MyConstructor();\n \n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n */\n function hash(object, label) {\n if (object === null || typeof object !== 'object') {\n return Promise.reject(new TypeError(\"Promise.hash must be called with an object\"), label);\n }\n\n return new PromiseHash(Promise, object, label).promise;\n }\n\n class HashSettled extends PromiseHash {\n constructor(Constructor, object, label) {\n super(Constructor, object, false, label);\n }\n }\n\n HashSettled.prototype._setResultAt = setSettledResult;\n\n /**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n \n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n \n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n \n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n \n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n \n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n \n let myObject = new MyConstructor();\n \n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n */\n\n function hashSettled(object, label) {\n if (object === null || typeof object !== 'object') {\n return Promise.reject(new TypeError(\"RSVP.hashSettled must be called with an object\"), label);\n }\n\n return new HashSettled(Promise, object, false, label).promise;\n }\n\n /**\n `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event\n loop in order to aid debugging.\n \n Promises A+ specifies that any exceptions that occur with a promise must be\n caught by the promises implementation and bubbled to the last handler. For\n this reason, it is recommended that you always specify a second rejection\n handler function to `then`. However, `RSVP.rethrow` will throw the exception\n outside of the promise, so it bubbles up to your console if in the browser,\n or domain/cause uncaught exception in Node. `rethrow` will also throw the\n error again so the error can be handled by the promise per the spec.\n \n ```javascript\n function throws(){\n throw new Error('Whoops!');\n }\n \n let promise = new RSVP.Promise(function(resolve, reject){\n throws();\n });\n \n promise.catch(RSVP.rethrow).then(function(){\n // Code here doesn't run because the promise became rejected due to an\n // error!\n }, function (err){\n // handle the error here\n });\n ```\n \n The 'Whoops' error will be thrown on the next turn of the event loop\n and you can watch for it in your console. You can also handle it using a\n rejection handler given to `.then` or `.catch` on the returned promise.\n \n @method rethrow\n @static\n @for RSVP\n @param {Error} reason reason the promise became rejected.\n @throws Error\n @static\n */\n function rethrow(reason) {\n setTimeout(() => {\n throw reason;\n });\n throw reason;\n }\n\n /**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n \n The object returned from `RSVP.defer` is a plain object with three properties:\n \n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n \n Example:\n \n ```javascript\n let deferred = RSVP.defer();\n \n deferred.resolve(\"Success!\");\n \n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n \n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\n\n function defer(label) {\n let deferred = { resolve: undefined, reject: undefined };\n\n deferred.promise = new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n }\n\n class MapEnumerator extends Enumerator {\n constructor(Constructor, entries, mapFn, label) {\n super(Constructor, entries, true, label, mapFn);\n }\n\n _init(Constructor, input, bool, label, mapFn) {\n let len = input.length || 0;\n this.length = len;\n this._remaining = len;\n this._result = new Array(len);\n this._mapFn = mapFn;\n\n this._enumerate(input);\n }\n\n _setResultAt(state, i, value, firstPass) {\n if (firstPass) {\n let val = tryCatch(this._mapFn)(value, i);\n if (val === TRY_CATCH_ERROR) {\n this._settledAt(REJECTED, i, val.error, false);\n } else {\n this._eachEntry(val, i, false);\n }\n } else {\n this._remaining--;\n this._result[i] = value;\n }\n }\n\n }\n\n /**\n `RSVP.map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called\n meaning that as soon as any promise resolves its value will be passed to `mapFn`.\n `RSVP.map` returns a promise that will become fulfilled with the result of running\n `mapFn` on the values the promises become fulfilled with.\n \n For example:\n \n ```javascript\n \n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n \n let mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n \n let mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n \n ```javscript\n \n let mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n \n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n \n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n */\n function map(promises, mapFn, label) {\n if (!Array.isArray(promises)) {\n return Promise.reject(new TypeError(\"RSVP.map must be called with an array\"), label);\n }\n\n if (typeof mapFn !== 'function') {\n return Promise.reject(new TypeError(\"RSVP.map expects a function as a second argument\"), label);\n }\n\n return new MapEnumerator(Promise, promises, mapFn, label).promise;\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.resolve`.\n \n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n function resolve$2(value, label) {\n return Promise.resolve(value, label);\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.reject`.\n \n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n function reject$2(reason, label) {\n return Promise.reject(reason, label);\n }\n\n const EMPTY_OBJECT = {};\n\n class FilterEnumerator extends MapEnumerator {\n\n _checkFullfillment() {\n if (this._remaining === 0 && this._result !== null) {\n let result = this._result.filter(val => val !== EMPTY_OBJECT);\n fulfill(this.promise, result);\n this._result = null;\n }\n }\n\n _setResultAt(state, i, value, firstPass) {\n if (firstPass) {\n this._result[i] = value;\n let val = tryCatch(this._mapFn)(value, i);\n if (val === TRY_CATCH_ERROR) {\n this._settledAt(REJECTED, i, val.error, false);\n } else {\n this._eachEntry(val, i, false);\n }\n } else {\n this._remaining--;\n if (!value) {\n this._result[i] = EMPTY_OBJECT;\n }\n }\n }\n }\n\n /**\n `RSVP.filter` is similar to JavaScript's native `filter` method.\n `filterFn` is eagerly called meaning that as soon as any promise\n resolves its value will be passed to `filterFn`. `RSVP.filter` returns\n a promise that will become fulfilled with the result of running\n `filterFn` on the values the promises become fulfilled with.\n \n For example:\n \n ```javascript\n \n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n \n let promises = [promise1, promise2, promise3];\n \n let filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n \n let filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n \n ```javascript\n \n let alice = { name: 'alice' };\n let bob = { name: 'bob' };\n let users = [ alice, bob ];\n \n let promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n \n let filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n \n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n */\n\n function filter(promises, filterFn, label) {\n if (typeof filterFn !== 'function') {\n return Promise.reject(new TypeError(\"RSVP.filter expects function as a second argument\"), label);\n }\n\n return Promise.resolve(promises, label).then(function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError(\"RSVP.filter must be called with an array\");\n }\n return new FilterEnumerator(Promise, promises, filterFn, label).promise;\n });\n }\n\n let len = 0;\n let vertxNext;\n function asap(callback, arg) {\n queue$1[len] = callback;\n queue$1[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush$1();\n }\n }\n\n const browserWindow = typeof window !== 'undefined' ? window : undefined;\n const browserGlobal = browserWindow || {};\n const BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n const isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n // node\n function useNextTick() {\n let nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n let version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return () => nextTick(flush);\n }\n\n // vertx\n function useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n return useSetTimeout();\n }\n\n function useMutationObserver() {\n let iterations = 0;\n let observer = new BrowserMutationObserver(flush);\n let node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return () => node.data = iterations = ++iterations % 2;\n }\n\n // web worker\n function useMessageChannel() {\n let channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return () => channel.port2.postMessage(0);\n }\n\n function useSetTimeout() {\n return () => setTimeout(flush, 1);\n }\n\n const queue$1 = new Array(1000);\n\n function flush() {\n for (let i = 0; i < len; i += 2) {\n let callback = queue$1[i];\n let arg = queue$1[i + 1];\n\n callback(arg);\n\n queue$1[i] = undefined;\n queue$1[i + 1] = undefined;\n }\n\n len = 0;\n }\n\n function attemptVertex() {\n try {\n const vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n }\n\n let scheduleFlush$1;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (isNode) {\n scheduleFlush$1 = useNextTick();\n } else if (BrowserMutationObserver) {\n scheduleFlush$1 = useMutationObserver();\n } else if (isWorker) {\n scheduleFlush$1 = useMessageChannel();\n } else if (browserWindow === undefined && typeof _nodeModule.require === 'function') {\n scheduleFlush$1 = attemptVertex();\n } else {\n scheduleFlush$1 = useSetTimeout();\n }\n\n // defaults\n config.async = asap;\n config.after = cb => setTimeout(cb, 0);\n const cast = resolve$2;\n\n const async = (callback, arg) => config.async(callback, arg);\n\n function on() {\n config.on(...arguments);\n }\n\n function off() {\n config.off(...arguments);\n }\n\n // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n let callbacks = window['__PROMISE_INSTRUMENTATION__'];\n configure('instrument', true);\n for (let eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n }\n\n // the default export here is for backwards compat:\n // https://github.com/tildeio/rsvp.js/issues/434\n var rsvp = {\n asap,\n cast,\n Promise,\n EventTarget,\n all: all$1,\n allSettled,\n race: race$1,\n hash,\n hashSettled,\n rethrow,\n defer,\n denodeify,\n configure,\n on,\n off,\n resolve: resolve$2,\n reject: reject$2,\n map,\n async,\n filter\n };\n\n exports.default = rsvp;\n exports.asap = asap;\n exports.cast = cast;\n exports.Promise = Promise;\n exports.EventTarget = EventTarget;\n exports.all = all$1;\n exports.allSettled = allSettled;\n exports.race = race$1;\n exports.hash = hash;\n exports.hashSettled = hashSettled;\n exports.rethrow = rethrow;\n exports.defer = defer;\n exports.denodeify = denodeify;\n exports.configure = configure;\n exports.on = on;\n exports.off = off;\n exports.resolve = resolve$2;\n exports.reject = reject$2;\n exports.map = map;\n exports.async = async;\n exports.filter = filter;\n});","enifed(\"simple-html-tokenizer\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n /**\n * generated from https://raw.githubusercontent.com/w3c/html/26b5126f96f736f796b9e29718138919dd513744/entities.json\n * do not edit\n */\n var namedCharRefs = {\n Aacute: \"Á\", aacute: \"á\", Abreve: \"Ă\", abreve: \"ă\", ac: \"∾\", acd: \"∿\", acE: \"∾̳\", Acirc: \"Â\", acirc: \"â\", acute: \"´\", Acy: \"А\", acy: \"а\", AElig: \"Æ\", aelig: \"æ\", af: \"\\u2061\", Afr: \"𝔄\", afr: \"𝔞\", Agrave: \"À\", agrave: \"à\", alefsym: \"ℵ\", aleph: \"ℵ\", Alpha: \"Α\", alpha: \"α\", Amacr: \"Ā\", amacr: \"ā\", amalg: \"⨿\", amp: \"&\", AMP: \"&\", andand: \"⩕\", And: \"⩓\", and: \"∧\", andd: \"⩜\", andslope: \"⩘\", andv: \"⩚\", ang: \"∠\", ange: \"⦤\", angle: \"∠\", angmsdaa: \"⦨\", angmsdab: \"⦩\", angmsdac: \"⦪\", angmsdad: \"⦫\", angmsdae: \"⦬\", angmsdaf: \"⦭\", angmsdag: \"⦮\", angmsdah: \"⦯\", angmsd: \"∡\", angrt: \"∟\", angrtvb: \"⊾\", angrtvbd: \"⦝\", angsph: \"∢\", angst: \"Å\", angzarr: \"⍼\", Aogon: \"Ą\", aogon: \"ą\", Aopf: \"𝔸\", aopf: \"𝕒\", apacir: \"⩯\", ap: \"≈\", apE: \"⩰\", ape: \"≊\", apid: \"≋\", apos: \"'\", ApplyFunction: \"\\u2061\", approx: \"≈\", approxeq: \"≊\", Aring: \"Å\", aring: \"å\", Ascr: \"𝒜\", ascr: \"𝒶\", Assign: \"≔\", ast: \"*\", asymp: \"≈\", asympeq: \"≍\", Atilde: \"Ã\", atilde: \"ã\", Auml: \"Ä\", auml: \"ä\", awconint: \"∳\", awint: \"⨑\", backcong: \"≌\", backepsilon: \"϶\", backprime: \"‵\", backsim: \"∽\", backsimeq: \"⋍\", Backslash: \"∖\", Barv: \"⫧\", barvee: \"⊽\", barwed: \"⌅\", Barwed: \"⌆\", barwedge: \"⌅\", bbrk: \"⎵\", bbrktbrk: \"⎶\", bcong: \"≌\", Bcy: \"Б\", bcy: \"б\", bdquo: \"„\", becaus: \"∵\", because: \"∵\", Because: \"∵\", bemptyv: \"⦰\", bepsi: \"϶\", bernou: \"ℬ\", Bernoullis: \"ℬ\", Beta: \"Β\", beta: \"β\", beth: \"ℶ\", between: \"≬\", Bfr: \"𝔅\", bfr: \"𝔟\", bigcap: \"⋂\", bigcirc: \"◯\", bigcup: \"⋃\", bigodot: \"⨀\", bigoplus: \"⨁\", bigotimes: \"⨂\", bigsqcup: \"⨆\", bigstar: \"★\", bigtriangledown: \"▽\", bigtriangleup: \"△\", biguplus: \"⨄\", bigvee: \"⋁\", bigwedge: \"⋀\", bkarow: \"⤍\", blacklozenge: \"⧫\", blacksquare: \"▪\", blacktriangle: \"▴\", blacktriangledown: \"▾\", blacktriangleleft: \"◂\", blacktriangleright: \"▸\", blank: \"␣\", blk12: \"▒\", blk14: \"░\", blk34: \"▓\", block: \"█\", bne: \"=⃥\", bnequiv: \"≡⃥\", bNot: \"⫭\", bnot: \"⌐\", Bopf: \"𝔹\", bopf: \"𝕓\", bot: \"⊥\", bottom: \"⊥\", bowtie: \"⋈\", boxbox: \"⧉\", boxdl: \"┐\", boxdL: \"╕\", boxDl: \"╖\", boxDL: \"╗\", boxdr: \"┌\", boxdR: \"╒\", boxDr: \"╓\", boxDR: \"╔\", boxh: \"─\", boxH: \"═\", boxhd: \"┬\", boxHd: \"╤\", boxhD: \"╥\", boxHD: \"╦\", boxhu: \"┴\", boxHu: \"╧\", boxhU: \"╨\", boxHU: \"╩\", boxminus: \"⊟\", boxplus: \"⊞\", boxtimes: \"⊠\", boxul: \"┘\", boxuL: \"╛\", boxUl: \"╜\", boxUL: \"╝\", boxur: \"└\", boxuR: \"╘\", boxUr: \"╙\", boxUR: \"╚\", boxv: \"│\", boxV: \"║\", boxvh: \"┼\", boxvH: \"╪\", boxVh: \"╫\", boxVH: \"╬\", boxvl: \"┤\", boxvL: \"╡\", boxVl: \"╢\", boxVL: \"╣\", boxvr: \"├\", boxvR: \"╞\", boxVr: \"╟\", boxVR: \"╠\", bprime: \"‵\", breve: \"˘\", Breve: \"˘\", brvbar: \"¦\", bscr: \"𝒷\", Bscr: \"ℬ\", bsemi: \"⁏\", bsim: \"∽\", bsime: \"⋍\", bsolb: \"⧅\", bsol: \"\\\\\", bsolhsub: \"⟈\", bull: \"•\", bullet: \"•\", bump: \"≎\", bumpE: \"⪮\", bumpe: \"≏\", Bumpeq: \"≎\", bumpeq: \"≏\", Cacute: \"Ć\", cacute: \"ć\", capand: \"⩄\", capbrcup: \"⩉\", capcap: \"⩋\", cap: \"∩\", Cap: \"⋒\", capcup: \"⩇\", capdot: \"⩀\", CapitalDifferentialD: \"ⅅ\", caps: \"∩︀\", caret: \"⁁\", caron: \"ˇ\", Cayleys: \"ℭ\", ccaps: \"⩍\", Ccaron: \"Č\", ccaron: \"č\", Ccedil: \"Ç\", ccedil: \"ç\", Ccirc: \"Ĉ\", ccirc: \"ĉ\", Cconint: \"∰\", ccups: \"⩌\", ccupssm: \"⩐\", Cdot: \"Ċ\", cdot: \"ċ\", cedil: \"¸\", Cedilla: \"¸\", cemptyv: \"⦲\", cent: \"¢\", centerdot: \"·\", CenterDot: \"·\", cfr: \"𝔠\", Cfr: \"ℭ\", CHcy: \"Ч\", chcy: \"ч\", check: \"✓\", checkmark: \"✓\", Chi: \"Χ\", chi: \"χ\", circ: \"ˆ\", circeq: \"≗\", circlearrowleft: \"↺\", circlearrowright: \"↻\", circledast: \"⊛\", circledcirc: \"⊚\", circleddash: \"⊝\", CircleDot: \"⊙\", circledR: \"®\", circledS: \"Ⓢ\", CircleMinus: \"⊖\", CirclePlus: \"⊕\", CircleTimes: \"⊗\", cir: \"○\", cirE: \"⧃\", cire: \"≗\", cirfnint: \"⨐\", cirmid: \"⫯\", cirscir: \"⧂\", ClockwiseContourIntegral: \"∲\", CloseCurlyDoubleQuote: \"”\", CloseCurlyQuote: \"’\", clubs: \"♣\", clubsuit: \"♣\", colon: \":\", Colon: \"∷\", Colone: \"⩴\", colone: \"≔\", coloneq: \"≔\", comma: \",\", commat: \"@\", comp: \"∁\", compfn: \"∘\", complement: \"∁\", complexes: \"ℂ\", cong: \"≅\", congdot: \"⩭\", Congruent: \"≡\", conint: \"∮\", Conint: \"∯\", ContourIntegral: \"∮\", copf: \"𝕔\", Copf: \"ℂ\", coprod: \"∐\", Coproduct: \"∐\", copy: \"©\", COPY: \"©\", copysr: \"℗\", CounterClockwiseContourIntegral: \"∳\", crarr: \"↵\", cross: \"✗\", Cross: \"⨯\", Cscr: \"𝒞\", cscr: \"𝒸\", csub: \"⫏\", csube: \"⫑\", csup: \"⫐\", csupe: \"⫒\", ctdot: \"⋯\", cudarrl: \"⤸\", cudarrr: \"⤵\", cuepr: \"⋞\", cuesc: \"⋟\", cularr: \"↶\", cularrp: \"⤽\", cupbrcap: \"⩈\", cupcap: \"⩆\", CupCap: \"≍\", cup: \"∪\", Cup: \"⋓\", cupcup: \"⩊\", cupdot: \"⊍\", cupor: \"⩅\", cups: \"∪︀\", curarr: \"↷\", curarrm: \"⤼\", curlyeqprec: \"⋞\", curlyeqsucc: \"⋟\", curlyvee: \"⋎\", curlywedge: \"⋏\", curren: \"¤\", curvearrowleft: \"↶\", curvearrowright: \"↷\", cuvee: \"⋎\", cuwed: \"⋏\", cwconint: \"∲\", cwint: \"∱\", cylcty: \"⌭\", dagger: \"†\", Dagger: \"‡\", daleth: \"ℸ\", darr: \"↓\", Darr: \"↡\", dArr: \"⇓\", dash: \"‐\", Dashv: \"⫤\", dashv: \"⊣\", dbkarow: \"⤏\", dblac: \"˝\", Dcaron: \"Ď\", dcaron: \"ď\", Dcy: \"Д\", dcy: \"д\", ddagger: \"‡\", ddarr: \"⇊\", DD: \"ⅅ\", dd: \"ⅆ\", DDotrahd: \"⤑\", ddotseq: \"⩷\", deg: \"°\", Del: \"∇\", Delta: \"Δ\", delta: \"δ\", demptyv: \"⦱\", dfisht: \"⥿\", Dfr: \"𝔇\", dfr: \"𝔡\", dHar: \"⥥\", dharl: \"⇃\", dharr: \"⇂\", DiacriticalAcute: \"´\", DiacriticalDot: \"˙\", DiacriticalDoubleAcute: \"˝\", DiacriticalGrave: \"`\", DiacriticalTilde: \"˜\", diam: \"⋄\", diamond: \"⋄\", Diamond: \"⋄\", diamondsuit: \"♦\", diams: \"♦\", die: \"¨\", DifferentialD: \"ⅆ\", digamma: \"ϝ\", disin: \"⋲\", div: \"÷\", divide: \"÷\", divideontimes: \"⋇\", divonx: \"⋇\", DJcy: \"Ђ\", djcy: \"ђ\", dlcorn: \"⌞\", dlcrop: \"⌍\", dollar: \"$\", Dopf: \"𝔻\", dopf: \"𝕕\", Dot: \"¨\", dot: \"˙\", DotDot: \"⃜\", doteq: \"≐\", doteqdot: \"≑\", DotEqual: \"≐\", dotminus: \"∸\", dotplus: \"∔\", dotsquare: \"⊡\", doublebarwedge: \"⌆\", DoubleContourIntegral: \"∯\", DoubleDot: \"¨\", DoubleDownArrow: \"⇓\", DoubleLeftArrow: \"⇐\", DoubleLeftRightArrow: \"⇔\", DoubleLeftTee: \"⫤\", DoubleLongLeftArrow: \"⟸\", DoubleLongLeftRightArrow: \"⟺\", DoubleLongRightArrow: \"⟹\", DoubleRightArrow: \"⇒\", DoubleRightTee: \"⊨\", DoubleUpArrow: \"⇑\", DoubleUpDownArrow: \"⇕\", DoubleVerticalBar: \"∥\", DownArrowBar: \"⤓\", downarrow: \"↓\", DownArrow: \"↓\", Downarrow: \"⇓\", DownArrowUpArrow: \"⇵\", DownBreve: \"̑\", downdownarrows: \"⇊\", downharpoonleft: \"⇃\", downharpoonright: \"⇂\", DownLeftRightVector: \"⥐\", DownLeftTeeVector: \"⥞\", DownLeftVectorBar: \"⥖\", DownLeftVector: \"↽\", DownRightTeeVector: \"⥟\", DownRightVectorBar: \"⥗\", DownRightVector: \"⇁\", DownTeeArrow: \"↧\", DownTee: \"⊤\", drbkarow: \"⤐\", drcorn: \"⌟\", drcrop: \"⌌\", Dscr: \"𝒟\", dscr: \"𝒹\", DScy: \"Ѕ\", dscy: \"ѕ\", dsol: \"⧶\", Dstrok: \"Đ\", dstrok: \"đ\", dtdot: \"⋱\", dtri: \"▿\", dtrif: \"▾\", duarr: \"⇵\", duhar: \"⥯\", dwangle: \"⦦\", DZcy: \"Џ\", dzcy: \"џ\", dzigrarr: \"⟿\", Eacute: \"É\", eacute: \"é\", easter: \"⩮\", Ecaron: \"Ě\", ecaron: \"ě\", Ecirc: \"Ê\", ecirc: \"ê\", ecir: \"≖\", ecolon: \"≕\", Ecy: \"Э\", ecy: \"э\", eDDot: \"⩷\", Edot: \"Ė\", edot: \"ė\", eDot: \"≑\", ee: \"ⅇ\", efDot: \"≒\", Efr: \"𝔈\", efr: \"𝔢\", eg: \"⪚\", Egrave: \"È\", egrave: \"è\", egs: \"⪖\", egsdot: \"⪘\", el: \"⪙\", Element: \"∈\", elinters: \"⏧\", ell: \"ℓ\", els: \"⪕\", elsdot: \"⪗\", Emacr: \"Ē\", emacr: \"ē\", empty: \"∅\", emptyset: \"∅\", EmptySmallSquare: \"◻\", emptyv: \"∅\", EmptyVerySmallSquare: \"▫\", emsp13: \" \", emsp14: \" \", emsp: \" \", ENG: \"Ŋ\", eng: \"ŋ\", ensp: \" \", Eogon: \"Ę\", eogon: \"ę\", Eopf: \"𝔼\", eopf: \"𝕖\", epar: \"⋕\", eparsl: \"⧣\", eplus: \"⩱\", epsi: \"ε\", Epsilon: \"Ε\", epsilon: \"ε\", epsiv: \"ϵ\", eqcirc: \"≖\", eqcolon: \"≕\", eqsim: \"≂\", eqslantgtr: \"⪖\", eqslantless: \"⪕\", Equal: \"⩵\", equals: \"=\", EqualTilde: \"≂\", equest: \"≟\", Equilibrium: \"⇌\", equiv: \"≡\", equivDD: \"⩸\", eqvparsl: \"⧥\", erarr: \"⥱\", erDot: \"≓\", escr: \"ℯ\", Escr: \"ℰ\", esdot: \"≐\", Esim: \"⩳\", esim: \"≂\", Eta: \"Η\", eta: \"η\", ETH: \"Ð\", eth: \"ð\", Euml: \"Ë\", euml: \"ë\", euro: \"€\", excl: \"!\", exist: \"∃\", Exists: \"∃\", expectation: \"ℰ\", exponentiale: \"ⅇ\", ExponentialE: \"ⅇ\", fallingdotseq: \"≒\", Fcy: \"Ф\", fcy: \"ф\", female: \"♀\", ffilig: \"ffi\", fflig: \"ff\", ffllig: \"ffl\", Ffr: \"𝔉\", ffr: \"𝔣\", filig: \"fi\", FilledSmallSquare: \"◼\", FilledVerySmallSquare: \"▪\", fjlig: \"fj\", flat: \"♭\", fllig: \"fl\", fltns: \"▱\", fnof: \"ƒ\", Fopf: \"𝔽\", fopf: \"𝕗\", forall: \"∀\", ForAll: \"∀\", fork: \"⋔\", forkv: \"⫙\", Fouriertrf: \"ℱ\", fpartint: \"⨍\", frac12: \"½\", frac13: \"⅓\", frac14: \"¼\", frac15: \"⅕\", frac16: \"⅙\", frac18: \"⅛\", frac23: \"⅔\", frac25: \"⅖\", frac34: \"¾\", frac35: \"⅗\", frac38: \"⅜\", frac45: \"⅘\", frac56: \"⅚\", frac58: \"⅝\", frac78: \"⅞\", frasl: \"⁄\", frown: \"⌢\", fscr: \"𝒻\", Fscr: \"ℱ\", gacute: \"ǵ\", Gamma: \"Γ\", gamma: \"γ\", Gammad: \"Ϝ\", gammad: \"ϝ\", gap: \"⪆\", Gbreve: \"Ğ\", gbreve: \"ğ\", Gcedil: \"Ģ\", Gcirc: \"Ĝ\", gcirc: \"ĝ\", Gcy: \"Г\", gcy: \"г\", Gdot: \"Ġ\", gdot: \"ġ\", ge: \"≥\", gE: \"≧\", gEl: \"⪌\", gel: \"⋛\", geq: \"≥\", geqq: \"≧\", geqslant: \"⩾\", gescc: \"⪩\", ges: \"⩾\", gesdot: \"⪀\", gesdoto: \"⪂\", gesdotol: \"⪄\", gesl: \"⋛︀\", gesles: \"⪔\", Gfr: \"𝔊\", gfr: \"𝔤\", gg: \"≫\", Gg: \"⋙\", ggg: \"⋙\", gimel: \"ℷ\", GJcy: \"Ѓ\", gjcy: \"ѓ\", gla: \"⪥\", gl: \"≷\", glE: \"⪒\", glj: \"⪤\", gnap: \"⪊\", gnapprox: \"⪊\", gne: \"⪈\", gnE: \"≩\", gneq: \"⪈\", gneqq: \"≩\", gnsim: \"⋧\", Gopf: \"𝔾\", gopf: \"𝕘\", grave: \"`\", GreaterEqual: \"≥\", GreaterEqualLess: \"⋛\", GreaterFullEqual: \"≧\", GreaterGreater: \"⪢\", GreaterLess: \"≷\", GreaterSlantEqual: \"⩾\", GreaterTilde: \"≳\", Gscr: \"𝒢\", gscr: \"ℊ\", gsim: \"≳\", gsime: \"⪎\", gsiml: \"⪐\", gtcc: \"⪧\", gtcir: \"⩺\", gt: \">\", GT: \">\", Gt: \"≫\", gtdot: \"⋗\", gtlPar: \"⦕\", gtquest: \"⩼\", gtrapprox: \"⪆\", gtrarr: \"⥸\", gtrdot: \"⋗\", gtreqless: \"⋛\", gtreqqless: \"⪌\", gtrless: \"≷\", gtrsim: \"≳\", gvertneqq: \"≩︀\", gvnE: \"≩︀\", Hacek: \"ˇ\", hairsp: \" \", half: \"½\", hamilt: \"ℋ\", HARDcy: \"Ъ\", hardcy: \"ъ\", harrcir: \"⥈\", harr: \"↔\", hArr: \"⇔\", harrw: \"↭\", Hat: \"^\", hbar: \"ℏ\", Hcirc: \"Ĥ\", hcirc: \"ĥ\", hearts: \"♥\", heartsuit: \"♥\", hellip: \"…\", hercon: \"⊹\", hfr: \"𝔥\", Hfr: \"ℌ\", HilbertSpace: \"ℋ\", hksearow: \"⤥\", hkswarow: \"⤦\", hoarr: \"⇿\", homtht: \"∻\", hookleftarrow: \"↩\", hookrightarrow: \"↪\", hopf: \"𝕙\", Hopf: \"ℍ\", horbar: \"―\", HorizontalLine: \"─\", hscr: \"𝒽\", Hscr: \"ℋ\", hslash: \"ℏ\", Hstrok: \"Ħ\", hstrok: \"ħ\", HumpDownHump: \"≎\", HumpEqual: \"≏\", hybull: \"⁃\", hyphen: \"‐\", Iacute: \"Í\", iacute: \"í\", ic: \"\\u2063\", Icirc: \"Î\", icirc: \"î\", Icy: \"И\", icy: \"и\", Idot: \"İ\", IEcy: \"Е\", iecy: \"е\", iexcl: \"¡\", iff: \"⇔\", ifr: \"𝔦\", Ifr: \"ℑ\", Igrave: \"Ì\", igrave: \"ì\", ii: \"ⅈ\", iiiint: \"⨌\", iiint: \"∭\", iinfin: \"⧜\", iiota: \"℩\", IJlig: \"IJ\", ijlig: \"ij\", Imacr: \"Ī\", imacr: \"ī\", image: \"ℑ\", ImaginaryI: \"ⅈ\", imagline: \"ℐ\", imagpart: \"ℑ\", imath: \"ı\", Im: \"ℑ\", imof: \"⊷\", imped: \"Ƶ\", Implies: \"⇒\", incare: \"℅\", in: \"∈\", infin: \"∞\", infintie: \"⧝\", inodot: \"ı\", intcal: \"⊺\", int: \"∫\", Int: \"∬\", integers: \"ℤ\", Integral: \"∫\", intercal: \"⊺\", Intersection: \"⋂\", intlarhk: \"⨗\", intprod: \"⨼\", InvisibleComma: \"\\u2063\", InvisibleTimes: \"\\u2062\", IOcy: \"Ё\", iocy: \"ё\", Iogon: \"Į\", iogon: \"į\", Iopf: \"𝕀\", iopf: \"𝕚\", Iota: \"Ι\", iota: \"ι\", iprod: \"⨼\", iquest: \"¿\", iscr: \"𝒾\", Iscr: \"ℐ\", isin: \"∈\", isindot: \"⋵\", isinE: \"⋹\", isins: \"⋴\", isinsv: \"⋳\", isinv: \"∈\", it: \"\\u2062\", Itilde: \"Ĩ\", itilde: \"ĩ\", Iukcy: \"І\", iukcy: \"і\", Iuml: \"Ï\", iuml: \"ï\", Jcirc: \"Ĵ\", jcirc: \"ĵ\", Jcy: \"Й\", jcy: \"й\", Jfr: \"𝔍\", jfr: \"𝔧\", jmath: \"ȷ\", Jopf: \"𝕁\", jopf: \"𝕛\", Jscr: \"𝒥\", jscr: \"𝒿\", Jsercy: \"Ј\", jsercy: \"ј\", Jukcy: \"Є\", jukcy: \"є\", Kappa: \"Κ\", kappa: \"κ\", kappav: \"ϰ\", Kcedil: \"Ķ\", kcedil: \"ķ\", Kcy: \"К\", kcy: \"к\", Kfr: \"𝔎\", kfr: \"𝔨\", kgreen: \"ĸ\", KHcy: \"Х\", khcy: \"х\", KJcy: \"Ќ\", kjcy: \"ќ\", Kopf: \"𝕂\", kopf: \"𝕜\", Kscr: \"𝒦\", kscr: \"𝓀\", lAarr: \"⇚\", Lacute: \"Ĺ\", lacute: \"ĺ\", laemptyv: \"⦴\", lagran: \"ℒ\", Lambda: \"Λ\", lambda: \"λ\", lang: \"⟨\", Lang: \"⟪\", langd: \"⦑\", langle: \"⟨\", lap: \"⪅\", Laplacetrf: \"ℒ\", laquo: \"«\", larrb: \"⇤\", larrbfs: \"⤟\", larr: \"←\", Larr: \"↞\", lArr: \"⇐\", larrfs: \"⤝\", larrhk: \"↩\", larrlp: \"↫\", larrpl: \"⤹\", larrsim: \"⥳\", larrtl: \"↢\", latail: \"⤙\", lAtail: \"⤛\", lat: \"⪫\", late: \"⪭\", lates: \"⪭︀\", lbarr: \"⤌\", lBarr: \"⤎\", lbbrk: \"❲\", lbrace: \"{\", lbrack: \"[\", lbrke: \"⦋\", lbrksld: \"⦏\", lbrkslu: \"⦍\", Lcaron: \"Ľ\", lcaron: \"ľ\", Lcedil: \"Ļ\", lcedil: \"ļ\", lceil: \"⌈\", lcub: \"{\", Lcy: \"Л\", lcy: \"л\", ldca: \"⤶\", ldquo: \"“\", ldquor: \"„\", ldrdhar: \"⥧\", ldrushar: \"⥋\", ldsh: \"↲\", le: \"≤\", lE: \"≦\", LeftAngleBracket: \"⟨\", LeftArrowBar: \"⇤\", leftarrow: \"←\", LeftArrow: \"←\", Leftarrow: \"⇐\", LeftArrowRightArrow: \"⇆\", leftarrowtail: \"↢\", LeftCeiling: \"⌈\", LeftDoubleBracket: \"⟦\", LeftDownTeeVector: \"⥡\", LeftDownVectorBar: \"⥙\", LeftDownVector: \"⇃\", LeftFloor: \"⌊\", leftharpoondown: \"↽\", leftharpoonup: \"↼\", leftleftarrows: \"⇇\", leftrightarrow: \"↔\", LeftRightArrow: \"↔\", Leftrightarrow: \"⇔\", leftrightarrows: \"⇆\", leftrightharpoons: \"⇋\", leftrightsquigarrow: \"↭\", LeftRightVector: \"⥎\", LeftTeeArrow: \"↤\", LeftTee: \"⊣\", LeftTeeVector: \"⥚\", leftthreetimes: \"⋋\", LeftTriangleBar: \"⧏\", LeftTriangle: \"⊲\", LeftTriangleEqual: \"⊴\", LeftUpDownVector: \"⥑\", LeftUpTeeVector: \"⥠\", LeftUpVectorBar: \"⥘\", LeftUpVector: \"↿\", LeftVectorBar: \"⥒\", LeftVector: \"↼\", lEg: \"⪋\", leg: \"⋚\", leq: \"≤\", leqq: \"≦\", leqslant: \"⩽\", lescc: \"⪨\", les: \"⩽\", lesdot: \"⩿\", lesdoto: \"⪁\", lesdotor: \"⪃\", lesg: \"⋚︀\", lesges: \"⪓\", lessapprox: \"⪅\", lessdot: \"⋖\", lesseqgtr: \"⋚\", lesseqqgtr: \"⪋\", LessEqualGreater: \"⋚\", LessFullEqual: \"≦\", LessGreater: \"≶\", lessgtr: \"≶\", LessLess: \"⪡\", lesssim: \"≲\", LessSlantEqual: \"⩽\", LessTilde: \"≲\", lfisht: \"⥼\", lfloor: \"⌊\", Lfr: \"𝔏\", lfr: \"𝔩\", lg: \"≶\", lgE: \"⪑\", lHar: \"⥢\", lhard: \"↽\", lharu: \"↼\", lharul: \"⥪\", lhblk: \"▄\", LJcy: \"Љ\", ljcy: \"љ\", llarr: \"⇇\", ll: \"≪\", Ll: \"⋘\", llcorner: \"⌞\", Lleftarrow: \"⇚\", llhard: \"⥫\", lltri: \"◺\", Lmidot: \"Ŀ\", lmidot: \"ŀ\", lmoustache: \"⎰\", lmoust: \"⎰\", lnap: \"⪉\", lnapprox: \"⪉\", lne: \"⪇\", lnE: \"≨\", lneq: \"⪇\", lneqq: \"≨\", lnsim: \"⋦\", loang: \"⟬\", loarr: \"⇽\", lobrk: \"⟦\", longleftarrow: \"⟵\", LongLeftArrow: \"⟵\", Longleftarrow: \"⟸\", longleftrightarrow: \"⟷\", LongLeftRightArrow: \"⟷\", Longleftrightarrow: \"⟺\", longmapsto: \"⟼\", longrightarrow: \"⟶\", LongRightArrow: \"⟶\", Longrightarrow: \"⟹\", looparrowleft: \"↫\", looparrowright: \"↬\", lopar: \"⦅\", Lopf: \"𝕃\", lopf: \"𝕝\", loplus: \"⨭\", lotimes: \"⨴\", lowast: \"∗\", lowbar: \"_\", LowerLeftArrow: \"↙\", LowerRightArrow: \"↘\", loz: \"◊\", lozenge: \"◊\", lozf: \"⧫\", lpar: \"(\", lparlt: \"⦓\", lrarr: \"⇆\", lrcorner: \"⌟\", lrhar: \"⇋\", lrhard: \"⥭\", lrm: \"\\u200e\", lrtri: \"⊿\", lsaquo: \"‹\", lscr: \"𝓁\", Lscr: \"ℒ\", lsh: \"↰\", Lsh: \"↰\", lsim: \"≲\", lsime: \"⪍\", lsimg: \"⪏\", lsqb: \"[\", lsquo: \"‘\", lsquor: \"‚\", Lstrok: \"Ł\", lstrok: \"ł\", ltcc: \"⪦\", ltcir: \"⩹\", lt: \"<\", LT: \"<\", Lt: \"≪\", ltdot: \"⋖\", lthree: \"⋋\", ltimes: \"⋉\", ltlarr: \"⥶\", ltquest: \"⩻\", ltri: \"◃\", ltrie: \"⊴\", ltrif: \"◂\", ltrPar: \"⦖\", lurdshar: \"⥊\", luruhar: \"⥦\", lvertneqq: \"≨︀\", lvnE: \"≨︀\", macr: \"¯\", male: \"♂\", malt: \"✠\", maltese: \"✠\", Map: \"⤅\", map: \"↦\", mapsto: \"↦\", mapstodown: \"↧\", mapstoleft: \"↤\", mapstoup: \"↥\", marker: \"▮\", mcomma: \"⨩\", Mcy: \"М\", mcy: \"м\", mdash: \"—\", mDDot: \"∺\", measuredangle: \"∡\", MediumSpace: \" \", Mellintrf: \"ℳ\", Mfr: \"𝔐\", mfr: \"𝔪\", mho: \"℧\", micro: \"µ\", midast: \"*\", midcir: \"⫰\", mid: \"∣\", middot: \"·\", minusb: \"⊟\", minus: \"−\", minusd: \"∸\", minusdu: \"⨪\", MinusPlus: \"∓\", mlcp: \"⫛\", mldr: \"…\", mnplus: \"∓\", models: \"⊧\", Mopf: \"𝕄\", mopf: \"𝕞\", mp: \"∓\", mscr: \"𝓂\", Mscr: \"ℳ\", mstpos: \"∾\", Mu: \"Μ\", mu: \"μ\", multimap: \"⊸\", mumap: \"⊸\", nabla: \"∇\", Nacute: \"Ń\", nacute: \"ń\", nang: \"∠⃒\", nap: \"≉\", napE: \"⩰̸\", napid: \"≋̸\", napos: \"ʼn\", napprox: \"≉\", natural: \"♮\", naturals: \"ℕ\", natur: \"♮\", nbsp: \" \", nbump: \"≎̸\", nbumpe: \"≏̸\", ncap: \"⩃\", Ncaron: \"Ň\", ncaron: \"ň\", Ncedil: \"Ņ\", ncedil: \"ņ\", ncong: \"≇\", ncongdot: \"⩭̸\", ncup: \"⩂\", Ncy: \"Н\", ncy: \"н\", ndash: \"–\", nearhk: \"⤤\", nearr: \"↗\", neArr: \"⇗\", nearrow: \"↗\", ne: \"≠\", nedot: \"≐̸\", NegativeMediumSpace: \"​\", NegativeThickSpace: \"​\", NegativeThinSpace: \"​\", NegativeVeryThinSpace: \"​\", nequiv: \"≢\", nesear: \"⤨\", nesim: \"≂̸\", NestedGreaterGreater: \"≫\", NestedLessLess: \"≪\", NewLine: \"\\u000a\", nexist: \"∄\", nexists: \"∄\", Nfr: \"𝔑\", nfr: \"𝔫\", ngE: \"≧̸\", nge: \"≱\", ngeq: \"≱\", ngeqq: \"≧̸\", ngeqslant: \"⩾̸\", nges: \"⩾̸\", nGg: \"⋙̸\", ngsim: \"≵\", nGt: \"≫⃒\", ngt: \"≯\", ngtr: \"≯\", nGtv: \"≫̸\", nharr: \"↮\", nhArr: \"⇎\", nhpar: \"⫲\", ni: \"∋\", nis: \"⋼\", nisd: \"⋺\", niv: \"∋\", NJcy: \"Њ\", njcy: \"њ\", nlarr: \"↚\", nlArr: \"⇍\", nldr: \"‥\", nlE: \"≦̸\", nle: \"≰\", nleftarrow: \"↚\", nLeftarrow: \"⇍\", nleftrightarrow: \"↮\", nLeftrightarrow: \"⇎\", nleq: \"≰\", nleqq: \"≦̸\", nleqslant: \"⩽̸\", nles: \"⩽̸\", nless: \"≮\", nLl: \"⋘̸\", nlsim: \"≴\", nLt: \"≪⃒\", nlt: \"≮\", nltri: \"⋪\", nltrie: \"⋬\", nLtv: \"≪̸\", nmid: \"∤\", NoBreak: \"\\u2060\", NonBreakingSpace: \" \", nopf: \"𝕟\", Nopf: \"ℕ\", Not: \"⫬\", not: \"¬\", NotCongruent: \"≢\", NotCupCap: \"≭\", NotDoubleVerticalBar: \"∦\", NotElement: \"∉\", NotEqual: \"≠\", NotEqualTilde: \"≂̸\", NotExists: \"∄\", NotGreater: \"≯\", NotGreaterEqual: \"≱\", NotGreaterFullEqual: \"≧̸\", NotGreaterGreater: \"≫̸\", NotGreaterLess: \"≹\", NotGreaterSlantEqual: \"⩾̸\", NotGreaterTilde: \"≵\", NotHumpDownHump: \"≎̸\", NotHumpEqual: \"≏̸\", notin: \"∉\", notindot: \"⋵̸\", notinE: \"⋹̸\", notinva: \"∉\", notinvb: \"⋷\", notinvc: \"⋶\", NotLeftTriangleBar: \"⧏̸\", NotLeftTriangle: \"⋪\", NotLeftTriangleEqual: \"⋬\", NotLess: \"≮\", NotLessEqual: \"≰\", NotLessGreater: \"≸\", NotLessLess: \"≪̸\", NotLessSlantEqual: \"⩽̸\", NotLessTilde: \"≴\", NotNestedGreaterGreater: \"⪢̸\", NotNestedLessLess: \"⪡̸\", notni: \"∌\", notniva: \"∌\", notnivb: \"⋾\", notnivc: \"⋽\", NotPrecedes: \"⊀\", NotPrecedesEqual: \"⪯̸\", NotPrecedesSlantEqual: \"⋠\", NotReverseElement: \"∌\", NotRightTriangleBar: \"⧐̸\", NotRightTriangle: \"⋫\", NotRightTriangleEqual: \"⋭\", NotSquareSubset: \"⊏̸\", NotSquareSubsetEqual: \"⋢\", NotSquareSuperset: \"⊐̸\", NotSquareSupersetEqual: \"⋣\", NotSubset: \"⊂⃒\", NotSubsetEqual: \"⊈\", NotSucceeds: \"⊁\", NotSucceedsEqual: \"⪰̸\", NotSucceedsSlantEqual: \"⋡\", NotSucceedsTilde: \"≿̸\", NotSuperset: \"⊃⃒\", NotSupersetEqual: \"⊉\", NotTilde: \"≁\", NotTildeEqual: \"≄\", NotTildeFullEqual: \"≇\", NotTildeTilde: \"≉\", NotVerticalBar: \"∤\", nparallel: \"∦\", npar: \"∦\", nparsl: \"⫽⃥\", npart: \"∂̸\", npolint: \"⨔\", npr: \"⊀\", nprcue: \"⋠\", nprec: \"⊀\", npreceq: \"⪯̸\", npre: \"⪯̸\", nrarrc: \"⤳̸\", nrarr: \"↛\", nrArr: \"⇏\", nrarrw: \"↝̸\", nrightarrow: \"↛\", nRightarrow: \"⇏\", nrtri: \"⋫\", nrtrie: \"⋭\", nsc: \"⊁\", nsccue: \"⋡\", nsce: \"⪰̸\", Nscr: \"𝒩\", nscr: \"𝓃\", nshortmid: \"∤\", nshortparallel: \"∦\", nsim: \"≁\", nsime: \"≄\", nsimeq: \"≄\", nsmid: \"∤\", nspar: \"∦\", nsqsube: \"⋢\", nsqsupe: \"⋣\", nsub: \"⊄\", nsubE: \"⫅̸\", nsube: \"⊈\", nsubset: \"⊂⃒\", nsubseteq: \"⊈\", nsubseteqq: \"⫅̸\", nsucc: \"⊁\", nsucceq: \"⪰̸\", nsup: \"⊅\", nsupE: \"⫆̸\", nsupe: \"⊉\", nsupset: \"⊃⃒\", nsupseteq: \"⊉\", nsupseteqq: \"⫆̸\", ntgl: \"≹\", Ntilde: \"Ñ\", ntilde: \"ñ\", ntlg: \"≸\", ntriangleleft: \"⋪\", ntrianglelefteq: \"⋬\", ntriangleright: \"⋫\", ntrianglerighteq: \"⋭\", Nu: \"Ν\", nu: \"ν\", num: \"#\", numero: \"№\", numsp: \" \", nvap: \"≍⃒\", nvdash: \"⊬\", nvDash: \"⊭\", nVdash: \"⊮\", nVDash: \"⊯\", nvge: \"≥⃒\", nvgt: \">⃒\", nvHarr: \"⤄\", nvinfin: \"⧞\", nvlArr: \"⤂\", nvle: \"≤⃒\", nvlt: \"<⃒\", nvltrie: \"⊴⃒\", nvrArr: \"⤃\", nvrtrie: \"⊵⃒\", nvsim: \"∼⃒\", nwarhk: \"⤣\", nwarr: \"↖\", nwArr: \"⇖\", nwarrow: \"↖\", nwnear: \"⤧\", Oacute: \"Ó\", oacute: \"ó\", oast: \"⊛\", Ocirc: \"Ô\", ocirc: \"ô\", ocir: \"⊚\", Ocy: \"О\", ocy: \"о\", odash: \"⊝\", Odblac: \"Ő\", odblac: \"ő\", odiv: \"⨸\", odot: \"⊙\", odsold: \"⦼\", OElig: \"Œ\", oelig: \"œ\", ofcir: \"⦿\", Ofr: \"𝔒\", ofr: \"𝔬\", ogon: \"˛\", Ograve: \"Ò\", ograve: \"ò\", ogt: \"⧁\", ohbar: \"⦵\", ohm: \"Ω\", oint: \"∮\", olarr: \"↺\", olcir: \"⦾\", olcross: \"⦻\", oline: \"‾\", olt: \"⧀\", Omacr: \"Ō\", omacr: \"ō\", Omega: \"Ω\", omega: \"ω\", Omicron: \"Ο\", omicron: \"ο\", omid: \"⦶\", ominus: \"⊖\", Oopf: \"𝕆\", oopf: \"𝕠\", opar: \"⦷\", OpenCurlyDoubleQuote: \"“\", OpenCurlyQuote: \"‘\", operp: \"⦹\", oplus: \"⊕\", orarr: \"↻\", Or: \"⩔\", or: \"∨\", ord: \"⩝\", order: \"ℴ\", orderof: \"ℴ\", ordf: \"ª\", ordm: \"º\", origof: \"⊶\", oror: \"⩖\", orslope: \"⩗\", orv: \"⩛\", oS: \"Ⓢ\", Oscr: \"𝒪\", oscr: \"ℴ\", Oslash: \"Ø\", oslash: \"ø\", osol: \"⊘\", Otilde: \"Õ\", otilde: \"õ\", otimesas: \"⨶\", Otimes: \"⨷\", otimes: \"⊗\", Ouml: \"Ö\", ouml: \"ö\", ovbar: \"⌽\", OverBar: \"‾\", OverBrace: \"⏞\", OverBracket: \"⎴\", OverParenthesis: \"⏜\", para: \"¶\", parallel: \"∥\", par: \"∥\", parsim: \"⫳\", parsl: \"⫽\", part: \"∂\", PartialD: \"∂\", Pcy: \"П\", pcy: \"п\", percnt: \"%\", period: \".\", permil: \"‰\", perp: \"⊥\", pertenk: \"‱\", Pfr: \"𝔓\", pfr: \"𝔭\", Phi: \"Φ\", phi: \"φ\", phiv: \"ϕ\", phmmat: \"ℳ\", phone: \"☎\", Pi: \"Π\", pi: \"π\", pitchfork: \"⋔\", piv: \"ϖ\", planck: \"ℏ\", planckh: \"ℎ\", plankv: \"ℏ\", plusacir: \"⨣\", plusb: \"⊞\", pluscir: \"⨢\", plus: \"+\", plusdo: \"∔\", plusdu: \"⨥\", pluse: \"⩲\", PlusMinus: \"±\", plusmn: \"±\", plussim: \"⨦\", plustwo: \"⨧\", pm: \"±\", Poincareplane: \"ℌ\", pointint: \"⨕\", popf: \"𝕡\", Popf: \"ℙ\", pound: \"£\", prap: \"⪷\", Pr: \"⪻\", pr: \"≺\", prcue: \"≼\", precapprox: \"⪷\", prec: \"≺\", preccurlyeq: \"≼\", Precedes: \"≺\", PrecedesEqual: \"⪯\", PrecedesSlantEqual: \"≼\", PrecedesTilde: \"≾\", preceq: \"⪯\", precnapprox: \"⪹\", precneqq: \"⪵\", precnsim: \"⋨\", pre: \"⪯\", prE: \"⪳\", precsim: \"≾\", prime: \"′\", Prime: \"″\", primes: \"ℙ\", prnap: \"⪹\", prnE: \"⪵\", prnsim: \"⋨\", prod: \"∏\", Product: \"∏\", profalar: \"⌮\", profline: \"⌒\", profsurf: \"⌓\", prop: \"∝\", Proportional: \"∝\", Proportion: \"∷\", propto: \"∝\", prsim: \"≾\", prurel: \"⊰\", Pscr: \"𝒫\", pscr: \"𝓅\", Psi: \"Ψ\", psi: \"ψ\", puncsp: \" \", Qfr: \"𝔔\", qfr: \"𝔮\", qint: \"⨌\", qopf: \"𝕢\", Qopf: \"ℚ\", qprime: \"⁗\", Qscr: \"𝒬\", qscr: \"𝓆\", quaternions: \"ℍ\", quatint: \"⨖\", quest: \"?\", questeq: \"≟\", quot: \"\\\"\", QUOT: \"\\\"\", rAarr: \"⇛\", race: \"∽̱\", Racute: \"Ŕ\", racute: \"ŕ\", radic: \"√\", raemptyv: \"⦳\", rang: \"⟩\", Rang: \"⟫\", rangd: \"⦒\", range: \"⦥\", rangle: \"⟩\", raquo: \"»\", rarrap: \"⥵\", rarrb: \"⇥\", rarrbfs: \"⤠\", rarrc: \"⤳\", rarr: \"→\", Rarr: \"↠\", rArr: \"⇒\", rarrfs: \"⤞\", rarrhk: \"↪\", rarrlp: \"↬\", rarrpl: \"⥅\", rarrsim: \"⥴\", Rarrtl: \"⤖\", rarrtl: \"↣\", rarrw: \"↝\", ratail: \"⤚\", rAtail: \"⤜\", ratio: \"∶\", rationals: \"ℚ\", rbarr: \"⤍\", rBarr: \"⤏\", RBarr: \"⤐\", rbbrk: \"❳\", rbrace: \"}\", rbrack: \"]\", rbrke: \"⦌\", rbrksld: \"⦎\", rbrkslu: \"⦐\", Rcaron: \"Ř\", rcaron: \"ř\", Rcedil: \"Ŗ\", rcedil: \"ŗ\", rceil: \"⌉\", rcub: \"}\", Rcy: \"Р\", rcy: \"р\", rdca: \"⤷\", rdldhar: \"⥩\", rdquo: \"”\", rdquor: \"”\", rdsh: \"↳\", real: \"ℜ\", realine: \"ℛ\", realpart: \"ℜ\", reals: \"ℝ\", Re: \"ℜ\", rect: \"▭\", reg: \"®\", REG: \"®\", ReverseElement: \"∋\", ReverseEquilibrium: \"⇋\", ReverseUpEquilibrium: \"⥯\", rfisht: \"⥽\", rfloor: \"⌋\", rfr: \"𝔯\", Rfr: \"ℜ\", rHar: \"⥤\", rhard: \"⇁\", rharu: \"⇀\", rharul: \"⥬\", Rho: \"Ρ\", rho: \"ρ\", rhov: \"ϱ\", RightAngleBracket: \"⟩\", RightArrowBar: \"⇥\", rightarrow: \"→\", RightArrow: \"→\", Rightarrow: \"⇒\", RightArrowLeftArrow: \"⇄\", rightarrowtail: \"↣\", RightCeiling: \"⌉\", RightDoubleBracket: \"⟧\", RightDownTeeVector: \"⥝\", RightDownVectorBar: \"⥕\", RightDownVector: \"⇂\", RightFloor: \"⌋\", rightharpoondown: \"⇁\", rightharpoonup: \"⇀\", rightleftarrows: \"⇄\", rightleftharpoons: \"⇌\", rightrightarrows: \"⇉\", rightsquigarrow: \"↝\", RightTeeArrow: \"↦\", RightTee: \"⊢\", RightTeeVector: \"⥛\", rightthreetimes: \"⋌\", RightTriangleBar: \"⧐\", RightTriangle: \"⊳\", RightTriangleEqual: \"⊵\", RightUpDownVector: \"⥏\", RightUpTeeVector: \"⥜\", RightUpVectorBar: \"⥔\", RightUpVector: \"↾\", RightVectorBar: \"⥓\", RightVector: \"⇀\", ring: \"˚\", risingdotseq: \"≓\", rlarr: \"⇄\", rlhar: \"⇌\", rlm: \"\\u200f\", rmoustache: \"⎱\", rmoust: \"⎱\", rnmid: \"⫮\", roang: \"⟭\", roarr: \"⇾\", robrk: \"⟧\", ropar: \"⦆\", ropf: \"𝕣\", Ropf: \"ℝ\", roplus: \"⨮\", rotimes: \"⨵\", RoundImplies: \"⥰\", rpar: \")\", rpargt: \"⦔\", rppolint: \"⨒\", rrarr: \"⇉\", Rrightarrow: \"⇛\", rsaquo: \"›\", rscr: \"𝓇\", Rscr: \"ℛ\", rsh: \"↱\", Rsh: \"↱\", rsqb: \"]\", rsquo: \"’\", rsquor: \"’\", rthree: \"⋌\", rtimes: \"⋊\", rtri: \"▹\", rtrie: \"⊵\", rtrif: \"▸\", rtriltri: \"⧎\", RuleDelayed: \"⧴\", ruluhar: \"⥨\", rx: \"℞\", Sacute: \"Ś\", sacute: \"ś\", sbquo: \"‚\", scap: \"⪸\", Scaron: \"Š\", scaron: \"š\", Sc: \"⪼\", sc: \"≻\", sccue: \"≽\", sce: \"⪰\", scE: \"⪴\", Scedil: \"Ş\", scedil: \"ş\", Scirc: \"Ŝ\", scirc: \"ŝ\", scnap: \"⪺\", scnE: \"⪶\", scnsim: \"⋩\", scpolint: \"⨓\", scsim: \"≿\", Scy: \"С\", scy: \"с\", sdotb: \"⊡\", sdot: \"⋅\", sdote: \"⩦\", searhk: \"⤥\", searr: \"↘\", seArr: \"⇘\", searrow: \"↘\", sect: \"§\", semi: \";\", seswar: \"⤩\", setminus: \"∖\", setmn: \"∖\", sext: \"✶\", Sfr: \"𝔖\", sfr: \"𝔰\", sfrown: \"⌢\", sharp: \"♯\", SHCHcy: \"Щ\", shchcy: \"щ\", SHcy: \"Ш\", shcy: \"ш\", ShortDownArrow: \"↓\", ShortLeftArrow: \"←\", shortmid: \"∣\", shortparallel: \"∥\", ShortRightArrow: \"→\", ShortUpArrow: \"↑\", shy: \"\\u00ad\", Sigma: \"Σ\", sigma: \"σ\", sigmaf: \"ς\", sigmav: \"ς\", sim: \"∼\", simdot: \"⩪\", sime: \"≃\", simeq: \"≃\", simg: \"⪞\", simgE: \"⪠\", siml: \"⪝\", simlE: \"⪟\", simne: \"≆\", simplus: \"⨤\", simrarr: \"⥲\", slarr: \"←\", SmallCircle: \"∘\", smallsetminus: \"∖\", smashp: \"⨳\", smeparsl: \"⧤\", smid: \"∣\", smile: \"⌣\", smt: \"⪪\", smte: \"⪬\", smtes: \"⪬︀\", SOFTcy: \"Ь\", softcy: \"ь\", solbar: \"⌿\", solb: \"⧄\", sol: \"/\", Sopf: \"𝕊\", sopf: \"𝕤\", spades: \"♠\", spadesuit: \"♠\", spar: \"∥\", sqcap: \"⊓\", sqcaps: \"⊓︀\", sqcup: \"⊔\", sqcups: \"⊔︀\", Sqrt: \"√\", sqsub: \"⊏\", sqsube: \"⊑\", sqsubset: \"⊏\", sqsubseteq: \"⊑\", sqsup: \"⊐\", sqsupe: \"⊒\", sqsupset: \"⊐\", sqsupseteq: \"⊒\", square: \"□\", Square: \"□\", SquareIntersection: \"⊓\", SquareSubset: \"⊏\", SquareSubsetEqual: \"⊑\", SquareSuperset: \"⊐\", SquareSupersetEqual: \"⊒\", SquareUnion: \"⊔\", squarf: \"▪\", squ: \"□\", squf: \"▪\", srarr: \"→\", Sscr: \"𝒮\", sscr: \"𝓈\", ssetmn: \"∖\", ssmile: \"⌣\", sstarf: \"⋆\", Star: \"⋆\", star: \"☆\", starf: \"★\", straightepsilon: \"ϵ\", straightphi: \"ϕ\", strns: \"¯\", sub: \"⊂\", Sub: \"⋐\", subdot: \"⪽\", subE: \"⫅\", sube: \"⊆\", subedot: \"⫃\", submult: \"⫁\", subnE: \"⫋\", subne: \"⊊\", subplus: \"⪿\", subrarr: \"⥹\", subset: \"⊂\", Subset: \"⋐\", subseteq: \"⊆\", subseteqq: \"⫅\", SubsetEqual: \"⊆\", subsetneq: \"⊊\", subsetneqq: \"⫋\", subsim: \"⫇\", subsub: \"⫕\", subsup: \"⫓\", succapprox: \"⪸\", succ: \"≻\", succcurlyeq: \"≽\", Succeeds: \"≻\", SucceedsEqual: \"⪰\", SucceedsSlantEqual: \"≽\", SucceedsTilde: \"≿\", succeq: \"⪰\", succnapprox: \"⪺\", succneqq: \"⪶\", succnsim: \"⋩\", succsim: \"≿\", SuchThat: \"∋\", sum: \"∑\", Sum: \"∑\", sung: \"♪\", sup1: \"¹\", sup2: \"²\", sup3: \"³\", sup: \"⊃\", Sup: \"⋑\", supdot: \"⪾\", supdsub: \"⫘\", supE: \"⫆\", supe: \"⊇\", supedot: \"⫄\", Superset: \"⊃\", SupersetEqual: \"⊇\", suphsol: \"⟉\", suphsub: \"⫗\", suplarr: \"⥻\", supmult: \"⫂\", supnE: \"⫌\", supne: \"⊋\", supplus: \"⫀\", supset: \"⊃\", Supset: \"⋑\", supseteq: \"⊇\", supseteqq: \"⫆\", supsetneq: \"⊋\", supsetneqq: \"⫌\", supsim: \"⫈\", supsub: \"⫔\", supsup: \"⫖\", swarhk: \"⤦\", swarr: \"↙\", swArr: \"⇙\", swarrow: \"↙\", swnwar: \"⤪\", szlig: \"ß\", Tab: \"\\u0009\", target: \"⌖\", Tau: \"Τ\", tau: \"τ\", tbrk: \"⎴\", Tcaron: \"Ť\", tcaron: \"ť\", Tcedil: \"Ţ\", tcedil: \"ţ\", Tcy: \"Т\", tcy: \"т\", tdot: \"⃛\", telrec: \"⌕\", Tfr: \"𝔗\", tfr: \"𝔱\", there4: \"∴\", therefore: \"∴\", Therefore: \"∴\", Theta: \"Θ\", theta: \"θ\", thetasym: \"ϑ\", thetav: \"ϑ\", thickapprox: \"≈\", thicksim: \"∼\", ThickSpace: \"  \", ThinSpace: \" \", thinsp: \" \", thkap: \"≈\", thksim: \"∼\", THORN: \"Þ\", thorn: \"þ\", tilde: \"˜\", Tilde: \"∼\", TildeEqual: \"≃\", TildeFullEqual: \"≅\", TildeTilde: \"≈\", timesbar: \"⨱\", timesb: \"⊠\", times: \"×\", timesd: \"⨰\", tint: \"∭\", toea: \"⤨\", topbot: \"⌶\", topcir: \"⫱\", top: \"⊤\", Topf: \"𝕋\", topf: \"𝕥\", topfork: \"⫚\", tosa: \"⤩\", tprime: \"‴\", trade: \"™\", TRADE: \"™\", triangle: \"▵\", triangledown: \"▿\", triangleleft: \"◃\", trianglelefteq: \"⊴\", triangleq: \"≜\", triangleright: \"▹\", trianglerighteq: \"⊵\", tridot: \"◬\", trie: \"≜\", triminus: \"⨺\", TripleDot: \"⃛\", triplus: \"⨹\", trisb: \"⧍\", tritime: \"⨻\", trpezium: \"⏢\", Tscr: \"𝒯\", tscr: \"𝓉\", TScy: \"Ц\", tscy: \"ц\", TSHcy: \"Ћ\", tshcy: \"ћ\", Tstrok: \"Ŧ\", tstrok: \"ŧ\", twixt: \"≬\", twoheadleftarrow: \"↞\", twoheadrightarrow: \"↠\", Uacute: \"Ú\", uacute: \"ú\", uarr: \"↑\", Uarr: \"↟\", uArr: \"⇑\", Uarrocir: \"⥉\", Ubrcy: \"Ў\", ubrcy: \"ў\", Ubreve: \"Ŭ\", ubreve: \"ŭ\", Ucirc: \"Û\", ucirc: \"û\", Ucy: \"У\", ucy: \"у\", udarr: \"⇅\", Udblac: \"Ű\", udblac: \"ű\", udhar: \"⥮\", ufisht: \"⥾\", Ufr: \"𝔘\", ufr: \"𝔲\", Ugrave: \"Ù\", ugrave: \"ù\", uHar: \"⥣\", uharl: \"↿\", uharr: \"↾\", uhblk: \"▀\", ulcorn: \"⌜\", ulcorner: \"⌜\", ulcrop: \"⌏\", ultri: \"◸\", Umacr: \"Ū\", umacr: \"ū\", uml: \"¨\", UnderBar: \"_\", UnderBrace: \"⏟\", UnderBracket: \"⎵\", UnderParenthesis: \"⏝\", Union: \"⋃\", UnionPlus: \"⊎\", Uogon: \"Ų\", uogon: \"ų\", Uopf: \"𝕌\", uopf: \"𝕦\", UpArrowBar: \"⤒\", uparrow: \"↑\", UpArrow: \"↑\", Uparrow: \"⇑\", UpArrowDownArrow: \"⇅\", updownarrow: \"↕\", UpDownArrow: \"↕\", Updownarrow: \"⇕\", UpEquilibrium: \"⥮\", upharpoonleft: \"↿\", upharpoonright: \"↾\", uplus: \"⊎\", UpperLeftArrow: \"↖\", UpperRightArrow: \"↗\", upsi: \"υ\", Upsi: \"ϒ\", upsih: \"ϒ\", Upsilon: \"Υ\", upsilon: \"υ\", UpTeeArrow: \"↥\", UpTee: \"⊥\", upuparrows: \"⇈\", urcorn: \"⌝\", urcorner: \"⌝\", urcrop: \"⌎\", Uring: \"Ů\", uring: \"ů\", urtri: \"◹\", Uscr: \"𝒰\", uscr: \"𝓊\", utdot: \"⋰\", Utilde: \"Ũ\", utilde: \"ũ\", utri: \"▵\", utrif: \"▴\", uuarr: \"⇈\", Uuml: \"Ü\", uuml: \"ü\", uwangle: \"⦧\", vangrt: \"⦜\", varepsilon: \"ϵ\", varkappa: \"ϰ\", varnothing: \"∅\", varphi: \"ϕ\", varpi: \"ϖ\", varpropto: \"∝\", varr: \"↕\", vArr: \"⇕\", varrho: \"ϱ\", varsigma: \"ς\", varsubsetneq: \"⊊︀\", varsubsetneqq: \"⫋︀\", varsupsetneq: \"⊋︀\", varsupsetneqq: \"⫌︀\", vartheta: \"ϑ\", vartriangleleft: \"⊲\", vartriangleright: \"⊳\", vBar: \"⫨\", Vbar: \"⫫\", vBarv: \"⫩\", Vcy: \"В\", vcy: \"в\", vdash: \"⊢\", vDash: \"⊨\", Vdash: \"⊩\", VDash: \"⊫\", Vdashl: \"⫦\", veebar: \"⊻\", vee: \"∨\", Vee: \"⋁\", veeeq: \"≚\", vellip: \"⋮\", verbar: \"|\", Verbar: \"‖\", vert: \"|\", Vert: \"‖\", VerticalBar: \"∣\", VerticalLine: \"|\", VerticalSeparator: \"❘\", VerticalTilde: \"≀\", VeryThinSpace: \" \", Vfr: \"𝔙\", vfr: \"𝔳\", vltri: \"⊲\", vnsub: \"⊂⃒\", vnsup: \"⊃⃒\", Vopf: \"𝕍\", vopf: \"𝕧\", vprop: \"∝\", vrtri: \"⊳\", Vscr: \"𝒱\", vscr: \"𝓋\", vsubnE: \"⫋︀\", vsubne: \"⊊︀\", vsupnE: \"⫌︀\", vsupne: \"⊋︀\", Vvdash: \"⊪\", vzigzag: \"⦚\", Wcirc: \"Ŵ\", wcirc: \"ŵ\", wedbar: \"⩟\", wedge: \"∧\", Wedge: \"⋀\", wedgeq: \"≙\", weierp: \"℘\", Wfr: \"𝔚\", wfr: \"𝔴\", Wopf: \"𝕎\", wopf: \"𝕨\", wp: \"℘\", wr: \"≀\", wreath: \"≀\", Wscr: \"𝒲\", wscr: \"𝓌\", xcap: \"⋂\", xcirc: \"◯\", xcup: \"⋃\", xdtri: \"▽\", Xfr: \"𝔛\", xfr: \"𝔵\", xharr: \"⟷\", xhArr: \"⟺\", Xi: \"Ξ\", xi: \"ξ\", xlarr: \"⟵\", xlArr: \"⟸\", xmap: \"⟼\", xnis: \"⋻\", xodot: \"⨀\", Xopf: \"𝕏\", xopf: \"𝕩\", xoplus: \"⨁\", xotime: \"⨂\", xrarr: \"⟶\", xrArr: \"⟹\", Xscr: \"𝒳\", xscr: \"𝓍\", xsqcup: \"⨆\", xuplus: \"⨄\", xutri: \"△\", xvee: \"⋁\", xwedge: \"⋀\", Yacute: \"Ý\", yacute: \"ý\", YAcy: \"Я\", yacy: \"я\", Ycirc: \"Ŷ\", ycirc: \"ŷ\", Ycy: \"Ы\", ycy: \"ы\", yen: \"¥\", Yfr: \"𝔜\", yfr: \"𝔶\", YIcy: \"Ї\", yicy: \"ї\", Yopf: \"𝕐\", yopf: \"𝕪\", Yscr: \"𝒴\", yscr: \"𝓎\", YUcy: \"Ю\", yucy: \"ю\", yuml: \"ÿ\", Yuml: \"Ÿ\", Zacute: \"Ź\", zacute: \"ź\", Zcaron: \"Ž\", zcaron: \"ž\", Zcy: \"З\", zcy: \"з\", Zdot: \"Ż\", zdot: \"ż\", zeetrf: \"ℨ\", ZeroWidthSpace: \"​\", Zeta: \"Ζ\", zeta: \"ζ\", zfr: \"𝔷\", Zfr: \"ℨ\", ZHcy: \"Ж\", zhcy: \"ж\", zigrarr: \"⇝\", zopf: \"𝕫\", Zopf: \"ℤ\", Zscr: \"𝒵\", zscr: \"𝓏\", zwj: \"\\u200d\", zwnj: \"\\u200c\"\n };\n\n var HEXCHARCODE = /^#[xX]([A-Fa-f0-9]+)$/;\n var CHARCODE = /^#([0-9]+)$/;\n var NAMED = /^([A-Za-z0-9]+)$/;\n var EntityParser = /** @class */function () {\n function EntityParser(named) {\n this.named = named;\n }\n EntityParser.prototype.parse = function (entity) {\n if (!entity) {\n return;\n }\n var matches = entity.match(HEXCHARCODE);\n if (matches) {\n return String.fromCharCode(parseInt(matches[1], 16));\n }\n matches = entity.match(CHARCODE);\n if (matches) {\n return String.fromCharCode(parseInt(matches[1], 10));\n }\n matches = entity.match(NAMED);\n if (matches) {\n return this.named[matches[1]];\n }\n };\n return EntityParser;\n }();\n\n var WSP = /[\\t\\n\\f ]/;\n var ALPHA = /[A-Za-z]/;\n var CRLF = /\\r\\n?/g;\n function isSpace(char) {\n return WSP.test(char);\n }\n function isAlpha(char) {\n return ALPHA.test(char);\n }\n function preprocessInput(input) {\n return input.replace(CRLF, '\\n');\n }\n\n var EventedTokenizer = /** @class */function () {\n function EventedTokenizer(delegate, entityParser) {\n this.delegate = delegate;\n this.entityParser = entityParser;\n this.state = \"beforeData\" /* beforeData */;\n this.line = -1;\n this.column = -1;\n this.input = '';\n this.index = -1;\n this.tagNameBuffer = '';\n this.states = {\n beforeData: function () {\n var char = this.peek();\n if (char === '<') {\n this.transitionTo(\"tagOpen\" /* tagOpen */);\n this.markTagStart();\n this.consume();\n } else {\n if (char === '\\n') {\n var tag = this.tagNameBuffer.toLowerCase();\n if (tag === 'pre' || tag === 'textarea') {\n this.consume();\n }\n }\n this.transitionTo(\"data\" /* data */);\n this.delegate.beginData();\n }\n },\n data: function () {\n var char = this.peek();\n if (char === '<') {\n this.delegate.finishData();\n this.transitionTo(\"tagOpen\" /* tagOpen */);\n this.markTagStart();\n this.consume();\n } else if (char === '&') {\n this.consume();\n this.delegate.appendToData(this.consumeCharRef() || '&');\n } else {\n this.consume();\n this.delegate.appendToData(char);\n }\n },\n tagOpen: function () {\n var char = this.consume();\n if (char === '!') {\n this.transitionTo(\"markupDeclarationOpen\" /* markupDeclarationOpen */);\n } else if (char === '/') {\n this.transitionTo(\"endTagOpen\" /* endTagOpen */);\n } else if (char === '@' || isAlpha(char)) {\n this.transitionTo(\"tagName\" /* tagName */);\n this.tagNameBuffer = '';\n this.delegate.beginStartTag();\n this.appendToTagName(char);\n }\n },\n markupDeclarationOpen: function () {\n var char = this.consume();\n if (char === '-' && this.input.charAt(this.index) === '-') {\n this.consume();\n this.transitionTo(\"commentStart\" /* commentStart */);\n this.delegate.beginComment();\n }\n },\n commentStart: function () {\n var char = this.consume();\n if (char === '-') {\n this.transitionTo(\"commentStartDash\" /* commentStartDash */);\n } else if (char === '>') {\n this.delegate.finishComment();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.delegate.appendToCommentData(char);\n this.transitionTo(\"comment\" /* comment */);\n }\n },\n commentStartDash: function () {\n var char = this.consume();\n if (char === '-') {\n this.transitionTo(\"commentEnd\" /* commentEnd */);\n } else if (char === '>') {\n this.delegate.finishComment();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.delegate.appendToCommentData('-');\n this.transitionTo(\"comment\" /* comment */);\n }\n },\n comment: function () {\n var char = this.consume();\n if (char === '-') {\n this.transitionTo(\"commentEndDash\" /* commentEndDash */);\n } else {\n this.delegate.appendToCommentData(char);\n }\n },\n commentEndDash: function () {\n var char = this.consume();\n if (char === '-') {\n this.transitionTo(\"commentEnd\" /* commentEnd */);\n } else {\n this.delegate.appendToCommentData('-' + char);\n this.transitionTo(\"comment\" /* comment */);\n }\n },\n commentEnd: function () {\n var char = this.consume();\n if (char === '>') {\n this.delegate.finishComment();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.delegate.appendToCommentData('--' + char);\n this.transitionTo(\"comment\" /* comment */);\n }\n },\n tagName: function () {\n var char = this.consume();\n if (isSpace(char)) {\n this.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n } else if (char === '/') {\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n } else if (char === '>') {\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.appendToTagName(char);\n }\n },\n beforeAttributeName: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.consume();\n return;\n } else if (char === '/') {\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n this.consume();\n } else if (char === '>') {\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else if (char === '=') {\n this.delegate.reportSyntaxError('attribute name cannot start with equals sign');\n this.transitionTo(\"attributeName\" /* attributeName */);\n this.delegate.beginAttribute();\n this.consume();\n this.delegate.appendToAttributeName(char);\n } else {\n this.transitionTo(\"attributeName\" /* attributeName */);\n this.delegate.beginAttribute();\n }\n },\n attributeName: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.transitionTo(\"afterAttributeName\" /* afterAttributeName */);\n this.consume();\n } else if (char === '/') {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.consume();\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n } else if (char === '=') {\n this.transitionTo(\"beforeAttributeValue\" /* beforeAttributeValue */);\n this.consume();\n } else if (char === '>') {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else if (char === '\"' || char === \"'\" || char === '<') {\n this.delegate.reportSyntaxError(char + ' is not a valid character within attribute names');\n this.consume();\n this.delegate.appendToAttributeName(char);\n } else {\n this.consume();\n this.delegate.appendToAttributeName(char);\n }\n },\n afterAttributeName: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.consume();\n return;\n } else if (char === '/') {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.consume();\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n } else if (char === '=') {\n this.consume();\n this.transitionTo(\"beforeAttributeValue\" /* beforeAttributeValue */);\n } else if (char === '>') {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.transitionTo(\"attributeName\" /* attributeName */);\n this.delegate.beginAttribute();\n this.consume();\n this.delegate.appendToAttributeName(char);\n }\n },\n beforeAttributeValue: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.consume();\n } else if (char === '\"') {\n this.transitionTo(\"attributeValueDoubleQuoted\" /* attributeValueDoubleQuoted */);\n this.delegate.beginAttributeValue(true);\n this.consume();\n } else if (char === \"'\") {\n this.transitionTo(\"attributeValueSingleQuoted\" /* attributeValueSingleQuoted */);\n this.delegate.beginAttributeValue(true);\n this.consume();\n } else if (char === '>') {\n this.delegate.beginAttributeValue(false);\n this.delegate.finishAttributeValue();\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.transitionTo(\"attributeValueUnquoted\" /* attributeValueUnquoted */);\n this.delegate.beginAttributeValue(false);\n this.consume();\n this.delegate.appendToAttributeValue(char);\n }\n },\n attributeValueDoubleQuoted: function () {\n var char = this.consume();\n if (char === '\"') {\n this.delegate.finishAttributeValue();\n this.transitionTo(\"afterAttributeValueQuoted\" /* afterAttributeValueQuoted */);\n } else if (char === '&') {\n this.delegate.appendToAttributeValue(this.consumeCharRef() || '&');\n } else {\n this.delegate.appendToAttributeValue(char);\n }\n },\n attributeValueSingleQuoted: function () {\n var char = this.consume();\n if (char === \"'\") {\n this.delegate.finishAttributeValue();\n this.transitionTo(\"afterAttributeValueQuoted\" /* afterAttributeValueQuoted */);\n } else if (char === '&') {\n this.delegate.appendToAttributeValue(this.consumeCharRef() || '&');\n } else {\n this.delegate.appendToAttributeValue(char);\n }\n },\n attributeValueUnquoted: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.delegate.finishAttributeValue();\n this.consume();\n this.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n } else if (char === '/') {\n this.delegate.finishAttributeValue();\n this.consume();\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n } else if (char === '&') {\n this.consume();\n this.delegate.appendToAttributeValue(this.consumeCharRef() || '&');\n } else if (char === '>') {\n this.delegate.finishAttributeValue();\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.consume();\n this.delegate.appendToAttributeValue(char);\n }\n },\n afterAttributeValueQuoted: function () {\n var char = this.peek();\n if (isSpace(char)) {\n this.consume();\n this.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n } else if (char === '/') {\n this.consume();\n this.transitionTo(\"selfClosingStartTag\" /* selfClosingStartTag */);\n } else if (char === '>') {\n this.consume();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n }\n },\n selfClosingStartTag: function () {\n var char = this.peek();\n if (char === '>') {\n this.consume();\n this.delegate.markTagAsSelfClosing();\n this.delegate.finishTag();\n this.transitionTo(\"beforeData\" /* beforeData */);\n } else {\n this.transitionTo(\"beforeAttributeName\" /* beforeAttributeName */);\n }\n },\n endTagOpen: function () {\n var char = this.consume();\n if (char === '@' || isAlpha(char)) {\n this.transitionTo(\"tagName\" /* tagName */);\n this.tagNameBuffer = '';\n this.delegate.beginEndTag();\n this.appendToTagName(char);\n }\n }\n };\n this.reset();\n }\n EventedTokenizer.prototype.reset = function () {\n this.transitionTo(\"beforeData\" /* beforeData */);\n this.input = '';\n this.index = 0;\n this.line = 1;\n this.column = 0;\n this.delegate.reset();\n };\n EventedTokenizer.prototype.transitionTo = function (state) {\n this.state = state;\n };\n EventedTokenizer.prototype.tokenize = function (input) {\n this.reset();\n this.tokenizePart(input);\n this.tokenizeEOF();\n };\n EventedTokenizer.prototype.tokenizePart = function (input) {\n this.input += preprocessInput(input);\n while (this.index < this.input.length) {\n var handler = this.states[this.state];\n if (handler !== undefined) {\n handler.call(this);\n } else {\n throw new Error(\"unhandled state \" + this.state);\n }\n }\n };\n EventedTokenizer.prototype.tokenizeEOF = function () {\n this.flushData();\n };\n EventedTokenizer.prototype.flushData = function () {\n if (this.state === 'data') {\n this.delegate.finishData();\n this.transitionTo(\"beforeData\" /* beforeData */);\n }\n };\n EventedTokenizer.prototype.peek = function () {\n return this.input.charAt(this.index);\n };\n EventedTokenizer.prototype.consume = function () {\n var char = this.peek();\n this.index++;\n if (char === '\\n') {\n this.line++;\n this.column = 0;\n } else {\n this.column++;\n }\n return char;\n };\n EventedTokenizer.prototype.consumeCharRef = function () {\n var endIndex = this.input.indexOf(';', this.index);\n if (endIndex === -1) {\n return;\n }\n var entity = this.input.slice(this.index, endIndex);\n var chars = this.entityParser.parse(entity);\n if (chars) {\n var count = entity.length;\n // consume the entity chars\n while (count) {\n this.consume();\n count--;\n }\n // consume the `;`\n this.consume();\n return chars;\n }\n };\n EventedTokenizer.prototype.markTagStart = function () {\n this.delegate.tagOpen();\n };\n EventedTokenizer.prototype.appendToTagName = function (char) {\n this.tagNameBuffer += char;\n this.delegate.appendToTagName(char);\n };\n return EventedTokenizer;\n }();\n\n var Tokenizer = /** @class */function () {\n function Tokenizer(entityParser, options) {\n if (options === void 0) {\n options = {};\n }\n this.options = options;\n this.token = null;\n this.startLine = 1;\n this.startColumn = 0;\n this.tokens = [];\n this.tokenizer = new EventedTokenizer(this, entityParser);\n this._currentAttribute = undefined;\n }\n Tokenizer.prototype.tokenize = function (input) {\n this.tokens = [];\n this.tokenizer.tokenize(input);\n return this.tokens;\n };\n Tokenizer.prototype.tokenizePart = function (input) {\n this.tokens = [];\n this.tokenizer.tokenizePart(input);\n return this.tokens;\n };\n Tokenizer.prototype.tokenizeEOF = function () {\n this.tokens = [];\n this.tokenizer.tokenizeEOF();\n return this.tokens[0];\n };\n Tokenizer.prototype.reset = function () {\n this.token = null;\n this.startLine = 1;\n this.startColumn = 0;\n };\n Tokenizer.prototype.current = function () {\n var token = this.token;\n if (token === null) {\n throw new Error('token was unexpectedly null');\n }\n if (arguments.length === 0) {\n return token;\n }\n for (var i = 0; i < arguments.length; i++) {\n if (token.type === arguments[i]) {\n return token;\n }\n }\n throw new Error(\"token type was unexpectedly \" + token.type);\n };\n Tokenizer.prototype.push = function (token) {\n this.token = token;\n this.tokens.push(token);\n };\n Tokenizer.prototype.currentAttribute = function () {\n return this._currentAttribute;\n };\n Tokenizer.prototype.addLocInfo = function () {\n if (this.options.loc) {\n this.current().loc = {\n start: {\n line: this.startLine,\n column: this.startColumn\n },\n end: {\n line: this.tokenizer.line,\n column: this.tokenizer.column\n }\n };\n }\n this.startLine = this.tokenizer.line;\n this.startColumn = this.tokenizer.column;\n };\n // Data\n Tokenizer.prototype.beginData = function () {\n this.push({\n type: \"Chars\" /* Chars */\n , chars: ''\n });\n };\n Tokenizer.prototype.appendToData = function (char) {\n this.current(\"Chars\" /* Chars */).chars += char;\n };\n Tokenizer.prototype.finishData = function () {\n this.addLocInfo();\n };\n // Comment\n Tokenizer.prototype.beginComment = function () {\n this.push({\n type: \"Comment\" /* Comment */\n , chars: ''\n });\n };\n Tokenizer.prototype.appendToCommentData = function (char) {\n this.current(\"Comment\" /* Comment */).chars += char;\n };\n Tokenizer.prototype.finishComment = function () {\n this.addLocInfo();\n };\n // Tags - basic\n Tokenizer.prototype.tagOpen = function () {};\n Tokenizer.prototype.beginStartTag = function () {\n this.push({\n type: \"StartTag\" /* StartTag */\n , tagName: '',\n attributes: [],\n selfClosing: false\n });\n };\n Tokenizer.prototype.beginEndTag = function () {\n this.push({\n type: \"EndTag\" /* EndTag */\n , tagName: ''\n });\n };\n Tokenizer.prototype.finishTag = function () {\n this.addLocInfo();\n };\n Tokenizer.prototype.markTagAsSelfClosing = function () {\n this.current(\"StartTag\" /* StartTag */).selfClosing = true;\n };\n // Tags - name\n Tokenizer.prototype.appendToTagName = function (char) {\n this.current(\"StartTag\" /* StartTag */, \"EndTag\" /* EndTag */).tagName += char;\n };\n // Tags - attributes\n Tokenizer.prototype.beginAttribute = function () {\n this._currentAttribute = ['', '', false];\n };\n Tokenizer.prototype.appendToAttributeName = function (char) {\n this.currentAttribute()[0] += char;\n };\n Tokenizer.prototype.beginAttributeValue = function (isQuoted) {\n this.currentAttribute()[2] = isQuoted;\n };\n Tokenizer.prototype.appendToAttributeValue = function (char) {\n this.currentAttribute()[1] += char;\n };\n Tokenizer.prototype.finishAttributeValue = function () {\n this.current(\"StartTag\" /* StartTag */).attributes.push(this._currentAttribute);\n };\n Tokenizer.prototype.reportSyntaxError = function (message) {\n this.current().syntaxError = message;\n };\n return Tokenizer;\n }();\n\n function tokenize(input, options) {\n var tokenizer = new Tokenizer(new EntityParser(namedCharRefs), options);\n return tokenizer.tokenize(input);\n }\n\n exports.HTML5NamedCharRefs = namedCharRefs;\n exports.EntityParser = EntityParser;\n exports.EventedTokenizer = EventedTokenizer;\n exports.Tokenizer = Tokenizer;\n exports.tokenize = tokenize;\n});"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AClaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnxBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7tBA;AACA;AACA;AACA;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;;ACnJA;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;;AC7BA;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;;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;;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;AC/HA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACfA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACRA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;ACjEA;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;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;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;;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;;AC1BA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;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;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC72BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACh8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC97CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr7GA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7mCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzNA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3qCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC19CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7vBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC5kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChmCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjYA;AACA;AACA;AACA;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;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjCA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC12BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrTA;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;;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;;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;;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;;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;;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;;ACvGA;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;;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;;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;;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;;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;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;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;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;;ACtlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACpDA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACzCA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AClBA;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;;AC9zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AC/CA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx+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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt4CA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt9CA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;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;;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;;ACrCA;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;;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;;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;;ACxDA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;ACzBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;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;;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;;AC1BA;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;;ACtCA;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;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;;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;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;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrWA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACrCA;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;;AClBA;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;;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;;ACxWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AC5EA;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;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AChKA;AACA;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;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1IA;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;;ACfA;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;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;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;;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;;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;AC1DA;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;;ACfA;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;;ACbA;AACA;AACA;AACA;AACA;;ACJA;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;;AC1FA;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;;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;;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;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACZA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;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;;ACxJA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxSA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvYA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjYA;AACA;AACA;AACA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC9CA;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;;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;;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;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACl9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3WA;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;;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;;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;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC7VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;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;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC31BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1iDA;AACA;AACA;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;;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;;AC1CA;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;;ACjDA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;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;;AC/CA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3WA;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;;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;;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;;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;;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;;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACltCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxhIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACp5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;AC1DA;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;;ACvCA;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;;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;;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;;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;;ACnCA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;AC9BA;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;;ACtBA;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;;AC/CA;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;;AChQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjBA;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;;ACXA;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;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;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;;ACjBA;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;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;;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;;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;;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;;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;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;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;;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;;AC7XA;AACA;AACA;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;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3+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;;ACrFA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvyGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1zCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzOA;AACA;AACA;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;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;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;;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;;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;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;;ACxEA;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;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;;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;;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;;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;;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;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjCA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;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;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx0EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"ember-all.debug.js"}