{"version":3,"sources":["packages/platform-browser/platform-browser-animations.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","platformBrowser","animations","core","browser","common","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","constructor","prototype","create","__read","o","n","m","Symbol","iterator","r","e","i","call","ar","next","done","push","value","error","__spread","arguments","length","concat","BrowserAnimationBuilder","_super","rootRenderer","doc","_this","_nextAnimationId","_renderer","createRenderer","body","id","encapsulation","ViewEncapsulation","None","styles","data","animation","build","toString","entry","isArray","sequence","issueAnimationCommand","BrowserAnimationFactory","AnimationBuilder","decorators","type","Injectable","ctorParameters","RendererFactory2","undefined","Inject","args","DOCUMENT","_id","element","options","RendererAnimationPlayer","AnimationFactory","parentPlayer","_started","totalTime","_command","_listen","eventName","callback","listen","command","_i","onDone","fn","onStart","onDestroy","init","hasStarted","play","pause","restart","finish","destroy","reset","setPosition","getPosition","_a","_b","engine","players","renderer","setProperty","AnimationRendererFactory","delegate","_zone","_currentId","_microtaskId","_animationCallbacksBuffer","_rendererCache","Map","_cdRecurDepth","promise","Promise","resolve","onRemovalComplete","parentNode","removeChild","hostElement","get","BaseAnimationRenderer","set","componentId","namespaceId","register","registerTrigger","trigger","forEach","name","AnimationRenderer","begin","_scheduleCountTask","then","scheduleListenerCallback","count","run","tuple","end","runOutsideAngular","flush","whenRenderingDone","ɵAnimationEngine","NgZone","destroyNode","defineProperty","enumerable","configurable","createElement","namespace","createComment","createText","appendChild","parent","newChild","onInsert","insertBefore","refChild","isMove","oldChild","isHostElement","onRemove","selectRootElement","selectorOrNode","preserveContent","node","nextSibling","setAttribute","el","removeAttribute","addClass","removeClass","setStyle","style","flags","removeStyle","charAt","disableAnimations","setValue","target","process","substr","resolveElementFromTarget","document","window","phase","parseTriggerCallbackName","triggerName","dotIndex","indexOf","substring","event","InjectableAnimationEngine","driver","normalizer","instantiateSupportedAnimationDriver","ɵsupportsWebAnimations","ɵWebAnimationsDriver","ɵCssKeyframesDriver","instantiateDefaultStyleNormalizer","ɵWebAnimationsStyleNormalizer","instantiateRendererFactory","zone","AnimationDriver","ɵAnimationStyleNormalizer","BrowserAnimationsModule","NoopAnimationsModule","ANIMATION_MODULE_TYPE","InjectionToken","SHARED_ANIMATION_PROVIDERS","provide","useClass","useFactory","deps","ɵDomRendererFactory2","BROWSER_ANIMATIONS_PROVIDERS","useValue","BROWSER_NOOP_ANIMATIONS_PROVIDERS","ɵNoopAnimationDriver","NgModule","BrowserModule","providers","ɵAnimationRenderer","ɵAnimationRendererFactory","ɵBrowserAnimationBuilder","ɵBrowserAnimationFactory","ɵInjectableAnimationEngine","ɵangular_packages_platform_browser_animations_animations_a","ɵangular_packages_platform_browser_animations_animations_b","ɵangular_packages_platform_browser_animations_animations_c","ɵangular_packages_platform_browser_animations_animations_d","ɵangular_packages_platform_browser_animations_animations_e","ɵangular_packages_platform_browser_animations_animations_f"],"mappings":"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","sourcesContent":["/**\n * @license Angular v11.2.14\n * (c) 2010-2021 Google LLC. https://angular.io/\n * License: MIT\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/platform-browser'), require('@angular/animations'), require('@angular/animations/browser'), require('@angular/common')) :\n    typeof define === 'function' && define.amd ? define('@angular/platform-browser/animations', ['exports', '@angular/core', '@angular/platform-browser', '@angular/animations', '@angular/animations/browser', '@angular/common'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.platformBrowser = global.ng.platformBrowser || {}, global.ng.platformBrowser.animations = {}), global.ng.core, global.ng.platformBrowser, global.ng.animations, global.ng.animations.browser, global.ng.common));\n}(this, (function (exports, core, platformBrowser, animations, browser, common) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (b.hasOwnProperty(p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    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    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, exports) {\n        for (var p in m)\n            if (p !== \"default\" && !exports.hasOwnProperty(p))\n                __createBinding(exports, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    ;\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (Object.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    var BrowserAnimationBuilder = /** @class */ (function (_super) {\n        __extends(BrowserAnimationBuilder, _super);\n        function BrowserAnimationBuilder(rootRenderer, doc) {\n            var _this = _super.call(this) || this;\n            _this._nextAnimationId = 0;\n            var typeData = { id: '0', encapsulation: core.ViewEncapsulation.None, styles: [], data: { animation: [] } };\n            _this._renderer = rootRenderer.createRenderer(doc.body, typeData);\n            return _this;\n        }\n        BrowserAnimationBuilder.prototype.build = function (animation) {\n            var id = this._nextAnimationId.toString();\n            this._nextAnimationId++;\n            var entry = Array.isArray(animation) ? animations.sequence(animation) : animation;\n            issueAnimationCommand(this._renderer, null, id, 'register', [entry]);\n            return new BrowserAnimationFactory(id, this._renderer);\n        };\n        return BrowserAnimationBuilder;\n    }(animations.AnimationBuilder));\n    BrowserAnimationBuilder.decorators = [\n        { type: core.Injectable }\n    ];\n    BrowserAnimationBuilder.ctorParameters = function () { return [\n        { type: core.RendererFactory2 },\n        { type: undefined, decorators: [{ type: core.Inject, args: [common.DOCUMENT,] }] }\n    ]; };\n    var BrowserAnimationFactory = /** @class */ (function (_super) {\n        __extends(BrowserAnimationFactory, _super);\n        function BrowserAnimationFactory(_id, _renderer) {\n            var _this = _super.call(this) || this;\n            _this._id = _id;\n            _this._renderer = _renderer;\n            return _this;\n        }\n        BrowserAnimationFactory.prototype.create = function (element, options) {\n            return new RendererAnimationPlayer(this._id, element, options || {}, this._renderer);\n        };\n        return BrowserAnimationFactory;\n    }(animations.AnimationFactory));\n    var RendererAnimationPlayer = /** @class */ (function () {\n        function RendererAnimationPlayer(id, element, options, _renderer) {\n            this.id = id;\n            this.element = element;\n            this._renderer = _renderer;\n            this.parentPlayer = null;\n            this._started = false;\n            this.totalTime = 0;\n            this._command('create', options);\n        }\n        RendererAnimationPlayer.prototype._listen = function (eventName, callback) {\n            return this._renderer.listen(this.element, \"@@\" + this.id + \":\" + eventName, callback);\n        };\n        RendererAnimationPlayer.prototype._command = function (command) {\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            return issueAnimationCommand(this._renderer, this.element, this.id, command, args);\n        };\n        RendererAnimationPlayer.prototype.onDone = function (fn) {\n            this._listen('done', fn);\n        };\n        RendererAnimationPlayer.prototype.onStart = function (fn) {\n            this._listen('start', fn);\n        };\n        RendererAnimationPlayer.prototype.onDestroy = function (fn) {\n            this._listen('destroy', fn);\n        };\n        RendererAnimationPlayer.prototype.init = function () {\n            this._command('init');\n        };\n        RendererAnimationPlayer.prototype.hasStarted = function () {\n            return this._started;\n        };\n        RendererAnimationPlayer.prototype.play = function () {\n            this._command('play');\n            this._started = true;\n        };\n        RendererAnimationPlayer.prototype.pause = function () {\n            this._command('pause');\n        };\n        RendererAnimationPlayer.prototype.restart = function () {\n            this._command('restart');\n        };\n        RendererAnimationPlayer.prototype.finish = function () {\n            this._command('finish');\n        };\n        RendererAnimationPlayer.prototype.destroy = function () {\n            this._command('destroy');\n        };\n        RendererAnimationPlayer.prototype.reset = function () {\n            this._command('reset');\n        };\n        RendererAnimationPlayer.prototype.setPosition = function (p) {\n            this._command('setPosition', p);\n        };\n        RendererAnimationPlayer.prototype.getPosition = function () {\n            var _a, _b;\n            return (_b = (_a = this._renderer.engine.players[+this.id]) === null || _a === void 0 ? void 0 : _a.getPosition()) !== null && _b !== void 0 ? _b : 0;\n        };\n        return RendererAnimationPlayer;\n    }());\n    function issueAnimationCommand(renderer, element, id, command, args) {\n        return renderer.setProperty(element, \"@@\" + id + \":\" + command, args);\n    }\n\n    var ANIMATION_PREFIX = '@';\n    var DISABLE_ANIMATIONS_FLAG = '@.disabled';\n    var AnimationRendererFactory = /** @class */ (function () {\n        function AnimationRendererFactory(delegate, engine, _zone) {\n            this.delegate = delegate;\n            this.engine = engine;\n            this._zone = _zone;\n            this._currentId = 0;\n            this._microtaskId = 1;\n            this._animationCallbacksBuffer = [];\n            this._rendererCache = new Map();\n            this._cdRecurDepth = 0;\n            this.promise = Promise.resolve(0);\n            engine.onRemovalComplete = function (element, delegate) {\n                // Note: if an component element has a leave animation, and the component\n                // a host leave animation, the view engine will call `removeChild` for the parent\n                // component renderer as well as for the child component renderer.\n                // Therefore, we need to check if we already removed the element.\n                if (delegate && delegate.parentNode(element)) {\n                    delegate.removeChild(element.parentNode, element);\n                }\n            };\n        }\n        AnimationRendererFactory.prototype.createRenderer = function (hostElement, type) {\n            var _this = this;\n            var EMPTY_NAMESPACE_ID = '';\n            // cache the delegates to find out which cached delegate can\n            // be used by which cached renderer\n            var delegate = this.delegate.createRenderer(hostElement, type);\n            if (!hostElement || !type || !type.data || !type.data['animation']) {\n                var renderer = this._rendererCache.get(delegate);\n                if (!renderer) {\n                    renderer = new BaseAnimationRenderer(EMPTY_NAMESPACE_ID, delegate, this.engine);\n                    // only cache this result when the base renderer is used\n                    this._rendererCache.set(delegate, renderer);\n                }\n                return renderer;\n            }\n            var componentId = type.id;\n            var namespaceId = type.id + '-' + this._currentId;\n            this._currentId++;\n            this.engine.register(namespaceId, hostElement);\n            var registerTrigger = function (trigger) {\n                if (Array.isArray(trigger)) {\n                    trigger.forEach(registerTrigger);\n                }\n                else {\n                    _this.engine.registerTrigger(componentId, namespaceId, hostElement, trigger.name, trigger);\n                }\n            };\n            var animationTriggers = type.data['animation'];\n            animationTriggers.forEach(registerTrigger);\n            return new AnimationRenderer(this, namespaceId, delegate, this.engine);\n        };\n        AnimationRendererFactory.prototype.begin = function () {\n            this._cdRecurDepth++;\n            if (this.delegate.begin) {\n                this.delegate.begin();\n            }\n        };\n        AnimationRendererFactory.prototype._scheduleCountTask = function () {\n            var _this = this;\n            // always use promise to schedule microtask instead of use Zone\n            this.promise.then(function () {\n                _this._microtaskId++;\n            });\n        };\n        /** @internal */\n        AnimationRendererFactory.prototype.scheduleListenerCallback = function (count, fn, data) {\n            var _this = this;\n            if (count >= 0 && count < this._microtaskId) {\n                this._zone.run(function () { return fn(data); });\n                return;\n            }\n            if (this._animationCallbacksBuffer.length == 0) {\n                Promise.resolve(null).then(function () {\n                    _this._zone.run(function () {\n                        _this._animationCallbacksBuffer.forEach(function (tuple) {\n                            var _a = __read(tuple, 2), fn = _a[0], data = _a[1];\n                            fn(data);\n                        });\n                        _this._animationCallbacksBuffer = [];\n                    });\n                });\n            }\n            this._animationCallbacksBuffer.push([fn, data]);\n        };\n        AnimationRendererFactory.prototype.end = function () {\n            var _this = this;\n            this._cdRecurDepth--;\n            // this is to prevent animations from running twice when an inner\n            // component does CD when a parent component instead has inserted it\n            if (this._cdRecurDepth == 0) {\n                this._zone.runOutsideAngular(function () {\n                    _this._scheduleCountTask();\n                    _this.engine.flush(_this._microtaskId);\n                });\n            }\n            if (this.delegate.end) {\n                this.delegate.end();\n            }\n        };\n        AnimationRendererFactory.prototype.whenRenderingDone = function () {\n            return this.engine.whenRenderingDone();\n        };\n        return AnimationRendererFactory;\n    }());\n    AnimationRendererFactory.decorators = [\n        { type: core.Injectable }\n    ];\n    AnimationRendererFactory.ctorParameters = function () { return [\n        { type: core.RendererFactory2 },\n        { type: browser.ɵAnimationEngine },\n        { type: core.NgZone }\n    ]; };\n    var BaseAnimationRenderer = /** @class */ (function () {\n        function BaseAnimationRenderer(namespaceId, delegate, engine) {\n            this.namespaceId = namespaceId;\n            this.delegate = delegate;\n            this.engine = engine;\n            this.destroyNode = this.delegate.destroyNode ? function (n) { return delegate.destroyNode(n); } : null;\n        }\n        Object.defineProperty(BaseAnimationRenderer.prototype, \"data\", {\n            get: function () {\n                return this.delegate.data;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        BaseAnimationRenderer.prototype.destroy = function () {\n            this.engine.destroy(this.namespaceId, this.delegate);\n            this.delegate.destroy();\n        };\n        BaseAnimationRenderer.prototype.createElement = function (name, namespace) {\n            return this.delegate.createElement(name, namespace);\n        };\n        BaseAnimationRenderer.prototype.createComment = function (value) {\n            return this.delegate.createComment(value);\n        };\n        BaseAnimationRenderer.prototype.createText = function (value) {\n            return this.delegate.createText(value);\n        };\n        BaseAnimationRenderer.prototype.appendChild = function (parent, newChild) {\n            this.delegate.appendChild(parent, newChild);\n            this.engine.onInsert(this.namespaceId, newChild, parent, false);\n        };\n        BaseAnimationRenderer.prototype.insertBefore = function (parent, newChild, refChild, isMove) {\n            if (isMove === void 0) { isMove = true; }\n            this.delegate.insertBefore(parent, newChild, refChild);\n            // If `isMove` true than we should animate this insert.\n            this.engine.onInsert(this.namespaceId, newChild, parent, isMove);\n        };\n        BaseAnimationRenderer.prototype.removeChild = function (parent, oldChild, isHostElement) {\n            this.engine.onRemove(this.namespaceId, oldChild, this.delegate, isHostElement);\n        };\n        BaseAnimationRenderer.prototype.selectRootElement = function (selectorOrNode, preserveContent) {\n            return this.delegate.selectRootElement(selectorOrNode, preserveContent);\n        };\n        BaseAnimationRenderer.prototype.parentNode = function (node) {\n            return this.delegate.parentNode(node);\n        };\n        BaseAnimationRenderer.prototype.nextSibling = function (node) {\n            return this.delegate.nextSibling(node);\n        };\n        BaseAnimationRenderer.prototype.setAttribute = function (el, name, value, namespace) {\n            this.delegate.setAttribute(el, name, value, namespace);\n        };\n        BaseAnimationRenderer.prototype.removeAttribute = function (el, name, namespace) {\n            this.delegate.removeAttribute(el, name, namespace);\n        };\n        BaseAnimationRenderer.prototype.addClass = function (el, name) {\n            this.delegate.addClass(el, name);\n        };\n        BaseAnimationRenderer.prototype.removeClass = function (el, name) {\n            this.delegate.removeClass(el, name);\n        };\n        BaseAnimationRenderer.prototype.setStyle = function (el, style, value, flags) {\n            this.delegate.setStyle(el, style, value, flags);\n        };\n        BaseAnimationRenderer.prototype.removeStyle = function (el, style, flags) {\n            this.delegate.removeStyle(el, style, flags);\n        };\n        BaseAnimationRenderer.prototype.setProperty = function (el, name, value) {\n            if (name.charAt(0) == ANIMATION_PREFIX && name == DISABLE_ANIMATIONS_FLAG) {\n                this.disableAnimations(el, !!value);\n            }\n            else {\n                this.delegate.setProperty(el, name, value);\n            }\n        };\n        BaseAnimationRenderer.prototype.setValue = function (node, value) {\n            this.delegate.setValue(node, value);\n        };\n        BaseAnimationRenderer.prototype.listen = function (target, eventName, callback) {\n            return this.delegate.listen(target, eventName, callback);\n        };\n        BaseAnimationRenderer.prototype.disableAnimations = function (element, value) {\n            this.engine.disableAnimations(element, value);\n        };\n        return BaseAnimationRenderer;\n    }());\n    var AnimationRenderer = /** @class */ (function (_super) {\n        __extends(AnimationRenderer, _super);\n        function AnimationRenderer(factory, namespaceId, delegate, engine) {\n            var _this = _super.call(this, namespaceId, delegate, engine) || this;\n            _this.factory = factory;\n            _this.namespaceId = namespaceId;\n            return _this;\n        }\n        AnimationRenderer.prototype.setProperty = function (el, name, value) {\n            if (name.charAt(0) == ANIMATION_PREFIX) {\n                if (name.charAt(1) == '.' && name == DISABLE_ANIMATIONS_FLAG) {\n                    value = value === undefined ? true : !!value;\n                    this.disableAnimations(el, value);\n                }\n                else {\n                    this.engine.process(this.namespaceId, el, name.substr(1), value);\n                }\n            }\n            else {\n                this.delegate.setProperty(el, name, value);\n            }\n        };\n        AnimationRenderer.prototype.listen = function (target, eventName, callback) {\n            var _a;\n            var _this = this;\n            if (eventName.charAt(0) == ANIMATION_PREFIX) {\n                var element = resolveElementFromTarget(target);\n                var name = eventName.substr(1);\n                var phase = '';\n                // @listener.phase is for trigger animation callbacks\n                // @@listener is for animation builder callbacks\n                if (name.charAt(0) != ANIMATION_PREFIX) {\n                    _a = __read(parseTriggerCallbackName(name), 2), name = _a[0], phase = _a[1];\n                }\n                return this.engine.listen(this.namespaceId, element, name, phase, function (event) {\n                    var countId = event['_data'] || -1;\n                    _this.factory.scheduleListenerCallback(countId, callback, event);\n                });\n            }\n            return this.delegate.listen(target, eventName, callback);\n        };\n        return AnimationRenderer;\n    }(BaseAnimationRenderer));\n    function resolveElementFromTarget(target) {\n        switch (target) {\n            case 'body':\n                return document.body;\n            case 'document':\n                return document;\n            case 'window':\n                return window;\n            default:\n                return target;\n        }\n    }\n    function parseTriggerCallbackName(triggerName) {\n        var dotIndex = triggerName.indexOf('.');\n        var trigger = triggerName.substring(0, dotIndex);\n        var phase = triggerName.substr(dotIndex + 1);\n        return [trigger, phase];\n    }\n\n    var InjectableAnimationEngine = /** @class */ (function (_super) {\n        __extends(InjectableAnimationEngine, _super);\n        function InjectableAnimationEngine(doc, driver, normalizer) {\n            return _super.call(this, doc.body, driver, normalizer) || this;\n        }\n        return InjectableAnimationEngine;\n    }(browser.ɵAnimationEngine));\n    InjectableAnimationEngine.decorators = [\n        { type: core.Injectable }\n    ];\n    InjectableAnimationEngine.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: core.Inject, args: [common.DOCUMENT,] }] },\n        { type: browser.AnimationDriver },\n        { type: browser.ɵAnimationStyleNormalizer }\n    ]; };\n    function instantiateSupportedAnimationDriver() {\n        return browser.ɵsupportsWebAnimations() ? new browser.ɵWebAnimationsDriver() : new browser.ɵCssKeyframesDriver();\n    }\n    function instantiateDefaultStyleNormalizer() {\n        return new browser.ɵWebAnimationsStyleNormalizer();\n    }\n    function instantiateRendererFactory(renderer, engine, zone) {\n        return new AnimationRendererFactory(renderer, engine, zone);\n    }\n    /**\n     * @publicApi\n     */\n    var ANIMATION_MODULE_TYPE = new core.InjectionToken('AnimationModuleType');\n    var SHARED_ANIMATION_PROVIDERS = [\n        { provide: animations.AnimationBuilder, useClass: BrowserAnimationBuilder },\n        { provide: browser.ɵAnimationStyleNormalizer, useFactory: instantiateDefaultStyleNormalizer },\n        { provide: browser.ɵAnimationEngine, useClass: InjectableAnimationEngine }, {\n            provide: core.RendererFactory2,\n            useFactory: instantiateRendererFactory,\n            deps: [platformBrowser.ɵDomRendererFactory2, browser.ɵAnimationEngine, core.NgZone]\n        }\n    ];\n    /**\n     * Separate providers from the actual module so that we can do a local modification in Google3 to\n     * include them in the BrowserModule.\n     */\n    var BROWSER_ANIMATIONS_PROVIDERS = __spread([\n        { provide: browser.AnimationDriver, useFactory: instantiateSupportedAnimationDriver },\n        { provide: ANIMATION_MODULE_TYPE, useValue: 'BrowserAnimations' }\n    ], SHARED_ANIMATION_PROVIDERS);\n    /**\n     * Separate providers from the actual module so that we can do a local modification in Google3 to\n     * include them in the BrowserTestingModule.\n     */\n    var BROWSER_NOOP_ANIMATIONS_PROVIDERS = __spread([\n        { provide: browser.AnimationDriver, useClass: browser.ɵNoopAnimationDriver },\n        { provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations' }\n    ], SHARED_ANIMATION_PROVIDERS);\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    /**\n     * Exports `BrowserModule` with additional [dependency-injection providers](guide/glossary#provider)\n     * for use with animations. See [Animations](guide/animations).\n     * @publicApi\n     */\n    var BrowserAnimationsModule = /** @class */ (function () {\n        function BrowserAnimationsModule() {\n        }\n        return BrowserAnimationsModule;\n    }());\n    BrowserAnimationsModule.decorators = [\n        { type: core.NgModule, args: [{\n                    exports: [platformBrowser.BrowserModule],\n                    providers: BROWSER_ANIMATIONS_PROVIDERS,\n                },] }\n    ];\n    /**\n     * A null player that must be imported to allow disabling of animations.\n     * @publicApi\n     */\n    var NoopAnimationsModule = /** @class */ (function () {\n        function NoopAnimationsModule() {\n        }\n        return NoopAnimationsModule;\n    }());\n    NoopAnimationsModule.decorators = [\n        { type: core.NgModule, args: [{\n                    exports: [platformBrowser.BrowserModule],\n                    providers: BROWSER_NOOP_ANIMATIONS_PROVIDERS,\n                },] }\n    ];\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    exports.ANIMATION_MODULE_TYPE = ANIMATION_MODULE_TYPE;\n    exports.BrowserAnimationsModule = BrowserAnimationsModule;\n    exports.NoopAnimationsModule = NoopAnimationsModule;\n    exports.ɵAnimationRenderer = AnimationRenderer;\n    exports.ɵAnimationRendererFactory = AnimationRendererFactory;\n    exports.ɵBrowserAnimationBuilder = BrowserAnimationBuilder;\n    exports.ɵBrowserAnimationFactory = BrowserAnimationFactory;\n    exports.ɵInjectableAnimationEngine = InjectableAnimationEngine;\n    exports.ɵangular_packages_platform_browser_animations_animations_a = instantiateSupportedAnimationDriver;\n    exports.ɵangular_packages_platform_browser_animations_animations_b = instantiateDefaultStyleNormalizer;\n    exports.ɵangular_packages_platform_browser_animations_animations_c = instantiateRendererFactory;\n    exports.ɵangular_packages_platform_browser_animations_animations_d = BROWSER_ANIMATIONS_PROVIDERS;\n    exports.ɵangular_packages_platform_browser_animations_animations_e = BROWSER_NOOP_ANIMATIONS_PROVIDERS;\n    exports.ɵangular_packages_platform_browser_animations_animations_f = BaseAnimationRenderer;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=platform-browser-animations.umd.js.map\n"]}