{"version":3,"sources":["src/material/material-progress-bar.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","progressBar","core","common","cdk","coercion","platformBrowser","animations","rxjs","operators","this","core$1","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","_MatProgressBarMixinBase","mixinColor","MatProgressBarBase","_elementRef","MAT_PROGRESS_BAR_LOCATION","InjectionToken","providedIn","MAT_PROGRESS_BAR_LOCATION_FACTORY","_document","inject","DOCUMENT","_location","location","getPathname","pathname","search","MatProgressBarModule","progressbarId","MatProgressBar","_super","_ngZone","_animationMode","_this","_isNoopAnimation","_value","_bufferValue","animationEnd","EventEmitter","_animationEndSubscription","Subscription","EMPTY","mode","path","split","_rectangleFillValue","__extends","TypeError","String","__","constructor","create","defineProperty","get","set","v","clamp","coerceNumberProperty","enumerable","configurable","_primaryTransform","transform","value","_bufferTransform","bufferValue","ngAfterViewInit","runOutsideAngular","element","_primaryValueBar","nativeElement","fromEvent","pipe","filter","e","target","subscribe","run","next","ngOnDestroy","unsubscribe","min","max","Math","decorators","type","Component","args","selector","exportAs","host","role","aria-valuemin","aria-valuemax","tabindex","[attr.aria-valuenow]","[attr.mode]","class","[class._mat-animation-noopable]","inputs","template","changeDetection","ChangeDetectionStrategy","OnPush","encapsulation","ViewEncapsulation","None","styles","ctorParameters","ElementRef","NgZone","Optional","Inject","ANIMATION_MODULE_TYPE","undefined","propDecorators","Input","ViewChild","Output","NgModule","imports","CommonModule","MatCommonModule","declarations"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/material/core'), require('@angular/cdk/coercion'), require('@angular/platform-browser/animations'), require('rxjs'), require('rxjs/operators')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/progress-bar', ['exports', '@angular/core', '@angular/common', '@angular/material/core', '@angular/cdk/coercion', '@angular/platform-browser/animations', 'rxjs', 'rxjs/operators'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.progressBar = {}), global.ng.core, global.ng.common, global.ng.material.core, global.ng.cdk.coercion, global.ng.platformBrowser.animations, global.rxjs, global.rxjs.operators));\n}(this, (function (exports, core, common, core$1, coercion, animations, rxjs, operators) { '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 (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\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, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, 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    /** @deprecated */\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    /** @deprecated */\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    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\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 (k !== \"default\" && Object.prototype.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    // Boilerplate for applying mixins to MatProgressBar.\n    /** @docs-private */\n    var MatProgressBarBase = /** @class */ (function () {\n        function MatProgressBarBase(_elementRef) {\n            this._elementRef = _elementRef;\n        }\n        return MatProgressBarBase;\n    }());\n    var _MatProgressBarMixinBase = core$1.mixinColor(MatProgressBarBase, 'primary');\n    /**\n     * Injection token used to provide the current location to `MatProgressBar`.\n     * Used to handle server-side rendering and to stub out during unit tests.\n     * @docs-private\n     */\n    var MAT_PROGRESS_BAR_LOCATION = new core.InjectionToken('mat-progress-bar-location', { providedIn: 'root', factory: MAT_PROGRESS_BAR_LOCATION_FACTORY });\n    /** @docs-private */\n    function MAT_PROGRESS_BAR_LOCATION_FACTORY() {\n        var _document = core.inject(common.DOCUMENT);\n        var _location = _document ? _document.location : null;\n        return {\n            // Note that this needs to be a function, rather than a property, because Angular\n            // will only resolve it once, but we want the current path on each call.\n            getPathname: function () { return _location ? (_location.pathname + _location.search) : ''; }\n        };\n    }\n    /** Counter used to generate unique IDs for progress bars. */\n    var progressbarId = 0;\n    /**\n     * `<mat-progress-bar>` component.\n     */\n    var MatProgressBar = /** @class */ (function (_super) {\n        __extends(MatProgressBar, _super);\n        function MatProgressBar(_elementRef, _ngZone, _animationMode, \n        /**\n         * @deprecated `location` parameter to be made required.\n         * @breaking-change 8.0.0\n         */\n        location) {\n            var _this = _super.call(this, _elementRef) || this;\n            _this._elementRef = _elementRef;\n            _this._ngZone = _ngZone;\n            _this._animationMode = _animationMode;\n            /** Flag that indicates whether NoopAnimations mode is set to true. */\n            _this._isNoopAnimation = false;\n            _this._value = 0;\n            _this._bufferValue = 0;\n            /**\n             * Event emitted when animation of the primary progress bar completes. This event will not\n             * be emitted when animations are disabled, nor will it be emitted for modes with continuous\n             * animations (indeterminate and query).\n             */\n            _this.animationEnd = new core.EventEmitter();\n            /** Reference to animation end subscription to be unsubscribed on destroy. */\n            _this._animationEndSubscription = rxjs.Subscription.EMPTY;\n            /**\n             * Mode of the progress bar.\n             *\n             * Input must be one of these values: determinate, indeterminate, buffer, query, defaults to\n             * 'determinate'.\n             * Mirrored to mode attribute.\n             */\n            _this.mode = 'determinate';\n            /** ID of the progress bar. */\n            _this.progressbarId = \"mat-progress-bar-\" + progressbarId++;\n            // We need to prefix the SVG reference with the current path, otherwise they won't work\n            // in Safari if the page has a `<base>` tag. Note that we need quotes inside the `url()`,\n            // because named route URLs can contain parentheses (see #12338). Also we don't use since\n            // we can't tell the difference between whether\n            // the consumer is using the hash location strategy or not, because `Location` normalizes\n            // both `/#/foo/bar` and `/foo/bar` to the same thing.\n            var path = location ? location.getPathname().split('#')[0] : '';\n            _this._rectangleFillValue = \"url('\" + path + \"#\" + _this.progressbarId + \"')\";\n            _this._isNoopAnimation = _animationMode === 'NoopAnimations';\n            return _this;\n        }\n        Object.defineProperty(MatProgressBar.prototype, \"value\", {\n            /** Value of the progress bar. Defaults to zero. Mirrored to aria-valuenow. */\n            get: function () { return this._value; },\n            set: function (v) {\n                this._value = clamp(coercion.coerceNumberProperty(v) || 0);\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatProgressBar.prototype, \"bufferValue\", {\n            /** Buffer value of the progress bar. Defaults to zero. */\n            get: function () { return this._bufferValue; },\n            set: function (v) { this._bufferValue = clamp(v || 0); },\n            enumerable: false,\n            configurable: true\n        });\n        /** Gets the current transform value for the progress bar's primary indicator. */\n        MatProgressBar.prototype._primaryTransform = function () {\n            // We use a 3d transform to work around some rendering issues in iOS Safari. See #19328.\n            var scale = this.value / 100;\n            return { transform: \"scale3d(\" + scale + \", 1, 1)\" };\n        };\n        /**\n         * Gets the current transform value for the progress bar's buffer indicator. Only used if the\n         * progress mode is set to buffer, otherwise returns an undefined, causing no transformation.\n         */\n        MatProgressBar.prototype._bufferTransform = function () {\n            if (this.mode === 'buffer') {\n                // We use a 3d transform to work around some rendering issues in iOS Safari. See #19328.\n                var scale = this.bufferValue / 100;\n                return { transform: \"scale3d(\" + scale + \", 1, 1)\" };\n            }\n            return null;\n        };\n        MatProgressBar.prototype.ngAfterViewInit = function () {\n            var _this = this;\n            // Run outside angular so change detection didn't get triggered on every transition end\n            // instead only on the animation that we care about (primary value bar's transitionend)\n            this._ngZone.runOutsideAngular((function () {\n                var element = _this._primaryValueBar.nativeElement;\n                _this._animationEndSubscription =\n                    rxjs.fromEvent(element, 'transitionend')\n                        .pipe(operators.filter((function (e) { return e.target === element; })))\n                        .subscribe(function () {\n                        if (_this.mode === 'determinate' || _this.mode === 'buffer') {\n                            _this._ngZone.run(function () { return _this.animationEnd.next({ value: _this.value }); });\n                        }\n                    });\n            }));\n        };\n        MatProgressBar.prototype.ngOnDestroy = function () {\n            this._animationEndSubscription.unsubscribe();\n        };\n        return MatProgressBar;\n    }(_MatProgressBarMixinBase));\n    MatProgressBar.decorators = [\n        { type: core.Component, args: [{\n                    selector: 'mat-progress-bar',\n                    exportAs: 'matProgressBar',\n                    host: {\n                        'role': 'progressbar',\n                        'aria-valuemin': '0',\n                        'aria-valuemax': '100',\n                        // set tab index to -1 so screen readers will read the aria-label\n                        // Note: there is a known issue with JAWS that does not read progressbar aria labels on FireFox\n                        'tabindex': '-1',\n                        '[attr.aria-valuenow]': '(mode === \"indeterminate\" || mode === \"query\") ? null : value',\n                        '[attr.mode]': 'mode',\n                        'class': 'mat-progress-bar',\n                        '[class._mat-animation-noopable]': '_isNoopAnimation',\n                    },\n                    inputs: ['color'],\n                    template: \"<!--\\n  All children need to be hidden for screen readers in order to support ChromeVox.\\n  More context in the issue: https://github.com/angular/components/issues/22165.\\n-->\\n<div aria-hidden=\\\"true\\\">\\n  <svg width=\\\"100%\\\" height=\\\"4\\\" focusable=\\\"false\\\" class=\\\"mat-progress-bar-background mat-progress-bar-element\\\">\\n    <defs>\\n      <pattern [id]=\\\"progressbarId\\\" x=\\\"4\\\" y=\\\"0\\\" width=\\\"8\\\" height=\\\"4\\\" patternUnits=\\\"userSpaceOnUse\\\">\\n        <circle cx=\\\"2\\\" cy=\\\"2\\\" r=\\\"2\\\"/>\\n      </pattern>\\n    </defs>\\n    <rect [attr.fill]=\\\"_rectangleFillValue\\\" width=\\\"100%\\\" height=\\\"100%\\\"/>\\n  </svg>\\n  <!--\\n    The background div is named as such because it appears below the other divs and is not sized based\\n    on values.\\n  -->\\n  <div class=\\\"mat-progress-bar-buffer mat-progress-bar-element\\\" [ngStyle]=\\\"_bufferTransform()\\\"></div>\\n  <div class=\\\"mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element\\\" [ngStyle]=\\\"_primaryTransform()\\\" #primaryValueBar></div>\\n  <div class=\\\"mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element\\\"></div>\\n</div>\\n\",\n                    changeDetection: core.ChangeDetectionStrategy.OnPush,\n                    encapsulation: core.ViewEncapsulation.None,\n                    styles: [\".mat-progress-bar{display:block;height:4px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}._mat-animation-noopable.mat-progress-bar{transition:none;animation:none}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{width:calc(100% + 10px)}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-background{display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-buffer{border-top:solid 5px;opacity:.5}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-fill{border-top:solid 4px}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:\\\"\\\";display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2000ms infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2000ms infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-buffer,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-background{animation:none;transition-duration:1ms}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-8px)}}\\n\"]\n                },] }\n    ];\n    MatProgressBar.ctorParameters = function () { return [\n        { type: core.ElementRef },\n        { type: core.NgZone },\n        { type: String, decorators: [{ type: core.Optional }, { type: core.Inject, args: [animations.ANIMATION_MODULE_TYPE,] }] },\n        { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [MAT_PROGRESS_BAR_LOCATION,] }] }\n    ]; };\n    MatProgressBar.propDecorators = {\n        value: [{ type: core.Input }],\n        bufferValue: [{ type: core.Input }],\n        _primaryValueBar: [{ type: core.ViewChild, args: ['primaryValueBar',] }],\n        animationEnd: [{ type: core.Output }],\n        mode: [{ type: core.Input }]\n    };\n    /** Clamps a value to be between two numbers, by default 0 and 100. */\n    function clamp(v, min, max) {\n        if (min === void 0) { min = 0; }\n        if (max === void 0) { max = 100; }\n        return Math.max(min, Math.min(max, v));\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    var MatProgressBarModule = /** @class */ (function () {\n        function MatProgressBarModule() {\n        }\n        return MatProgressBarModule;\n    }());\n    MatProgressBarModule.decorators = [\n        { type: core.NgModule, args: [{\n                    imports: [common.CommonModule, core$1.MatCommonModule],\n                    exports: [MatProgressBar, core$1.MatCommonModule],\n                    declarations: [MatProgressBar],\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     * Generated bundle index. Do not edit.\n     */\n\n    exports.MAT_PROGRESS_BAR_LOCATION = MAT_PROGRESS_BAR_LOCATION;\n    exports.MAT_PROGRESS_BAR_LOCATION_FACTORY = MAT_PROGRESS_BAR_LOCATION_FACTORY;\n    exports.MatProgressBar = MatProgressBar;\n    exports.MatProgressBarModule = MatProgressBarModule;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-progress-bar.umd.js.map\n"]}