{"version":3,"file":"common.umd.js","sources":["../../../../../packages/common/src/dom_adapter.ts","../../../../../external/npm/node_modules/tslib/tslib.es6.js","../../../../../packages/common/src/dom_tokens.ts","../../../../../packages/common/src/location/platform_location.ts","../../../../../packages/common/src/private_export.ts","../../../../../packages/common/src/location/util.ts","../../../../../packages/common/src/location/location_strategy.ts","../../../../../packages/common/src/location/hash_location_strategy.ts","../../../../../packages/common/src/location/location.ts","../../../../../packages/common/src/location/index.ts","../../../../../packages/common/src/i18n/currencies.ts","../../../../../packages/common/src/i18n/locale_data_api.ts","../../../../../packages/common/src/i18n/format_date.ts","../../../../../packages/common/src/i18n/format_number.ts","../../../../../packages/common/src/i18n/localization.ts","../../../../../packages/common/src/i18n/locale_data.ts","../../../../../packages/common/src/cookie.ts","../../../../../packages/common/src/directives/ng_class.ts","../../../../../packages/common/src/directives/ng_component_outlet.ts","../../../../../packages/common/src/directives/ng_for_of.ts","../../../../../packages/common/src/directives/ng_if.ts","../../../../../packages/common/src/directives/ng_switch.ts","../../../../../packages/common/src/directives/ng_plural.ts","../../../../../packages/common/src/directives/ng_style.ts","../../../../../packages/common/src/directives/ng_template_outlet.ts","../../../../../packages/common/src/directives/index.ts","../../../../../packages/common/src/pipes/invalid_pipe_argument_error.ts","../../../../../packages/common/src/pipes/async_pipe.ts","../../../../../packages/common/src/pipes/case_conversion_pipes.ts","../../../../../packages/common/src/pipes/date_pipe.ts","../../../../../packages/common/src/pipes/i18n_plural_pipe.ts","../../../../../packages/common/src/pipes/i18n_select_pipe.ts","../../../../../packages/common/src/pipes/json_pipe.ts","../../../../../packages/common/src/pipes/keyvalue_pipe.ts","../../../../../packages/common/src/pipes/number_pipe.ts","../../../../../packages/common/src/pipes/slice_pipe.ts","../../../../../packages/common/src/pipes/index.ts","../../../../../packages/common/src/common_module.ts","../../../../../packages/common/src/platform_id.ts","../../../../../packages/common/src/version.ts","../../../../../packages/common/src/viewport_scroller.ts","../../../../../packages/common/src/common.ts","../../../../../packages/common/public_api.ts","../../../../../packages/common/index.ts","../../../../../packages/common/common.ts"],"sourcesContent":["/**\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\nlet _DOM: DomAdapter = null!;\n\nexport function getDOM(): DomAdapter {\n  return _DOM;\n}\n\nexport function setDOM(adapter: DomAdapter) {\n  _DOM = adapter;\n}\n\nexport function setRootDomAdapter(adapter: DomAdapter) {\n  if (!_DOM) {\n    _DOM = adapter;\n  }\n}\n\n/* tslint:disable:requireParameterType */\n/**\n * Provides DOM operations in an environment-agnostic way.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\nexport abstract class DomAdapter {\n  // Needs Domino-friendly test utility\n  abstract getProperty(el: Element, name: string): any;\n  abstract dispatchEvent(el: any, evt: any): any;\n\n  // Used by router\n  abstract log(error: any): any;\n  abstract logGroup(error: any): any;\n  abstract logGroupEnd(): any;\n\n  // Used by Meta\n  abstract remove(el: any): Node;\n  abstract createElement(tagName: any, doc?: any): HTMLElement;\n  abstract createHtmlDocument(): HTMLDocument;\n  abstract getDefaultDocument(): Document;\n\n  // Used by By.css\n  abstract isElementNode(node: any): boolean;\n\n  // Used by Testability\n  abstract isShadowRoot(node: any): boolean;\n\n  // Used by KeyEventsPlugin\n  abstract onAndCancel(el: any, evt: any, listener: any): Function;\n  abstract supportsDOMEvents(): boolean;\n\n  // Used by PlatformLocation and ServerEventManagerPlugin\n  abstract getGlobalEventTarget(doc: Document, target: string): any;\n\n  // Used by PlatformLocation\n  abstract getHistory(): History;\n  abstract getLocation():\n      any; /** This is the ambient Location definition, NOT Location from @angular/common.  */\n  abstract getBaseHref(doc: Document): string|null;\n  abstract resetBaseElement(): void;\n\n  // TODO: remove dependency in DefaultValueAccessor\n  abstract getUserAgent(): string;\n\n  // Used by AngularProfiler\n  abstract performanceNow(): number;\n\n  // Used by CookieXSRFStrategy\n  abstract supportsCookies(): boolean;\n  abstract getCookie(name: string): string|null;\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\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) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\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; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\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);\r\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); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\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\nimport {InjectionToken} from '@angular/core';\n\n/**\n * A DI Token representing the main rendering context. In a browser this is the DOM Document.\n *\n * Note: Document might not be available in the Application Context when Application and Rendering\n * Contexts are not the same (e.g. when running the application in a Web Worker).\n *\n * @publicApi\n */\nexport const DOCUMENT = new InjectionToken<Document>('DocumentToken');\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\nimport {Inject, Injectable, InjectionToken, ɵɵinject} from '@angular/core';\nimport {getDOM} from '../dom_adapter';\nimport {DOCUMENT} from '../dom_tokens';\n\n/**\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n *\n * `PlatformLocation` encapsulates all calls to DOM APIs, which allows the Router to be\n * platform-agnostic.\n * This means that we can have different implementation of `PlatformLocation` for the different\n * platforms that Angular supports. For example, `@angular/platform-browser` provides an\n * implementation specific to the browser environment, while `@angular/platform-server` provides\n * one suitable for use with server-side rendering.\n *\n * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}\n * when they need to interact with the DOM APIs like pushState, popState, etc.\n *\n * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly\n * by the {@link Router} in order to navigate between routes. Since all interactions between {@link\n * Router} /\n * {@link Location} / {@link LocationStrategy} and DOM APIs flow through the `PlatformLocation`\n * class, they are all platform-agnostic.\n *\n * @publicApi\n */\n@Injectable({\n  providedIn: 'platform',\n  // See #23917\n  useFactory: useBrowserPlatformLocation\n})\nexport abstract class PlatformLocation {\n  abstract getBaseHrefFromDOM(): string;\n  abstract getState(): unknown;\n  abstract onPopState(fn: LocationChangeListener): void;\n  abstract onHashChange(fn: LocationChangeListener): void;\n\n  abstract get href(): string;\n  abstract get protocol(): string;\n  abstract get hostname(): string;\n  abstract get port(): string;\n  abstract get pathname(): string;\n  abstract get search(): string;\n  abstract get hash(): string;\n\n  abstract replaceState(state: any, title: string, url: string): void;\n\n  abstract pushState(state: any, title: string, url: string): void;\n\n  abstract forward(): void;\n\n  abstract back(): void;\n}\n\nexport function useBrowserPlatformLocation() {\n  return ɵɵinject(BrowserPlatformLocation);\n}\n\n/**\n * @description\n * Indicates when a location is initialized.\n *\n * @publicApi\n */\nexport const LOCATION_INITIALIZED = new InjectionToken<Promise<any>>('Location Initialized');\n\n/**\n * @description\n * A serializable version of the event from `onPopState` or `onHashChange`\n *\n * @publicApi\n */\nexport interface LocationChangeEvent {\n  type: string;\n  state: any;\n}\n\n/**\n * @publicApi\n */\nexport interface LocationChangeListener {\n  (event: LocationChangeEvent): any;\n}\n\n\n\n/**\n * `PlatformLocation` encapsulates all of the direct calls to platform APIs.\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n */\n@Injectable({\n  providedIn: 'platform',\n  // See #23917\n  useFactory: createBrowserPlatformLocation,\n})\nexport class BrowserPlatformLocation extends PlatformLocation {\n  public readonly location!: Location;\n  private _history!: History;\n\n  constructor(@Inject(DOCUMENT) private _doc: any) {\n    super();\n    this._init();\n  }\n\n  // This is moved to its own method so that `MockPlatformLocationStrategy` can overwrite it\n  /** @internal */\n  _init() {\n    (this as {location: Location}).location = getDOM().getLocation();\n    this._history = getDOM().getHistory();\n  }\n\n  getBaseHrefFromDOM(): string {\n    return getDOM().getBaseHref(this._doc)!;\n  }\n\n  onPopState(fn: LocationChangeListener): void {\n    getDOM().getGlobalEventTarget(this._doc, 'window').addEventListener('popstate', fn, false);\n  }\n\n  onHashChange(fn: LocationChangeListener): void {\n    getDOM().getGlobalEventTarget(this._doc, 'window').addEventListener('hashchange', fn, false);\n  }\n\n  get href(): string {\n    return this.location.href;\n  }\n  get protocol(): string {\n    return this.location.protocol;\n  }\n  get hostname(): string {\n    return this.location.hostname;\n  }\n  get port(): string {\n    return this.location.port;\n  }\n  get pathname(): string {\n    return this.location.pathname;\n  }\n  get search(): string {\n    return this.location.search;\n  }\n  get hash(): string {\n    return this.location.hash;\n  }\n  set pathname(newPath: string) {\n    this.location.pathname = newPath;\n  }\n\n  pushState(state: any, title: string, url: string): void {\n    if (supportsState()) {\n      this._history.pushState(state, title, url);\n    } else {\n      this.location.hash = url;\n    }\n  }\n\n  replaceState(state: any, title: string, url: string): void {\n    if (supportsState()) {\n      this._history.replaceState(state, title, url);\n    } else {\n      this.location.hash = url;\n    }\n  }\n\n  forward(): void {\n    this._history.forward();\n  }\n\n  back(): void {\n    this._history.back();\n  }\n\n  getState(): unknown {\n    return this._history.state;\n  }\n}\n\nexport function supportsState(): boolean {\n  return !!window.history.pushState;\n}\nexport function createBrowserPlatformLocation() {\n  return new BrowserPlatformLocation(ɵɵinject(DOCUMENT));\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\nexport {DomAdapter as ɵDomAdapter, getDOM as ɵgetDOM, setRootDomAdapter as ɵsetRootDomAdapter} from './dom_adapter';\nexport {BrowserPlatformLocation as ɵBrowserPlatformLocation} from './location/platform_location';\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/**\n * Joins two parts of a URL with a slash if needed.\n *\n * @param start  URL string\n * @param end    URL string\n *\n *\n * @returns The joined URL string.\n */\nexport function joinWithSlash(start: string, end: string): string {\n  if (start.length == 0) {\n    return end;\n  }\n  if (end.length == 0) {\n    return start;\n  }\n  let slashes = 0;\n  if (start.endsWith('/')) {\n    slashes++;\n  }\n  if (end.startsWith('/')) {\n    slashes++;\n  }\n  if (slashes == 2) {\n    return start + end.substring(1);\n  }\n  if (slashes == 1) {\n    return start + end;\n  }\n  return start + '/' + end;\n}\n\n/**\n * Removes a trailing slash from a URL string if needed.\n * Looks for the first occurrence of either `#`, `?`, or the end of the\n * line as `/` characters and removes the trailing slash if one exists.\n *\n * @param url URL string.\n *\n * @returns The URL string, modified if needed.\n */\nexport function stripTrailingSlash(url: string): string {\n  const match = url.match(/#|\\?|$/);\n  const pathEndIdx = match && match.index || url.length;\n  const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0);\n  return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx);\n}\n\n/**\n * Normalizes URL parameters by prepending with `?` if needed.\n *\n * @param  params String of URL parameters.\n *\n * @returns The normalized URL parameters string.\n */\nexport function normalizeQueryParams(params: string): string {\n  return params && params[0] !== '?' ? '?' + params : params;\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\nimport {Inject, Injectable, InjectionToken, Optional, ɵɵinject} from '@angular/core';\nimport {DOCUMENT} from '../dom_tokens';\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams} from './util';\n\n/**\n * Enables the `Location` service to read route state from the browser's URL.\n * Angular provides two strategies:\n * `HashLocationStrategy` and `PathLocationStrategy`.\n *\n * Applications should use the `Router` or `Location` services to\n * interact with application route state.\n *\n * For instance, `HashLocationStrategy` produces URLs like\n * <code class=\"no-auto-link\">http://example.com#/foo</code>,\n * and `PathLocationStrategy` produces\n * <code class=\"no-auto-link\">http://example.com/foo</code> as an equivalent URL.\n *\n * See these two classes for more.\n *\n * @publicApi\n */\n@Injectable({providedIn: 'root', useFactory: provideLocationStrategy})\nexport abstract class LocationStrategy {\n  abstract path(includeHash?: boolean): string;\n  abstract prepareExternalUrl(internal: string): string;\n  abstract pushState(state: any, title: string, url: string, queryParams: string): void;\n  abstract replaceState(state: any, title: string, url: string, queryParams: string): void;\n  abstract forward(): void;\n  abstract back(): void;\n  abstract onPopState(fn: LocationChangeListener): void;\n  abstract getBaseHref(): string;\n}\n\nexport function provideLocationStrategy(platformLocation: PlatformLocation) {\n  // See #23917\n  const location = ɵɵinject(DOCUMENT).location;\n  return new PathLocationStrategy(\n      ɵɵinject(PlatformLocation as any), location && location.origin || '');\n}\n\n\n/**\n * A predefined [DI token](guide/glossary#di-token) for the base href\n * to be used with the `PathLocationStrategy`.\n * The base href is the URL prefix that should be preserved when generating\n * and recognizing URLs.\n *\n * @usageNotes\n *\n * The following example shows how to use this token to configure the root app injector\n * with a base href value, so that the DI framework can supply the dependency anywhere in the app.\n *\n * ```typescript\n * import {Component, NgModule} from '@angular/core';\n * import {APP_BASE_HREF} from '@angular/common';\n *\n * @NgModule({\n *   providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]\n * })\n * class AppModule {}\n * ```\n *\n * @publicApi\n */\nexport const APP_BASE_HREF = new InjectionToken<string>('appBaseHref');\n\n/**\n * @description\n * A {@link LocationStrategy} used to configure the {@link Location} service to\n * represent its state in the\n * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the\n * browser's URL.\n *\n * If you're using `PathLocationStrategy`, you must provide a {@link APP_BASE_HREF}\n * or add a `<base href>` element to the document.\n *\n * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,\n * the `<base href>` and/or `APP_BASE_HREF` should end with a `/`.\n *\n * Similarly, if you add `<base href='/my/app/'/>` to the document and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`.\n *\n * Note that when using `PathLocationStrategy`, neither the query nor\n * the fragment in the `<base href>` will be preserved, as outlined\n * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable()\nexport class PathLocationStrategy extends LocationStrategy {\n  private _baseHref: string;\n\n  constructor(\n      private _platformLocation: PlatformLocation,\n      @Optional() @Inject(APP_BASE_HREF) href?: string) {\n    super();\n\n    if (href == null) {\n      href = this._platformLocation.getBaseHrefFromDOM();\n    }\n\n    if (href == null) {\n      throw new Error(\n          `No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.`);\n    }\n\n    this._baseHref = href;\n  }\n\n  onPopState(fn: LocationChangeListener): void {\n    this._platformLocation.onPopState(fn);\n    this._platformLocation.onHashChange(fn);\n  }\n\n  getBaseHref(): string {\n    return this._baseHref;\n  }\n\n  prepareExternalUrl(internal: string): string {\n    return joinWithSlash(this._baseHref, internal);\n  }\n\n  path(includeHash: boolean = false): string {\n    const pathname =\n        this._platformLocation.pathname + normalizeQueryParams(this._platformLocation.search);\n    const hash = this._platformLocation.hash;\n    return hash && includeHash ? `${pathname}${hash}` : pathname;\n  }\n\n  pushState(state: any, title: string, url: string, queryParams: string) {\n    const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n    this._platformLocation.pushState(state, title, externalUrl);\n  }\n\n  replaceState(state: any, title: string, url: string, queryParams: string) {\n    const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));\n    this._platformLocation.replaceState(state, title, externalUrl);\n  }\n\n  forward(): void {\n    this._platformLocation.forward();\n  }\n\n  back(): void {\n    this._platformLocation.back();\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\nimport {Inject, Injectable, Optional} from '@angular/core';\nimport {APP_BASE_HREF, LocationStrategy} from './location_strategy';\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams} from './util';\n\n\n\n/**\n * @description\n * A {@link LocationStrategy} used to configure the {@link Location} service to\n * represent its state in the\n * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)\n * of the browser's URL.\n *\n * For instance, if you call `location.go('/foo')`, the browser's URL will become\n * `example.com#/foo`.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}\n *\n * @publicApi\n */\n@Injectable()\nexport class HashLocationStrategy extends LocationStrategy {\n  private _baseHref: string = '';\n  constructor(\n      private _platformLocation: PlatformLocation,\n      @Optional() @Inject(APP_BASE_HREF) _baseHref?: string) {\n    super();\n    if (_baseHref != null) {\n      this._baseHref = _baseHref;\n    }\n  }\n\n  onPopState(fn: LocationChangeListener): void {\n    this._platformLocation.onPopState(fn);\n    this._platformLocation.onHashChange(fn);\n  }\n\n  getBaseHref(): string {\n    return this._baseHref;\n  }\n\n  path(includeHash: boolean = false): string {\n    // the hash value is always prefixed with a `#`\n    // and if it is empty then it will stay empty\n    let path = this._platformLocation.hash;\n    if (path == null) path = '#';\n\n    return path.length > 0 ? path.substring(1) : path;\n  }\n\n  prepareExternalUrl(internal: string): string {\n    const url = joinWithSlash(this._baseHref, internal);\n    return url.length > 0 ? ('#' + url) : url;\n  }\n\n  pushState(state: any, title: string, path: string, queryParams: string) {\n    let url: string|null = this.prepareExternalUrl(path + normalizeQueryParams(queryParams));\n    if (url.length == 0) {\n      url = this._platformLocation.pathname;\n    }\n    this._platformLocation.pushState(state, title, url);\n  }\n\n  replaceState(state: any, title: string, path: string, queryParams: string) {\n    let url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams));\n    if (url.length == 0) {\n      url = this._platformLocation.pathname;\n    }\n    this._platformLocation.replaceState(state, title, url);\n  }\n\n  forward(): void {\n    this._platformLocation.forward();\n  }\n\n  back(): void {\n    this._platformLocation.back();\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\nimport {EventEmitter, Injectable, ɵɵinject} from '@angular/core';\nimport {SubscriptionLike} from 'rxjs';\nimport {LocationStrategy} from './location_strategy';\nimport {PlatformLocation} from './platform_location';\nimport {joinWithSlash, normalizeQueryParams, stripTrailingSlash} from './util';\n\n/** @publicApi */\nexport interface PopStateEvent {\n  pop?: boolean;\n  state?: any;\n  type?: string;\n  url?: string;\n}\n\n/**\n * @description\n *\n * A service that applications can use to interact with a browser's URL.\n *\n * Depending on the `LocationStrategy` used, `Location` persists\n * to the URL's path or the URL's hash segment.\n *\n * @usageNotes\n *\n * It's better to use the `Router#navigate` service to trigger route changes. Use\n * `Location` only if you need to interact with or create normalized URLs outside of\n * routing.\n *\n * `Location` is responsible for normalizing the URL against the application's base href.\n * A normalized URL is absolute from the URL host, includes the application's base href, and has no\n * trailing slash:\n * - `/my/app/user/123` is normalized\n * - `my/app/user/123` **is not** normalized\n * - `/my/app/user/123/` **is not** normalized\n *\n * ### Example\n *\n * <code-example path='common/location/ts/path_location_component.ts'\n * region='LocationComponent'></code-example>\n *\n * @publicApi\n */\n@Injectable({\n  providedIn: 'root',\n  // See #23917\n  useFactory: createLocation,\n})\nexport class Location {\n  /** @internal */\n  _subject: EventEmitter<any> = new EventEmitter();\n  /** @internal */\n  _baseHref: string;\n  /** @internal */\n  _platformStrategy: LocationStrategy;\n  /** @internal */\n  _platformLocation: PlatformLocation;\n  /** @internal */\n  _urlChangeListeners: ((url: string, state: unknown) => void)[] = [];\n  /** @internal */\n  _urlChangeSubscription?: SubscriptionLike;\n\n  constructor(platformStrategy: LocationStrategy, platformLocation: PlatformLocation) {\n    this._platformStrategy = platformStrategy;\n    const browserBaseHref = this._platformStrategy.getBaseHref();\n    this._platformLocation = platformLocation;\n    this._baseHref = stripTrailingSlash(_stripIndexHtml(browserBaseHref));\n    this._platformStrategy.onPopState((ev) => {\n      this._subject.emit({\n        'url': this.path(true),\n        'pop': true,\n        'state': ev.state,\n        'type': ev.type,\n      });\n    });\n  }\n\n  /**\n   * Normalizes the URL path for this location.\n   *\n   * @param includeHash True to include an anchor fragment in the path.\n   *\n   * @returns The normalized URL path.\n   */\n  // TODO: vsavkin. Remove the boolean flag and always include hash once the deprecated router is\n  // removed.\n  path(includeHash: boolean = false): string {\n    return this.normalize(this._platformStrategy.path(includeHash));\n  }\n\n  /**\n   * Reports the current state of the location history.\n   * @returns The current value of the `history.state` object.\n   */\n  getState(): unknown {\n    return this._platformLocation.getState();\n  }\n\n  /**\n   * Normalizes the given path and compares to the current normalized path.\n   *\n   * @param path The given URL path.\n   * @param query Query parameters.\n   *\n   * @returns True if the given URL path is equal to the current normalized path, false\n   * otherwise.\n   */\n  isCurrentPathEqualTo(path: string, query: string = ''): boolean {\n    return this.path() == this.normalize(path + normalizeQueryParams(query));\n  }\n\n  /**\n   * Normalizes a URL path by stripping any trailing slashes.\n   *\n   * @param url String representing a URL.\n   *\n   * @returns The normalized URL string.\n   */\n  normalize(url: string): string {\n    return Location.stripTrailingSlash(_stripBaseHref(this._baseHref, _stripIndexHtml(url)));\n  }\n\n  /**\n   * Normalizes an external URL path.\n   * If the given URL doesn't begin with a leading slash (`'/'`), adds one\n   * before normalizing. Adds a hash if `HashLocationStrategy` is\n   * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n   *\n   * @param url String representing a URL.\n   *\n   * @returns  A normalized platform-specific URL.\n   */\n  prepareExternalUrl(url: string): string {\n    if (url && url[0] !== '/') {\n      url = '/' + url;\n    }\n    return this._platformStrategy.prepareExternalUrl(url);\n  }\n\n  // TODO: rename this method to pushState\n  /**\n   * Changes the browser's URL to a normalized version of a given URL, and pushes a\n   * new item onto the platform's history.\n   *\n   * @param path  URL path to normalize.\n   * @param query Query parameters.\n   * @param state Location history state.\n   *\n   */\n  go(path: string, query: string = '', state: any = null): void {\n    this._platformStrategy.pushState(state, '', path, query);\n    this._notifyUrlChangeListeners(\n        this.prepareExternalUrl(path + normalizeQueryParams(query)), state);\n  }\n\n  /**\n   * Changes the browser's URL to a normalized version of the given URL, and replaces\n   * the top item on the platform's history stack.\n   *\n   * @param path  URL path to normalize.\n   * @param query Query parameters.\n   * @param state Location history state.\n   */\n  replaceState(path: string, query: string = '', state: any = null): void {\n    this._platformStrategy.replaceState(state, '', path, query);\n    this._notifyUrlChangeListeners(\n        this.prepareExternalUrl(path + normalizeQueryParams(query)), state);\n  }\n\n  /**\n   * Navigates forward in the platform's history.\n   */\n  forward(): void {\n    this._platformStrategy.forward();\n  }\n\n  /**\n   * Navigates back in the platform's history.\n   */\n  back(): void {\n    this._platformStrategy.back();\n  }\n\n  /**\n   * Registers a URL change listener. Use to catch updates performed by the Angular\n   * framework that are not detectible through \"popstate\" or \"hashchange\" events.\n   *\n   * @param fn The change handler function, which take a URL and a location history state.\n   */\n  onUrlChange(fn: (url: string, state: unknown) => void) {\n    this._urlChangeListeners.push(fn);\n\n    if (!this._urlChangeSubscription) {\n      this._urlChangeSubscription = this.subscribe(v => {\n        this._notifyUrlChangeListeners(v.url, v.state);\n      });\n    }\n  }\n\n  /** @internal */\n  _notifyUrlChangeListeners(url: string = '', state: unknown) {\n    this._urlChangeListeners.forEach(fn => fn(url, state));\n  }\n\n  /**\n   * Subscribes to the platform's `popState` events.\n   *\n   * @param value Event that is triggered when the state history changes.\n   * @param exception The exception to throw.\n   *\n   * @returns Subscribed events.\n   */\n  subscribe(\n      onNext: (value: PopStateEvent) => void, onThrow?: ((exception: any) => void)|null,\n      onReturn?: (() => void)|null): SubscriptionLike {\n    return this._subject.subscribe({next: onNext, error: onThrow, complete: onReturn});\n  }\n\n  /**\n   * Normalizes URL parameters by prepending with `?` if needed.\n   *\n   * @param  params String of URL parameters.\n   *\n   * @returns The normalized URL parameters string.\n   */\n  public static normalizeQueryParams: (params: string) => string = normalizeQueryParams;\n\n  /**\n   * Joins two parts of a URL with a slash if needed.\n   *\n   * @param start  URL string\n   * @param end    URL string\n   *\n   *\n   * @returns The joined URL string.\n   */\n  public static joinWithSlash: (start: string, end: string) => string = joinWithSlash;\n\n  /**\n   * Removes a trailing slash from a URL string if needed.\n   * Looks for the first occurrence of either `#`, `?`, or the end of the\n   * line as `/` characters and removes the trailing slash if one exists.\n   *\n   * @param url URL string.\n   *\n   * @returns The URL string, modified if needed.\n   */\n  public static stripTrailingSlash: (url: string) => string = stripTrailingSlash;\n}\n\nexport function createLocation() {\n  return new Location(ɵɵinject(LocationStrategy as any), ɵɵinject(PlatformLocation as any));\n}\n\nfunction _stripBaseHref(baseHref: string, url: string): string {\n  return baseHref && url.startsWith(baseHref) ? url.substring(baseHref.length) : url;\n}\n\nfunction _stripIndexHtml(url: string): string {\n  return url.replace(/\\/index.html$/, '');\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\nexport {HashLocationStrategy} from './hash_location_strategy';\nexport {Location, PopStateEvent} from './location';\nexport {APP_BASE_HREF, LocationStrategy, PathLocationStrategy} from './location_strategy';\nexport {LOCATION_INITIALIZED, LocationChangeEvent, LocationChangeListener, PlatformLocation} from './platform_location';\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// THIS CODE IS GENERATED - DO NOT MODIFY\n// See angular/tools/gulp-tasks/cldr/extract.js\n\nexport type CurrenciesSymbols = [string]|[string | undefined, string];\n\n/** @internal */\nexport const CURRENCIES_EN:\n    {[code: string]: CurrenciesSymbols|[string | undefined, string | undefined, number]} = {\n      'ADP': [undefined, undefined, 0],\n      'AFN': [undefined, undefined, 0],\n      'ALL': [undefined, undefined, 0],\n      'AMD': [undefined, undefined, 2],\n      'AOA': [undefined, 'Kz'],\n      'ARS': [undefined, '$'],\n      'AUD': ['A$', '$'],\n      'BAM': [undefined, 'KM'],\n      'BBD': [undefined, '$'],\n      'BDT': [undefined, '৳'],\n      'BHD': [undefined, undefined, 3],\n      'BIF': [undefined, undefined, 0],\n      'BMD': [undefined, '$'],\n      'BND': [undefined, '$'],\n      'BOB': [undefined, 'Bs'],\n      'BRL': ['R$'],\n      'BSD': [undefined, '$'],\n      'BWP': [undefined, 'P'],\n      'BYN': [undefined, 'р.', 2],\n      'BYR': [undefined, undefined, 0],\n      'BZD': [undefined, '$'],\n      'CAD': ['CA$', '$', 2],\n      'CHF': [undefined, undefined, 2],\n      'CLF': [undefined, undefined, 4],\n      'CLP': [undefined, '$', 0],\n      'CNY': ['CN¥', '¥'],\n      'COP': [undefined, '$', 2],\n      'CRC': [undefined, '₡', 2],\n      'CUC': [undefined, '$'],\n      'CUP': [undefined, '$'],\n      'CZK': [undefined, 'Kč', 2],\n      'DJF': [undefined, undefined, 0],\n      'DKK': [undefined, 'kr', 2],\n      'DOP': [undefined, '$'],\n      'EGP': [undefined, 'E£'],\n      'ESP': [undefined, '₧', 0],\n      'EUR': ['€'],\n      'FJD': [undefined, '$'],\n      'FKP': [undefined, '£'],\n      'GBP': ['£'],\n      'GEL': [undefined, '₾'],\n      'GIP': [undefined, '£'],\n      'GNF': [undefined, 'FG', 0],\n      'GTQ': [undefined, 'Q'],\n      'GYD': [undefined, '$', 2],\n      'HKD': ['HK$', '$'],\n      'HNL': [undefined, 'L'],\n      'HRK': [undefined, 'kn'],\n      'HUF': [undefined, 'Ft', 2],\n      'IDR': [undefined, 'Rp', 2],\n      'ILS': ['₪'],\n      'INR': ['₹'],\n      'IQD': [undefined, undefined, 0],\n      'IRR': [undefined, undefined, 0],\n      'ISK': [undefined, 'kr', 0],\n      'ITL': [undefined, undefined, 0],\n      'JMD': [undefined, '$'],\n      'JOD': [undefined, undefined, 3],\n      'JPY': ['¥', undefined, 0],\n      'KHR': [undefined, '៛'],\n      'KMF': [undefined, 'CF', 0],\n      'KPW': [undefined, '₩', 0],\n      'KRW': ['₩', undefined, 0],\n      'KWD': [undefined, undefined, 3],\n      'KYD': [undefined, '$'],\n      'KZT': [undefined, '₸'],\n      'LAK': [undefined, '₭', 0],\n      'LBP': [undefined, 'L£', 0],\n      'LKR': [undefined, 'Rs'],\n      'LRD': [undefined, '$'],\n      'LTL': [undefined, 'Lt'],\n      'LUF': [undefined, undefined, 0],\n      'LVL': [undefined, 'Ls'],\n      'LYD': [undefined, undefined, 3],\n      'MGA': [undefined, 'Ar', 0],\n      'MGF': [undefined, undefined, 0],\n      'MMK': [undefined, 'K', 0],\n      'MNT': [undefined, '₮', 2],\n      'MRO': [undefined, undefined, 0],\n      'MUR': [undefined, 'Rs', 2],\n      'MXN': ['MX$', '$'],\n      'MYR': [undefined, 'RM'],\n      'NAD': [undefined, '$'],\n      'NGN': [undefined, '₦'],\n      'NIO': [undefined, 'C$'],\n      'NOK': [undefined, 'kr', 2],\n      'NPR': [undefined, 'Rs'],\n      'NZD': ['NZ$', '$'],\n      'OMR': [undefined, undefined, 3],\n      'PHP': [undefined, '₱'],\n      'PKR': [undefined, 'Rs', 2],\n      'PLN': [undefined, 'zł'],\n      'PYG': [undefined, '₲', 0],\n      'RON': [undefined, 'lei'],\n      'RSD': [undefined, undefined, 0],\n      'RUB': [undefined, '₽'],\n      'RUR': [undefined, 'р.'],\n      'RWF': [undefined, 'RF', 0],\n      'SBD': [undefined, '$'],\n      'SEK': [undefined, 'kr', 2],\n      'SGD': [undefined, '$'],\n      'SHP': [undefined, '£'],\n      'SLL': [undefined, undefined, 0],\n      'SOS': [undefined, undefined, 0],\n      'SRD': [undefined, '$'],\n      'SSP': [undefined, '£'],\n      'STD': [undefined, undefined, 0],\n      'STN': [undefined, 'Db'],\n      'SYP': [undefined, '£', 0],\n      'THB': [undefined, '฿'],\n      'TMM': [undefined, undefined, 0],\n      'TND': [undefined, undefined, 3],\n      'TOP': [undefined, 'T$'],\n      'TRL': [undefined, undefined, 0],\n      'TRY': [undefined, '₺'],\n      'TTD': [undefined, '$'],\n      'TWD': ['NT$', '$', 2],\n      'TZS': [undefined, undefined, 2],\n      'UAH': [undefined, '₴'],\n      'UGX': [undefined, undefined, 0],\n      'USD': ['$'],\n      'UYI': [undefined, undefined, 0],\n      'UYU': [undefined, '$'],\n      'UYW': [undefined, undefined, 4],\n      'UZS': [undefined, undefined, 2],\n      'VEF': [undefined, 'Bs', 2],\n      'VND': ['₫', undefined, 0],\n      'VUV': [undefined, undefined, 0],\n      'XAF': ['FCFA', undefined, 0],\n      'XCD': ['EC$', '$'],\n      'XOF': ['CFA', undefined, 0],\n      'XPF': ['CFPF', undefined, 0],\n      'XXX': ['¤'],\n      'YER': [undefined, undefined, 0],\n      'ZAR': [undefined, 'R'],\n      'ZMK': [undefined, undefined, 0],\n      'ZMW': [undefined, 'ZK'],\n      'ZWD': [undefined, undefined, 0]\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\nimport {ɵCurrencyIndex, ɵExtraLocaleDataIndex, ɵfindLocaleData, ɵgetLocaleCurrencyCode, ɵgetLocalePluralCase, ɵLocaleDataIndex} from '@angular/core';\n\nimport {CURRENCIES_EN, CurrenciesSymbols} from './currencies';\n\n\n/**\n * Format styles that can be used to represent numbers.\n * @see `getLocaleNumberFormat()`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport enum NumberFormatStyle {\n  Decimal,\n  Percent,\n  Currency,\n  Scientific\n}\n\n/**\n * Plurality cases used for translating plurals to different languages.\n *\n * @see `NgPlural`\n * @see `NgPluralCase`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport enum Plural {\n  Zero = 0,\n  One = 1,\n  Two = 2,\n  Few = 3,\n  Many = 4,\n  Other = 5,\n}\n\n/**\n * Context-dependant translation forms for strings.\n * Typically the standalone version is for the nominative form of the word,\n * and the format version is used for the genitive case.\n * @see [CLDR website](http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles)\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport enum FormStyle {\n  Format,\n  Standalone\n}\n\n/**\n * String widths available for translations.\n * The specific character widths are locale-specific.\n * Examples are given for the word \"Sunday\" in English.\n *\n * @publicApi\n */\nexport enum TranslationWidth {\n  /** 1 character for `en-US`. For example: 'S' */\n  Narrow,\n  /** 3 characters for `en-US`. For example: 'Sun' */\n  Abbreviated,\n  /** Full length for `en-US`. For example: \"Sunday\" */\n  Wide,\n  /** 2 characters for `en-US`, For example: \"Su\" */\n  Short\n}\n\n/**\n * String widths available for date-time formats.\n * The specific character widths are locale-specific.\n * Examples are given for `en-US`.\n *\n * @see `getLocaleDateFormat()`\n * @see `getLocaleTimeFormat()`\n * @see `getLocaleDateTimeFormat()`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n * @publicApi\n */\nexport enum FormatWidth {\n  /**\n   * For `en-US`, 'M/d/yy, h:mm a'`\n   * (Example: `6/15/15, 9:03 AM`)\n   */\n  Short,\n  /**\n   * For `en-US`, `'MMM d, y, h:mm:ss a'`\n   * (Example: `Jun 15, 2015, 9:03:01 AM`)\n   */\n  Medium,\n  /**\n   * For `en-US`, `'MMMM d, y, h:mm:ss a z'`\n   * (Example: `June 15, 2015 at 9:03:01 AM GMT+1`)\n   */\n  Long,\n  /**\n   * For `en-US`, `'EEEE, MMMM d, y, h:mm:ss a zzzz'`\n   * (Example: `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00`)\n   */\n  Full\n}\n\n/**\n * Symbols that can be used to replace placeholders in number patterns.\n * Examples are based on `en-US` values.\n *\n * @see `getLocaleNumberSymbol()`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport enum NumberSymbol {\n  /**\n   * Decimal separator.\n   * For `en-US`, the dot character.\n   * Example: 2,345`.`67\n   */\n  Decimal,\n  /**\n   * Grouping separator, typically for thousands.\n   * For `en-US`, the comma character.\n   * Example: 2`,`345.67\n   */\n  Group,\n  /**\n   * List-item separator.\n   * Example: \"one, two, and three\"\n   */\n  List,\n  /**\n   * Sign for percentage (out of 100).\n   * Example: 23.4%\n   */\n  PercentSign,\n  /**\n   * Sign for positive numbers.\n   * Example: +23\n   */\n  PlusSign,\n  /**\n   * Sign for negative numbers.\n   * Example: -23\n   */\n  MinusSign,\n  /**\n   * Computer notation for exponential value (n times a power of 10).\n   * Example: 1.2E3\n   */\n  Exponential,\n  /**\n   * Human-readable format of exponential.\n   * Example: 1.2x103\n   */\n  SuperscriptingExponent,\n  /**\n   * Sign for permille (out of 1000).\n   * Example: 23.4‰\n   */\n  PerMille,\n  /**\n   * Infinity, can be used with plus and minus.\n   * Example: ∞, +∞, -∞\n   */\n  Infinity,\n  /**\n   * Not a number.\n   * Example: NaN\n   */\n  NaN,\n  /**\n   * Symbol used between time units.\n   * Example: 10:52\n   */\n  TimeSeparator,\n  /**\n   * Decimal separator for currency values (fallback to `Decimal`).\n   * Example: $2,345.67\n   */\n  CurrencyDecimal,\n  /**\n   * Group separator for currency values (fallback to `Group`).\n   * Example: $2,345.67\n   */\n  CurrencyGroup\n}\n\n/**\n * The value for each day of the week, based on the `en-US` locale\n *\n * @publicApi\n */\nexport enum WeekDay {\n  Sunday = 0,\n  Monday,\n  Tuesday,\n  Wednesday,\n  Thursday,\n  Friday,\n  Saturday\n}\n\n/**\n * Retrieves the locale ID from the currently loaded locale.\n * The loaded locale could be, for example, a global one rather than a regional one.\n * @param locale A locale code, such as `fr-FR`.\n * @returns The locale code. For example, `fr`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleId(locale: string): string {\n  return ɵfindLocaleData(locale)[ɵLocaleDataIndex.LocaleId];\n}\n\n/**\n * Retrieves day period strings for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized period strings. For example, `[AM, PM]` for `en-US`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleDayPeriods(\n    locale: string, formStyle: FormStyle, width: TranslationWidth): Readonly<[string, string]> {\n  const data = ɵfindLocaleData(locale);\n  const amPmData = <[string, string][][]>[\n    data[ɵLocaleDataIndex.DayPeriodsFormat], data[ɵLocaleDataIndex.DayPeriodsStandalone]\n  ];\n  const amPm = getLastDefinedValue(amPmData, formStyle);\n  return getLastDefinedValue(amPm, width);\n}\n\n/**\n * Retrieves days of the week for the given locale, using the Gregorian calendar.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized name strings.\n * For example,`[Sunday, Monday, ... Saturday]` for `en-US`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleDayNames(\n    locale: string, formStyle: FormStyle, width: TranslationWidth): ReadonlyArray<string> {\n  const data = ɵfindLocaleData(locale);\n  const daysData =\n      <string[][][]>[data[ɵLocaleDataIndex.DaysFormat], data[ɵLocaleDataIndex.DaysStandalone]];\n  const days = getLastDefinedValue(daysData, formStyle);\n  return getLastDefinedValue(days, width);\n}\n\n/**\n * Retrieves months of the year for the given locale, using the Gregorian calendar.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns An array of localized name strings.\n * For example,  `[January, February, ...]` for `en-US`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleMonthNames(\n    locale: string, formStyle: FormStyle, width: TranslationWidth): ReadonlyArray<string> {\n  const data = ɵfindLocaleData(locale);\n  const monthsData =\n      <string[][][]>[data[ɵLocaleDataIndex.MonthsFormat], data[ɵLocaleDataIndex.MonthsStandalone]];\n  const months = getLastDefinedValue(monthsData, formStyle);\n  return getLastDefinedValue(months, width);\n}\n\n/**\n * Retrieves Gregorian-calendar eras for the given locale.\n * @param locale A locale code for the locale format rules to use.\n * @param width The required character width.\n\n * @returns An array of localized era strings.\n * For example, `[AD, BC]` for `en-US`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleEraNames(\n    locale: string, width: TranslationWidth): Readonly<[string, string]> {\n  const data = ɵfindLocaleData(locale);\n  const erasData = <[string, string][]>data[ɵLocaleDataIndex.Eras];\n  return getLastDefinedValue(erasData, width);\n}\n\n/**\n * Retrieves the first day of the week for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns A day index number, using the 0-based week-day index for `en-US`\n * (Sunday = 0, Monday = 1, ...).\n * For example, for `fr-FR`, returns 1 to indicate that the first day is Monday.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleFirstDayOfWeek(locale: string): WeekDay {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.FirstDayOfWeek];\n}\n\n/**\n * Range of week days that are considered the week-end for the given locale.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The range of day values, `[startDay, endDay]`.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleWeekEndRange(locale: string): [WeekDay, WeekDay] {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.WeekendRange];\n}\n\n/**\n * Retrieves a localized date-value formating string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formating string.\n * @see `FormatWidth`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleDateFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  return getLastDefinedValue(data[ɵLocaleDataIndex.DateFormat], width);\n}\n\n/**\n * Retrieves a localized time-value formatting string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formatting string.\n * @see `FormatWidth`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n\n * @publicApi\n */\nexport function getLocaleTimeFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  return getLastDefinedValue(data[ɵLocaleDataIndex.TimeFormat], width);\n}\n\n/**\n * Retrieves a localized date-time formatting string.\n *\n * @param locale A locale code for the locale format rules to use.\n * @param width The format type.\n * @returns The localized formatting string.\n * @see `FormatWidth`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleDateTimeFormat(locale: string, width: FormatWidth): string {\n  const data = ɵfindLocaleData(locale);\n  const dateTimeFormatData = <string[]>data[ɵLocaleDataIndex.DateTimeFormat];\n  return getLastDefinedValue(dateTimeFormatData, width);\n}\n\n/**\n * Retrieves a localized number symbol that can be used to replace placeholders in number formats.\n * @param locale The locale code.\n * @param symbol The symbol to localize.\n * @returns The character for the localized symbol.\n * @see `NumberSymbol`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string {\n  const data = ɵfindLocaleData(locale);\n  const res = data[ɵLocaleDataIndex.NumberSymbols][symbol];\n  if (typeof res === 'undefined') {\n    if (symbol === NumberSymbol.CurrencyDecimal) {\n      return data[ɵLocaleDataIndex.NumberSymbols][NumberSymbol.Decimal];\n    } else if (symbol === NumberSymbol.CurrencyGroup) {\n      return data[ɵLocaleDataIndex.NumberSymbols][NumberSymbol.Group];\n    }\n  }\n  return res;\n}\n\n/**\n * Retrieves a number format for a given locale.\n *\n * Numbers are formatted using patterns, like `#,###.00`. For example, the pattern `#,###.00`\n * when used to format the number 12345.678 could result in \"12'345,678\". That would happen if the\n * grouping separator for your language is an apostrophe, and the decimal separator is a comma.\n *\n * <b>Important:</b> The characters `.` `,` `0` `#` (and others below) are special placeholders\n * that stand for the decimal separator, and so on, and are NOT real characters.\n * You must NOT \"translate\" the placeholders. For example, don't change `.` to `,` even though in\n * your language the decimal point is written with a comma. The symbols should be replaced by the\n * local equivalents, using the appropriate `NumberSymbol` for your language.\n *\n * Here are the special characters used in number patterns:\n *\n * | Symbol | Meaning |\n * |--------|---------|\n * | . | Replaced automatically by the character used for the decimal point. |\n * | , | Replaced by the \"grouping\" (thousands) separator. |\n * | 0 | Replaced by a digit (or zero if there aren't enough digits). |\n * | # | Replaced by a digit (or nothing if there aren't enough). |\n * | ¤ | Replaced by a currency symbol, such as $ or USD. |\n * | % | Marks a percent format. The % symbol may change position, but must be retained. |\n * | E | Marks a scientific format. The E symbol may change position, but must be retained. |\n * | ' | Special characters used as literal characters are quoted with ASCII single quotes. |\n *\n * @param locale A locale code for the locale format rules to use.\n * @param type The type of numeric value to be formatted (such as `Decimal` or `Currency`.)\n * @returns The localized format string.\n * @see `NumberFormatStyle`\n * @see [CLDR website](http://cldr.unicode.org/translation/number-patterns)\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleNumberFormat(locale: string, type: NumberFormatStyle): string {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.NumberFormats][type];\n}\n\n/**\n * Retrieves the symbol used to represent the currency for the main country\n * corresponding to a given locale. For example, '$' for `en-US`.\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The localized symbol character,\n * or `null` if the main country cannot be determined.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleCurrencySymbol(locale: string): string|null {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.CurrencySymbol] || null;\n}\n\n/**\n * Retrieves the name of the currency for the main country corresponding\n * to a given locale. For example, 'US Dollar' for `en-US`.\n * @param locale A locale code for the locale format rules to use.\n * @returns The currency name,\n * or `null` if the main country cannot be determined.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleCurrencyName(locale: string): string|null {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.CurrencyName] || null;\n}\n\n/**\n * Retrieves the default currency code for the given locale.\n *\n * The default is defined as the first currency which is still in use.\n *\n * @param locale The code of the locale whose currency code we want.\n * @returns The code of the default currency for the given locale.\n *\n * @publicApi\n */\nexport function getLocaleCurrencyCode(locale: string): string|null {\n  return ɵgetLocaleCurrencyCode(locale);\n}\n\n/**\n * Retrieves the currency values for a given locale.\n * @param locale A locale code for the locale format rules to use.\n * @returns The currency values.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n */\nfunction getLocaleCurrencies(locale: string): {[code: string]: CurrenciesSymbols} {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.Currencies];\n}\n\n/**\n * @alias core/ɵgetLocalePluralCase\n * @publicApi\n */\nexport const getLocalePluralCase: (locale: string) => ((value: number) => Plural) =\n    ɵgetLocalePluralCase;\n\nfunction checkFullData(data: any) {\n  if (!data[ɵLocaleDataIndex.ExtraData]) {\n    throw new Error(`Missing extra locale data for the locale \"${\n        data[ɵLocaleDataIndex\n                 .LocaleId]}\". Use \"registerLocaleData\" to load new data. See the \"I18n guide\" on angular.io to know more.`);\n  }\n}\n\n/**\n * Retrieves locale-specific rules used to determine which day period to use\n * when more than one period is defined for a locale.\n *\n * There is a rule for each defined day period. The\n * first rule is applied to the first day period and so on.\n * Fall back to AM/PM when no rules are available.\n *\n * A rule can specify a period as time range, or as a single time value.\n *\n * This functionality is only available when you have loaded the full locale data.\n * See the [\"I18n guide\"](guide/i18n#i18n-pipes).\n *\n * @param locale A locale code for the locale format rules to use.\n * @returns The rules for the locale, a single time value or array of *from-time, to-time*,\n * or null if no periods are available.\n *\n * @see `getLocaleExtraDayPeriods()`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleExtraDayPeriodRules(locale: string): (Time|[Time, Time])[] {\n  const data = ɵfindLocaleData(locale);\n  checkFullData(data);\n  const rules = data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodsRules] || [];\n  return rules.map((rule: string|[string, string]) => {\n    if (typeof rule === 'string') {\n      return extractTime(rule);\n    }\n    return [extractTime(rule[0]), extractTime(rule[1])];\n  });\n}\n\n/**\n * Retrieves locale-specific day periods, which indicate roughly how a day is broken up\n * in different languages.\n * For example, for `en-US`, periods are morning, noon, afternoon, evening, and midnight.\n *\n * This functionality is only available when you have loaded the full locale data.\n * See the [\"I18n guide\"](guide/i18n#i18n-pipes).\n *\n * @param locale A locale code for the locale format rules to use.\n * @param formStyle The required grammatical form.\n * @param width The required character width.\n * @returns The translated day-period strings.\n * @see `getLocaleExtraDayPeriodRules()`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getLocaleExtraDayPeriods(\n    locale: string, formStyle: FormStyle, width: TranslationWidth): string[] {\n  const data = ɵfindLocaleData(locale);\n  checkFullData(data);\n  const dayPeriodsData = <string[][][]>[\n    data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodFormats],\n    data[ɵLocaleDataIndex.ExtraData][ɵExtraLocaleDataIndex.ExtraDayPeriodStandalone]\n  ];\n  const dayPeriods = getLastDefinedValue(dayPeriodsData, formStyle) || [];\n  return getLastDefinedValue(dayPeriods, width) || [];\n}\n\n/**\n * Retrieves the writing direction of a specified locale\n * @param locale A locale code for the locale format rules to use.\n * @publicApi\n * @returns 'rtl' or 'ltr'\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n */\nexport function getLocaleDirection(locale: string): 'ltr'|'rtl' {\n  const data = ɵfindLocaleData(locale);\n  return data[ɵLocaleDataIndex.Directionality];\n}\n\n/**\n * Retrieves the first value that is defined in an array, going backwards from an index position.\n *\n * To avoid repeating the same data (as when the \"format\" and \"standalone\" forms are the same)\n * add the first value to the locale data arrays, and add other values only if they are different.\n *\n * @param data The data array to retrieve from.\n * @param index A 0-based index into the array to start from.\n * @returns The value immediately before the given index position.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nfunction getLastDefinedValue<T>(data: T[], index: number): T {\n  for (let i = index; i > -1; i--) {\n    if (typeof data[i] !== 'undefined') {\n      return data[i];\n    }\n  }\n  throw new Error('Locale data API: locale data undefined');\n}\n\n/**\n * Represents a time value with hours and minutes.\n *\n * @publicApi\n */\nexport type Time = {\n  hours: number,\n  minutes: number\n};\n\n/**\n * Extracts the hours and minutes from a string like \"15:45\"\n */\nfunction extractTime(time: string): Time {\n  const [h, m] = time.split(':');\n  return {hours: +h, minutes: +m};\n}\n\n\n\n/**\n * Retrieves the currency symbol for a given currency code.\n *\n * For example, for the default `en-US` locale, the code `USD` can\n * be represented by the narrow symbol `$` or the wide symbol `US$`.\n *\n * @param code The currency code.\n * @param format The format, `wide` or `narrow`.\n * @param locale A locale code for the locale format rules to use.\n *\n * @returns The symbol, or the currency code if no symbol is available.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getCurrencySymbol(code: string, format: 'wide'|'narrow', locale = 'en'): string {\n  const currency = getLocaleCurrencies(locale)[code] || CURRENCIES_EN[code] || [];\n  const symbolNarrow = currency[ɵCurrencyIndex.SymbolNarrow];\n\n  if (format === 'narrow' && typeof symbolNarrow === 'string') {\n    return symbolNarrow;\n  }\n\n  return currency[ɵCurrencyIndex.Symbol] || code;\n}\n\n// Most currencies have cents, that's why the default is 2\nconst DEFAULT_NB_OF_CURRENCY_DIGITS = 2;\n\n/**\n * Reports the number of decimal digits for a given currency.\n * The value depends upon the presence of cents in that particular currency.\n *\n * @param code The currency code.\n * @returns The number of decimal digits, typically 0 or 2.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function getNumberOfCurrencyDigits(code: string): number {\n  let digits;\n  const currency = CURRENCIES_EN[code];\n  if (currency) {\n    digits = currency[ɵCurrencyIndex.NbOfDigits];\n  }\n  return typeof digits === 'number' ? digits : DEFAULT_NB_OF_CURRENCY_DIGITS;\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\nimport {FormatWidth, FormStyle, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleId, getLocaleMonthNames, getLocaleNumberSymbol, getLocaleTimeFormat, NumberSymbol, Time, TranslationWidth} from './locale_data_api';\n\nexport const ISO8601_DATE_REGEX =\n    /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n//    1        2       3         4          5          6          7          8  9     10      11\nconst NAMED_FORMATS: {[localeId: string]: {[format: string]: string}} = {};\nconst DATE_FORMATS_SPLIT =\n    /((?:[^GyYMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\\s\\S]*)/;\n\nenum ZoneWidth {\n  Short,\n  ShortGMT,\n  Long,\n  Extended\n}\n\nenum DateType {\n  FullYear,\n  Month,\n  Date,\n  Hours,\n  Minutes,\n  Seconds,\n  FractionalSeconds,\n  Day\n}\n\nenum TranslationType {\n  DayPeriods,\n  Days,\n  Months,\n  Eras\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a date according to locale rules.\n *\n * @param value The date to format, as a Date, or a number (milliseconds since UTC epoch)\n * or an [ISO date-time string](https://www.w3.org/TR/NOTE-datetime).\n * @param format The date-time components to include. See `DatePipe` for details.\n * @param locale A locale code for the locale format rules to use.\n * @param timezone The time zone. A time zone offset from GMT (such as `'+0430'`),\n * or a standard UTC/GMT or continental US time zone abbreviation.\n * If not specified, uses host system settings.\n *\n * @returns The formatted date string.\n *\n * @see `DatePipe`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function formatDate(\n    value: string|number|Date, format: string, locale: string, timezone?: string): string {\n  let date = toDate(value);\n  const namedFormat = getNamedFormat(locale, format);\n  format = namedFormat || format;\n\n  let parts: string[] = [];\n  let match;\n  while (format) {\n    match = DATE_FORMATS_SPLIT.exec(format);\n    if (match) {\n      parts = parts.concat(match.slice(1));\n      const part = parts.pop();\n      if (!part) {\n        break;\n      }\n      format = part;\n    } else {\n      parts.push(format);\n      break;\n    }\n  }\n\n  let dateTimezoneOffset = date.getTimezoneOffset();\n  if (timezone) {\n    dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n    date = convertTimezoneToLocal(date, timezone, true);\n  }\n\n  let text = '';\n  parts.forEach(value => {\n    const dateFormatter = getDateFormatter(value);\n    text += dateFormatter ?\n        dateFormatter(date, locale, dateTimezoneOffset) :\n        value === '\\'\\'' ? '\\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n  });\n\n  return text;\n}\n\n/**\n * Create a new Date object with the given date value, and the time set to midnight.\n *\n * We cannot use `new Date(year, month, date)` because it maps years between 0 and 99 to 1900-1999.\n * See: https://github.com/angular/angular/issues/40377\n *\n * Note that this function returns a Date object whose time is midnight in the current locale's\n * timezone. In the future we might want to change this to be midnight in UTC, but this would be a\n * considerable breaking change.\n */\nfunction createDate(year: number, month: number, date: number): Date {\n  // The `newDate` is set to midnight (UTC) on January 1st 1970.\n  // - In PST this will be December 31st 1969 at 4pm.\n  // - In GMT this will be January 1st 1970 at 1am.\n  // Note that they even have different years, dates and months!\n  const newDate = new Date(0);\n\n  // `setFullYear()` allows years like 0001 to be set correctly. This function does not\n  // change the internal time of the date.\n  // Consider calling `setFullYear(2019, 8, 20)` (September 20, 2019).\n  // - In PST this will now be September 20, 2019 at 4pm\n  // - In GMT this will now be September 20, 2019 at 1am\n\n  newDate.setFullYear(year, month, date);\n  // We want the final date to be at local midnight, so we reset the time.\n  // - In PST this will now be September 20, 2019 at 12am\n  // - In GMT this will now be September 20, 2019 at 12am\n  newDate.setHours(0, 0, 0);\n\n  return newDate;\n}\n\nfunction getNamedFormat(locale: string, format: string): string {\n  const localeId = getLocaleId(locale);\n  NAMED_FORMATS[localeId] = NAMED_FORMATS[localeId] || {};\n\n  if (NAMED_FORMATS[localeId][format]) {\n    return NAMED_FORMATS[localeId][format];\n  }\n\n  let formatValue = '';\n  switch (format) {\n    case 'shortDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Short);\n      break;\n    case 'mediumDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Medium);\n      break;\n    case 'longDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Long);\n      break;\n    case 'fullDate':\n      formatValue = getLocaleDateFormat(locale, FormatWidth.Full);\n      break;\n    case 'shortTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Short);\n      break;\n    case 'mediumTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Medium);\n      break;\n    case 'longTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Long);\n      break;\n    case 'fullTime':\n      formatValue = getLocaleTimeFormat(locale, FormatWidth.Full);\n      break;\n    case 'short':\n      const shortTime = getNamedFormat(locale, 'shortTime');\n      const shortDate = getNamedFormat(locale, 'shortDate');\n      formatValue = formatDateTime(\n          getLocaleDateTimeFormat(locale, FormatWidth.Short), [shortTime, shortDate]);\n      break;\n    case 'medium':\n      const mediumTime = getNamedFormat(locale, 'mediumTime');\n      const mediumDate = getNamedFormat(locale, 'mediumDate');\n      formatValue = formatDateTime(\n          getLocaleDateTimeFormat(locale, FormatWidth.Medium), [mediumTime, mediumDate]);\n      break;\n    case 'long':\n      const longTime = getNamedFormat(locale, 'longTime');\n      const longDate = getNamedFormat(locale, 'longDate');\n      formatValue =\n          formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Long), [longTime, longDate]);\n      break;\n    case 'full':\n      const fullTime = getNamedFormat(locale, 'fullTime');\n      const fullDate = getNamedFormat(locale, 'fullDate');\n      formatValue =\n          formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Full), [fullTime, fullDate]);\n      break;\n  }\n  if (formatValue) {\n    NAMED_FORMATS[localeId][format] = formatValue;\n  }\n  return formatValue;\n}\n\nfunction formatDateTime(str: string, opt_values: string[]) {\n  if (opt_values) {\n    str = str.replace(/\\{([^}]+)}/g, function(match, key) {\n      return (opt_values != null && key in opt_values) ? opt_values[key] : match;\n    });\n  }\n  return str;\n}\n\nfunction padNumber(\n    num: number, digits: number, minusSign = '-', trim?: boolean, negWrap?: boolean): string {\n  let neg = '';\n  if (num < 0 || (negWrap && num <= 0)) {\n    if (negWrap) {\n      num = -num + 1;\n    } else {\n      num = -num;\n      neg = minusSign;\n    }\n  }\n  let strNum = String(num);\n  while (strNum.length < digits) {\n    strNum = '0' + strNum;\n  }\n  if (trim) {\n    strNum = strNum.substr(strNum.length - digits);\n  }\n  return neg + strNum;\n}\n\nfunction formatFractionalSeconds(milliseconds: number, digits: number): string {\n  const strMs = padNumber(milliseconds, 3);\n  return strMs.substr(0, digits);\n}\n\n/**\n * Returns a date formatter that transforms a date into its locale digit representation\n */\nfunction dateGetter(\n    name: DateType, size: number, offset: number = 0, trim = false,\n    negWrap = false): DateFormatter {\n  return function(date: Date, locale: string): string {\n    let part = getDatePart(name, date);\n    if (offset > 0 || part > -offset) {\n      part += offset;\n    }\n\n    if (name === DateType.Hours) {\n      if (part === 0 && offset === -12) {\n        part = 12;\n      }\n    } else if (name === DateType.FractionalSeconds) {\n      return formatFractionalSeconds(part, size);\n    }\n\n    const localeMinus = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);\n    return padNumber(part, size, localeMinus, trim, negWrap);\n  };\n}\n\nfunction getDatePart(part: DateType, date: Date): number {\n  switch (part) {\n    case DateType.FullYear:\n      return date.getFullYear();\n    case DateType.Month:\n      return date.getMonth();\n    case DateType.Date:\n      return date.getDate();\n    case DateType.Hours:\n      return date.getHours();\n    case DateType.Minutes:\n      return date.getMinutes();\n    case DateType.Seconds:\n      return date.getSeconds();\n    case DateType.FractionalSeconds:\n      return date.getMilliseconds();\n    case DateType.Day:\n      return date.getDay();\n    default:\n      throw new Error(`Unknown DateType value \"${part}\".`);\n  }\n}\n\n/**\n * Returns a date formatter that transforms a date into its locale string representation\n */\nfunction dateStrGetter(\n    name: TranslationType, width: TranslationWidth, form: FormStyle = FormStyle.Format,\n    extended = false): DateFormatter {\n  return function(date: Date, locale: string): string {\n    return getDateTranslation(date, locale, name, width, form, extended);\n  };\n}\n\n/**\n * Returns the locale translation of a date for a given form, type and width\n */\nfunction getDateTranslation(\n    date: Date, locale: string, name: TranslationType, width: TranslationWidth, form: FormStyle,\n    extended: boolean) {\n  switch (name) {\n    case TranslationType.Months:\n      return getLocaleMonthNames(locale, form, width)[date.getMonth()];\n    case TranslationType.Days:\n      return getLocaleDayNames(locale, form, width)[date.getDay()];\n    case TranslationType.DayPeriods:\n      const currentHours = date.getHours();\n      const currentMinutes = date.getMinutes();\n      if (extended) {\n        const rules = getLocaleExtraDayPeriodRules(locale);\n        const dayPeriods = getLocaleExtraDayPeriods(locale, form, width);\n        const index = rules.findIndex(rule => {\n          if (Array.isArray(rule)) {\n            // morning, afternoon, evening, night\n            const [from, to] = rule;\n            const afterFrom = currentHours >= from.hours && currentMinutes >= from.minutes;\n            const beforeTo =\n                (currentHours < to.hours ||\n                 (currentHours === to.hours && currentMinutes < to.minutes));\n            // We must account for normal rules that span a period during the day (e.g. 6am-9am)\n            // where `from` is less (earlier) than `to`. But also rules that span midnight (e.g.\n            // 10pm - 5am) where `from` is greater (later!) than `to`.\n            //\n            // In the first case the current time must be BOTH after `from` AND before `to`\n            // (e.g. 8am is after 6am AND before 10am).\n            //\n            // In the second case the current time must be EITHER after `from` OR before `to`\n            // (e.g. 4am is before 5am but not after 10pm; and 11pm is not before 5am but it is\n            // after 10pm).\n            if (from.hours < to.hours) {\n              if (afterFrom && beforeTo) {\n                return true;\n              }\n            } else if (afterFrom || beforeTo) {\n              return true;\n            }\n          } else {  // noon or midnight\n            if (rule.hours === currentHours && rule.minutes === currentMinutes) {\n              return true;\n            }\n          }\n          return false;\n        });\n        if (index !== -1) {\n          return dayPeriods[index];\n        }\n      }\n      // if no rules for the day periods, we use am/pm by default\n      return getLocaleDayPeriods(locale, form, <TranslationWidth>width)[currentHours < 12 ? 0 : 1];\n    case TranslationType.Eras:\n      return getLocaleEraNames(locale, <TranslationWidth>width)[date.getFullYear() <= 0 ? 0 : 1];\n    default:\n      // This default case is not needed by TypeScript compiler, as the switch is exhaustive.\n      // However Closure Compiler does not understand that and reports an error in typed mode.\n      // The `throw new Error` below works around the problem, and the unexpected: never variable\n      // makes sure tsc still checks this code is unreachable.\n      const unexpected: never = name;\n      throw new Error(`unexpected translation type ${unexpected}`);\n  }\n}\n\n/**\n * Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or\n * GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30,\n * extended = +04:30)\n */\nfunction timeZoneGetter(width: ZoneWidth): DateFormatter {\n  return function(date: Date, locale: string, offset: number) {\n    const zone = -1 * offset;\n    const minusSign = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);\n    const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);\n    switch (width) {\n      case ZoneWidth.Short:\n        return ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) +\n            padNumber(Math.abs(zone % 60), 2, minusSign);\n      case ZoneWidth.ShortGMT:\n        return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 1, minusSign);\n      case ZoneWidth.Long:\n        return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) + ':' +\n            padNumber(Math.abs(zone % 60), 2, minusSign);\n      case ZoneWidth.Extended:\n        if (offset === 0) {\n          return 'Z';\n        } else {\n          return ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) + ':' +\n              padNumber(Math.abs(zone % 60), 2, minusSign);\n        }\n      default:\n        throw new Error(`Unknown zone width \"${width}\"`);\n    }\n  };\n}\n\nconst JANUARY = 0;\nconst THURSDAY = 4;\nfunction getFirstThursdayOfYear(year: number) {\n  const firstDayOfYear = createDate(year, JANUARY, 1).getDay();\n  return createDate(\n      year, 0, 1 + ((firstDayOfYear <= THURSDAY) ? THURSDAY : THURSDAY + 7) - firstDayOfYear);\n}\n\nfunction getThursdayThisWeek(datetime: Date) {\n  return createDate(\n      datetime.getFullYear(), datetime.getMonth(),\n      datetime.getDate() + (THURSDAY - datetime.getDay()));\n}\n\nfunction weekGetter(size: number, monthBased = false): DateFormatter {\n  return function(date: Date, locale: string) {\n    let result;\n    if (monthBased) {\n      const nbDaysBefore1stDayOfMonth =\n          new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;\n      const today = date.getDate();\n      result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);\n    } else {\n      const thisThurs = getThursdayThisWeek(date);\n      // Some days of a year are part of next year according to ISO 8601.\n      // Compute the firstThurs from the year of this week's Thursday\n      const firstThurs = getFirstThursdayOfYear(thisThurs.getFullYear());\n      const diff = thisThurs.getTime() - firstThurs.getTime();\n      result = 1 + Math.round(diff / 6.048e8);  // 6.048e8 ms per week\n    }\n\n    return padNumber(result, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  };\n}\n\n/**\n * Returns a date formatter that provides the week-numbering year for the input date.\n */\nfunction weekNumberingYearGetter(size: number, trim = false): DateFormatter {\n  return function(date: Date, locale: string) {\n    const thisThurs = getThursdayThisWeek(date);\n    const weekNumberingYear = thisThurs.getFullYear();\n    return padNumber(\n        weekNumberingYear, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign), trim);\n  };\n}\n\ntype DateFormatter = (date: Date, locale: string, offset: number) => string;\n\nconst DATE_FORMATS: {[format: string]: DateFormatter} = {};\n\n// Based on CLDR formats:\n// See complete list: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n// See also explanations: http://cldr.unicode.org/translation/date-time\n// TODO(ocombe): support all missing cldr formats: Y, U, Q, D, F, e, c, j, J, C, A, v, V, X, x\nfunction getDateFormatter(format: string): DateFormatter|null {\n  if (DATE_FORMATS[format]) {\n    return DATE_FORMATS[format];\n  }\n  let formatter;\n  switch (format) {\n    // Era name (AD/BC)\n    case 'G':\n    case 'GG':\n    case 'GGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Abbreviated);\n      break;\n    case 'GGGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Wide);\n      break;\n    case 'GGGGG':\n      formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Narrow);\n      break;\n\n    // 1 digit representation of the year, e.g. (AD 1 => 1, AD 199 => 199)\n    case 'y':\n      formatter = dateGetter(DateType.FullYear, 1, 0, false, true);\n      break;\n    // 2 digit representation of the year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n    case 'yy':\n      formatter = dateGetter(DateType.FullYear, 2, 0, true, true);\n      break;\n    // 3 digit representation of the year, padded (000-999). (e.g. AD 2001 => 01, AD 2010 => 10)\n    case 'yyy':\n      formatter = dateGetter(DateType.FullYear, 3, 0, false, true);\n      break;\n    // 4 digit representation of the year (e.g. AD 1 => 0001, AD 2010 => 2010)\n    case 'yyyy':\n      formatter = dateGetter(DateType.FullYear, 4, 0, false, true);\n      break;\n\n    // 1 digit representation of the week-numbering year, e.g. (AD 1 => 1, AD 199 => 199)\n    case 'Y':\n      formatter = weekNumberingYearGetter(1);\n      break;\n    // 2 digit representation of the week-numbering year, padded (00-99). (e.g. AD 2001 => 01, AD\n    // 2010 => 10)\n    case 'YY':\n      formatter = weekNumberingYearGetter(2, true);\n      break;\n    // 3 digit representation of the week-numbering year, padded (000-999). (e.g. AD 1 => 001, AD\n    // 2010 => 2010)\n    case 'YYY':\n      formatter = weekNumberingYearGetter(3);\n      break;\n    // 4 digit representation of the week-numbering year (e.g. AD 1 => 0001, AD 2010 => 2010)\n    case 'YYYY':\n      formatter = weekNumberingYearGetter(4);\n      break;\n\n    // Month of the year (1-12), numeric\n    case 'M':\n    case 'L':\n      formatter = dateGetter(DateType.Month, 1, 1);\n      break;\n    case 'MM':\n    case 'LL':\n      formatter = dateGetter(DateType.Month, 2, 1);\n      break;\n\n    // Month of the year (January, ...), string, format\n    case 'MMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Abbreviated);\n      break;\n    case 'MMMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Wide);\n      break;\n    case 'MMMMM':\n      formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Narrow);\n      break;\n\n    // Month of the year (January, ...), string, standalone\n    case 'LLL':\n      formatter =\n          dateStrGetter(TranslationType.Months, TranslationWidth.Abbreviated, FormStyle.Standalone);\n      break;\n    case 'LLLL':\n      formatter =\n          dateStrGetter(TranslationType.Months, TranslationWidth.Wide, FormStyle.Standalone);\n      break;\n    case 'LLLLL':\n      formatter =\n          dateStrGetter(TranslationType.Months, TranslationWidth.Narrow, FormStyle.Standalone);\n      break;\n\n    // Week of the year (1, ... 52)\n    case 'w':\n      formatter = weekGetter(1);\n      break;\n    case 'ww':\n      formatter = weekGetter(2);\n      break;\n\n    // Week of the month (1, ...)\n    case 'W':\n      formatter = weekGetter(1, true);\n      break;\n\n    // Day of the month (1-31)\n    case 'd':\n      formatter = dateGetter(DateType.Date, 1);\n      break;\n    case 'dd':\n      formatter = dateGetter(DateType.Date, 2);\n      break;\n\n    // Day of the Week\n    case 'E':\n    case 'EE':\n    case 'EEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Abbreviated);\n      break;\n    case 'EEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Wide);\n      break;\n    case 'EEEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Narrow);\n      break;\n    case 'EEEEEE':\n      formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Short);\n      break;\n\n    // Generic period of the day (am-pm)\n    case 'a':\n    case 'aa':\n    case 'aaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Abbreviated);\n      break;\n    case 'aaaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide);\n      break;\n    case 'aaaaa':\n      formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Narrow);\n      break;\n\n    // Extended period of the day (midnight, at night, ...), standalone\n    case 'b':\n    case 'bb':\n    case 'bbb':\n      formatter = dateStrGetter(\n          TranslationType.DayPeriods, TranslationWidth.Abbreviated, FormStyle.Standalone, true);\n      break;\n    case 'bbbb':\n      formatter = dateStrGetter(\n          TranslationType.DayPeriods, TranslationWidth.Wide, FormStyle.Standalone, true);\n      break;\n    case 'bbbbb':\n      formatter = dateStrGetter(\n          TranslationType.DayPeriods, TranslationWidth.Narrow, FormStyle.Standalone, true);\n      break;\n\n    // Extended period of the day (midnight, night, ...), standalone\n    case 'B':\n    case 'BB':\n    case 'BBB':\n      formatter = dateStrGetter(\n          TranslationType.DayPeriods, TranslationWidth.Abbreviated, FormStyle.Format, true);\n      break;\n    case 'BBBB':\n      formatter =\n          dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide, FormStyle.Format, true);\n      break;\n    case 'BBBBB':\n      formatter = dateStrGetter(\n          TranslationType.DayPeriods, TranslationWidth.Narrow, FormStyle.Format, true);\n      break;\n\n    // Hour in AM/PM, (1-12)\n    case 'h':\n      formatter = dateGetter(DateType.Hours, 1, -12);\n      break;\n    case 'hh':\n      formatter = dateGetter(DateType.Hours, 2, -12);\n      break;\n\n    // Hour of the day (0-23)\n    case 'H':\n      formatter = dateGetter(DateType.Hours, 1);\n      break;\n    // Hour in day, padded (00-23)\n    case 'HH':\n      formatter = dateGetter(DateType.Hours, 2);\n      break;\n\n    // Minute of the hour (0-59)\n    case 'm':\n      formatter = dateGetter(DateType.Minutes, 1);\n      break;\n    case 'mm':\n      formatter = dateGetter(DateType.Minutes, 2);\n      break;\n\n    // Second of the minute (0-59)\n    case 's':\n      formatter = dateGetter(DateType.Seconds, 1);\n      break;\n    case 'ss':\n      formatter = dateGetter(DateType.Seconds, 2);\n      break;\n\n    // Fractional second\n    case 'S':\n      formatter = dateGetter(DateType.FractionalSeconds, 1);\n      break;\n    case 'SS':\n      formatter = dateGetter(DateType.FractionalSeconds, 2);\n      break;\n    case 'SSS':\n      formatter = dateGetter(DateType.FractionalSeconds, 3);\n      break;\n\n\n    // Timezone ISO8601 short format (-0430)\n    case 'Z':\n    case 'ZZ':\n    case 'ZZZ':\n      formatter = timeZoneGetter(ZoneWidth.Short);\n      break;\n    // Timezone ISO8601 extended format (-04:30)\n    case 'ZZZZZ':\n      formatter = timeZoneGetter(ZoneWidth.Extended);\n      break;\n\n    // Timezone GMT short format (GMT+4)\n    case 'O':\n    case 'OO':\n    case 'OOO':\n    // Should be location, but fallback to format O instead because we don't have the data yet\n    case 'z':\n    case 'zz':\n    case 'zzz':\n      formatter = timeZoneGetter(ZoneWidth.ShortGMT);\n      break;\n    // Timezone GMT long format (GMT+0430)\n    case 'OOOO':\n    case 'ZZZZ':\n    // Should be location, but fallback to format O instead because we don't have the data yet\n    case 'zzzz':\n      formatter = timeZoneGetter(ZoneWidth.Long);\n      break;\n    default:\n      return null;\n  }\n  DATE_FORMATS[format] = formatter;\n  return formatter;\n}\n\nfunction timezoneToOffset(timezone: string, fallback: number): number {\n  // Support: IE 11 only, Edge 13-15+\n  // IE/Edge do not \"understand\" colon (`:`) in timezone\n  timezone = timezone.replace(/:/g, '');\n  const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n  return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n}\n\nfunction addDateMinutes(date: Date, minutes: number) {\n  date = new Date(date.getTime());\n  date.setMinutes(date.getMinutes() + minutes);\n  return date;\n}\n\nfunction convertTimezoneToLocal(date: Date, timezone: string, reverse: boolean): Date {\n  const reverseValue = reverse ? -1 : 1;\n  const dateTimezoneOffset = date.getTimezoneOffset();\n  const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n  return addDateMinutes(date, reverseValue * (timezoneOffset - dateTimezoneOffset));\n}\n\n/**\n * Converts a value to date.\n *\n * Supported input formats:\n * - `Date`\n * - number: timestamp\n * - string: numeric (e.g. \"1234\"), ISO and date strings in a format supported by\n *   [Date.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\n *   Note: ISO strings without time return a date without timeoffset.\n *\n * Throws if unable to convert to a date.\n */\nexport function toDate(value: string|number|Date): Date {\n  if (isDate(value)) {\n    return value;\n  }\n\n  if (typeof value === 'number' && !isNaN(value)) {\n    return new Date(value);\n  }\n\n  if (typeof value === 'string') {\n    value = value.trim();\n\n    if (/^(\\d{4}(-\\d{1,2}(-\\d{1,2})?)?)$/.test(value)) {\n      /* For ISO Strings without time the day, month and year must be extracted from the ISO String\n      before Date creation to avoid time offset and errors in the new Date.\n      If we only replace '-' with ',' in the ISO String (\"2015,01,01\"), and try to create a new\n      date, some browsers (e.g. IE 9) will throw an invalid Date error.\n      If we leave the '-' (\"2015-01-01\") and try to create a new Date(\"2015-01-01\") the timeoffset\n      is applied.\n      Note: ISO months are 0 for January, 1 for February, ... */\n      const [y, m = 1, d = 1] = value.split('-').map((val: string) => +val);\n      return createDate(y, m - 1, d);\n    }\n\n    const parsedNb = parseFloat(value);\n\n    // any string that only contains numbers, like \"1234\" but not like \"1234hello\"\n    if (!isNaN(value as any - parsedNb)) {\n      return new Date(parsedNb);\n    }\n\n    let match: RegExpMatchArray|null;\n    if (match = value.match(ISO8601_DATE_REGEX)) {\n      return isoStringToDate(match);\n    }\n  }\n\n  const date = new Date(value as any);\n  if (!isDate(date)) {\n    throw new Error(`Unable to convert \"${value}\" into a date`);\n  }\n  return date;\n}\n\n/**\n * Converts a date in ISO8601 to a Date.\n * Used instead of `Date.parse` because of browser discrepancies.\n */\nexport function isoStringToDate(match: RegExpMatchArray): Date {\n  const date = new Date(0);\n  let tzHour = 0;\n  let tzMin = 0;\n\n  // match[8] means that the string contains \"Z\" (UTC) or a timezone like \"+01:00\" or \"+0100\"\n  const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;\n  const timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n  // if there is a timezone defined like \"+01:00\" or \"+0100\"\n  if (match[9]) {\n    tzHour = Number(match[9] + match[10]);\n    tzMin = Number(match[9] + match[11]);\n  }\n  dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));\n  const h = Number(match[4] || 0) - tzHour;\n  const m = Number(match[5] || 0) - tzMin;\n  const s = Number(match[6] || 0);\n  // The ECMAScript specification (https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.11)\n  // defines that `DateTime` milliseconds should always be rounded down, so that `999.9ms`\n  // becomes `999ms`.\n  const ms = Math.floor(parseFloat('0.' + (match[7] || 0)) * 1000);\n  timeSetter.call(date, h, m, s, ms);\n  return date;\n}\n\nexport function isDate(value: any): value is Date {\n  return value instanceof Date && !isNaN(value.valueOf());\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\nimport {getLocaleNumberFormat, getLocaleNumberSymbol, getNumberOfCurrencyDigits, NumberFormatStyle, NumberSymbol} from './locale_data_api';\n\nexport const NUMBER_FORMAT_REGEXP = /^(\\d+)?\\.((\\d+)(-(\\d+))?)?$/;\nconst MAX_DIGITS = 22;\nconst DECIMAL_SEP = '.';\nconst ZERO_CHAR = '0';\nconst PATTERN_SEP = ';';\nconst GROUP_SEP = ',';\nconst DIGIT_CHAR = '#';\nconst CURRENCY_CHAR = '¤';\nconst PERCENT_CHAR = '%';\n\n/**\n * Transforms a number to a locale string based on a style and a format.\n */\nfunction formatNumberToLocaleString(\n    value: number, pattern: ParsedNumberFormat, locale: string, groupSymbol: NumberSymbol,\n    decimalSymbol: NumberSymbol, digitsInfo?: string, isPercent = false): string {\n  let formattedText = '';\n  let isZero = false;\n\n  if (!isFinite(value)) {\n    formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity);\n  } else {\n    let parsedNumber = parseNumber(value);\n\n    if (isPercent) {\n      parsedNumber = toPercent(parsedNumber);\n    }\n\n    let minInt = pattern.minInt;\n    let minFraction = pattern.minFrac;\n    let maxFraction = pattern.maxFrac;\n\n    if (digitsInfo) {\n      const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);\n      if (parts === null) {\n        throw new Error(`${digitsInfo} is not a valid digit info`);\n      }\n      const minIntPart = parts[1];\n      const minFractionPart = parts[3];\n      const maxFractionPart = parts[5];\n      if (minIntPart != null) {\n        minInt = parseIntAutoRadix(minIntPart);\n      }\n      if (minFractionPart != null) {\n        minFraction = parseIntAutoRadix(minFractionPart);\n      }\n      if (maxFractionPart != null) {\n        maxFraction = parseIntAutoRadix(maxFractionPart);\n      } else if (minFractionPart != null && minFraction > maxFraction) {\n        maxFraction = minFraction;\n      }\n    }\n\n    roundNumber(parsedNumber, minFraction, maxFraction);\n\n    let digits = parsedNumber.digits;\n    let integerLen = parsedNumber.integerLen;\n    const exponent = parsedNumber.exponent;\n    let decimals = [];\n    isZero = digits.every(d => !d);\n\n    // pad zeros for small numbers\n    for (; integerLen < minInt; integerLen++) {\n      digits.unshift(0);\n    }\n\n    // pad zeros for small numbers\n    for (; integerLen < 0; integerLen++) {\n      digits.unshift(0);\n    }\n\n    // extract decimals digits\n    if (integerLen > 0) {\n      decimals = digits.splice(integerLen, digits.length);\n    } else {\n      decimals = digits;\n      digits = [0];\n    }\n\n    // format the integer digits with grouping separators\n    const groups = [];\n    if (digits.length >= pattern.lgSize) {\n      groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));\n    }\n\n    while (digits.length > pattern.gSize) {\n      groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));\n    }\n\n    if (digits.length) {\n      groups.unshift(digits.join(''));\n    }\n\n    formattedText = groups.join(getLocaleNumberSymbol(locale, groupSymbol));\n\n    // append the decimal digits\n    if (decimals.length) {\n      formattedText += getLocaleNumberSymbol(locale, decimalSymbol) + decimals.join('');\n    }\n\n    if (exponent) {\n      formattedText += getLocaleNumberSymbol(locale, NumberSymbol.Exponential) + '+' + exponent;\n    }\n  }\n\n  if (value < 0 && !isZero) {\n    formattedText = pattern.negPre + formattedText + pattern.negSuf;\n  } else {\n    formattedText = pattern.posPre + formattedText + pattern.posSuf;\n  }\n\n  return formattedText;\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as currency using locale rules.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param currency A string containing the currency symbol or its name,\n * such as \"$\" or \"Canadian Dollar\". Used in output string, but does not affect the operation\n * of the function.\n * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)\n * currency code, such as `USD` for the US dollar and `EUR` for the euro.\n * Used to determine the number of digits in the decimal part.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted currency value.\n *\n * @see `formatNumber()`\n * @see `DecimalPipe`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function formatCurrency(\n    value: number, locale: string, currency: string, currencyCode?: string,\n    digitsInfo?: string): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Currency);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n\n  pattern.minFrac = getNumberOfCurrencyDigits(currencyCode!);\n  pattern.maxFrac = pattern.minFrac;\n\n  const res = formatNumberToLocaleString(\n      value, pattern, locale, NumberSymbol.CurrencyGroup, NumberSymbol.CurrencyDecimal, digitsInfo);\n  return res\n      .replace(CURRENCY_CHAR, currency)\n      // if we have 2 time the currency character, the second one is ignored\n      .replace(CURRENCY_CHAR, '')\n      // If there is a spacing between currency character and the value and\n      // the currency character is supressed by passing an empty string, the\n      // spacing character would remain as part of the string. Then we\n      // should remove it.\n      .trim();\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as a percentage according to locale rules.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted percentage value.\n *\n * @see `formatNumber()`\n * @see `DecimalPipe`\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n * @publicApi\n *\n */\nexport function formatPercent(value: number, locale: string, digitsInfo?: string): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Percent);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  const res = formatNumberToLocaleString(\n      value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo, true);\n  return res.replace(\n      new RegExp(PERCENT_CHAR, 'g'), getLocaleNumberSymbol(locale, NumberSymbol.PercentSign));\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as text, with group sizing, separator, and other\n * parameters based on the locale.\n *\n * @param value The number to format.\n * @param locale A locale code for the locale format rules to use.\n * @param digitsInfo Decimal representation options, specified by a string in the following format:\n * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.\n *\n * @returns The formatted text string.\n * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)\n *\n * @publicApi\n */\nexport function formatNumber(value: number, locale: string, digitsInfo?: string): string {\n  const format = getLocaleNumberFormat(locale, NumberFormatStyle.Decimal);\n  const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));\n  return formatNumberToLocaleString(\n      value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo);\n}\n\ninterface ParsedNumberFormat {\n  minInt: number;\n  // the minimum number of digits required in the fraction part of the number\n  minFrac: number;\n  // the maximum number of digits required in the fraction part of the number\n  maxFrac: number;\n  // the prefix for a positive number\n  posPre: string;\n  // the suffix for a positive number\n  posSuf: string;\n  // the prefix for a negative number (e.g. `-` or `(`))\n  negPre: string;\n  // the suffix for a negative number (e.g. `)`)\n  negSuf: string;\n  // number of digits in each group of separated digits\n  gSize: number;\n  // number of digits in the last group of digits before the decimal separator\n  lgSize: number;\n}\n\nfunction parseNumberFormat(format: string, minusSign = '-'): ParsedNumberFormat {\n  const p = {\n    minInt: 1,\n    minFrac: 0,\n    maxFrac: 0,\n    posPre: '',\n    posSuf: '',\n    negPre: '',\n    negSuf: '',\n    gSize: 0,\n    lgSize: 0\n  };\n\n  const patternParts = format.split(PATTERN_SEP);\n  const positive = patternParts[0];\n  const negative = patternParts[1];\n\n  const positiveParts = positive.indexOf(DECIMAL_SEP) !== -1 ?\n      positive.split(DECIMAL_SEP) :\n      [\n        positive.substring(0, positive.lastIndexOf(ZERO_CHAR) + 1),\n        positive.substring(positive.lastIndexOf(ZERO_CHAR) + 1)\n      ],\n        integer = positiveParts[0], fraction = positiveParts[1] || '';\n\n  p.posPre = integer.substr(0, integer.indexOf(DIGIT_CHAR));\n\n  for (let i = 0; i < fraction.length; i++) {\n    const ch = fraction.charAt(i);\n    if (ch === ZERO_CHAR) {\n      p.minFrac = p.maxFrac = i + 1;\n    } else if (ch === DIGIT_CHAR) {\n      p.maxFrac = i + 1;\n    } else {\n      p.posSuf += ch;\n    }\n  }\n\n  const groups = integer.split(GROUP_SEP);\n  p.gSize = groups[1] ? groups[1].length : 0;\n  p.lgSize = (groups[2] || groups[1]) ? (groups[2] || groups[1]).length : 0;\n\n  if (negative) {\n    const trunkLen = positive.length - p.posPre.length - p.posSuf.length,\n          pos = negative.indexOf(DIGIT_CHAR);\n\n    p.negPre = negative.substr(0, pos).replace(/'/g, '');\n    p.negSuf = negative.substr(pos + trunkLen).replace(/'/g, '');\n  } else {\n    p.negPre = minusSign + p.posPre;\n    p.negSuf = p.posSuf;\n  }\n\n  return p;\n}\n\ninterface ParsedNumber {\n  // an array of digits containing leading zeros as necessary\n  digits: number[];\n  // the exponent for numbers that would need more than `MAX_DIGITS` digits in `d`\n  exponent: number;\n  // the number of the digits in `d` that are to the left of the decimal point\n  integerLen: number;\n}\n\n// Transforms a parsed number into a percentage by multiplying it by 100\nfunction toPercent(parsedNumber: ParsedNumber): ParsedNumber {\n  // if the number is 0, don't do anything\n  if (parsedNumber.digits[0] === 0) {\n    return parsedNumber;\n  }\n\n  // Getting the current number of decimals\n  const fractionLen = parsedNumber.digits.length - parsedNumber.integerLen;\n  if (parsedNumber.exponent) {\n    parsedNumber.exponent += 2;\n  } else {\n    if (fractionLen === 0) {\n      parsedNumber.digits.push(0, 0);\n    } else if (fractionLen === 1) {\n      parsedNumber.digits.push(0);\n    }\n    parsedNumber.integerLen += 2;\n  }\n\n  return parsedNumber;\n}\n\n/**\n * Parses a number.\n * Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/\n */\nfunction parseNumber(num: number): ParsedNumber {\n  let numStr = Math.abs(num) + '';\n  let exponent = 0, digits, integerLen;\n  let i, j, zeros;\n\n  // Decimal point?\n  if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {\n    numStr = numStr.replace(DECIMAL_SEP, '');\n  }\n\n  // Exponential form?\n  if ((i = numStr.search(/e/i)) > 0) {\n    // Work out the exponent.\n    if (integerLen < 0) integerLen = i;\n    integerLen += +numStr.slice(i + 1);\n    numStr = numStr.substring(0, i);\n  } else if (integerLen < 0) {\n    // There was no decimal point or exponent so it is an integer.\n    integerLen = numStr.length;\n  }\n\n  // Count the number of leading zeros.\n  for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) { /* empty */\n  }\n\n  if (i === (zeros = numStr.length)) {\n    // The digits are all zero.\n    digits = [0];\n    integerLen = 1;\n  } else {\n    // Count the number of trailing zeros\n    zeros--;\n    while (numStr.charAt(zeros) === ZERO_CHAR) zeros--;\n\n    // Trailing zeros are insignificant so ignore them\n    integerLen -= i;\n    digits = [];\n    // Convert string to array of digits without leading/trailing zeros.\n    for (j = 0; i <= zeros; i++, j++) {\n      digits[j] = Number(numStr.charAt(i));\n    }\n  }\n\n  // If the number overflows the maximum allowed digits then use an exponent.\n  if (integerLen > MAX_DIGITS) {\n    digits = digits.splice(0, MAX_DIGITS - 1);\n    exponent = integerLen - 1;\n    integerLen = 1;\n  }\n\n  return {digits, exponent, integerLen};\n}\n\n/**\n * Round the parsed number to the specified number of decimal places\n * This function changes the parsedNumber in-place\n */\nfunction roundNumber(parsedNumber: ParsedNumber, minFrac: number, maxFrac: number) {\n  if (minFrac > maxFrac) {\n    throw new Error(`The minimum number of digits after fraction (${\n        minFrac}) is higher than the maximum (${maxFrac}).`);\n  }\n\n  let digits = parsedNumber.digits;\n  let fractionLen = digits.length - parsedNumber.integerLen;\n  const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);\n\n  // The index of the digit to where rounding is to occur\n  let roundAt = fractionSize + parsedNumber.integerLen;\n  let digit = digits[roundAt];\n\n  if (roundAt > 0) {\n    // Drop fractional digits beyond `roundAt`\n    digits.splice(Math.max(parsedNumber.integerLen, roundAt));\n\n    // Set non-fractional digits beyond `roundAt` to 0\n    for (let j = roundAt; j < digits.length; j++) {\n      digits[j] = 0;\n    }\n  } else {\n    // We rounded to zero so reset the parsedNumber\n    fractionLen = Math.max(0, fractionLen);\n    parsedNumber.integerLen = 1;\n    digits.length = Math.max(1, roundAt = fractionSize + 1);\n    digits[0] = 0;\n    for (let i = 1; i < roundAt; i++) digits[i] = 0;\n  }\n\n  if (digit >= 5) {\n    if (roundAt - 1 < 0) {\n      for (let k = 0; k > roundAt; k--) {\n        digits.unshift(0);\n        parsedNumber.integerLen++;\n      }\n      digits.unshift(1);\n      parsedNumber.integerLen++;\n    } else {\n      digits[roundAt - 1]++;\n    }\n  }\n\n  // Pad out with zeros to get the required fraction length\n  for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);\n\n  let dropTrailingZeros = fractionSize !== 0;\n  // Minimal length = nb of decimals required + current nb of integers\n  // Any number besides that is optional and can be removed if it's a trailing 0\n  const minLen = minFrac + parsedNumber.integerLen;\n  // Do any carrying, e.g. a digit was rounded up to 10\n  const carry = digits.reduceRight(function(carry, d, i, digits) {\n    d = d + carry;\n    digits[i] = d < 10 ? d : d - 10;  // d % 10\n    if (dropTrailingZeros) {\n      // Do not keep meaningless fractional trailing zeros (e.g. 15.52000 --> 15.52)\n      if (digits[i] === 0 && i >= minLen) {\n        digits.pop();\n      } else {\n        dropTrailingZeros = false;\n      }\n    }\n    return d >= 10 ? 1 : 0;  // Math.floor(d / 10);\n  }, 0);\n  if (carry) {\n    digits.unshift(carry);\n    parsedNumber.integerLen++;\n  }\n}\n\nexport function parseIntAutoRadix(text: string): number {\n  const result: number = parseInt(text);\n  if (isNaN(result)) {\n    throw new Error('Invalid integer literal when parsing ' + text);\n  }\n  return result;\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\nimport {Inject, Injectable, LOCALE_ID} from '@angular/core';\n\nimport {getLocalePluralCase, Plural} from './locale_data_api';\n\n\n/**\n * @publicApi\n */\nexport abstract class NgLocalization {\n  abstract getPluralCategory(value: any, locale?: string): string;\n}\n\n\n/**\n * Returns the plural category for a given value.\n * - \"=value\" when the case exists,\n * - the plural category otherwise\n */\nexport function getPluralCategory(\n    value: number, cases: string[], ngLocalization: NgLocalization, locale?: string): string {\n  let key = `=${value}`;\n\n  if (cases.indexOf(key) > -1) {\n    return key;\n  }\n\n  key = ngLocalization.getPluralCategory(value, locale);\n\n  if (cases.indexOf(key) > -1) {\n    return key;\n  }\n\n  if (cases.indexOf('other') > -1) {\n    return 'other';\n  }\n\n  throw new Error(`No plural message found for value \"${value}\"`);\n}\n\n/**\n * Returns the plural case based on the locale\n *\n * @publicApi\n */\n@Injectable()\nexport class NgLocaleLocalization extends NgLocalization {\n  constructor(@Inject(LOCALE_ID) protected locale: string) {\n    super();\n  }\n\n  getPluralCategory(value: any, locale?: string): string {\n    const plural = getLocalePluralCase(locale || this.locale)(value);\n\n    switch (plural) {\n      case Plural.Zero:\n        return 'zero';\n      case Plural.One:\n        return 'one';\n      case Plural.Two:\n        return 'two';\n      case Plural.Few:\n        return 'few';\n      case Plural.Many:\n        return 'many';\n      default:\n        return 'other';\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\nimport {ɵregisterLocaleData} from '@angular/core';\n\n/**\n * Register global data to be used internally by Angular. See the\n * [\"I18n guide\"](guide/i18n#i18n-pipes) to know how to import additional locale data.\n *\n * The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1\n *\n * @publicApi\n */\nexport function registerLocaleData(data: any, localeId?: string|any, extraData?: any): void {\n  return ɵregisterLocaleData(data, localeId, extraData);\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\nexport function parseCookieValue(cookieStr: string, name: string): string|null {\n  name = encodeURIComponent(name);\n  for (const cookie of cookieStr.split(';')) {\n    const eqIndex = cookie.indexOf('=');\n    const [cookieName, cookieValue]: string[] =\n        eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];\n    if (cookieName.trim() === name) {\n      return decodeURIComponent(cookieValue);\n    }\n  }\n  return null;\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 */\nimport {Directive, DoCheck, ElementRef, Input, IterableChanges, IterableDiffer, IterableDiffers, KeyValueChanges, KeyValueDiffer, KeyValueDiffers, Renderer2, ɵisListLikeIterable as isListLikeIterable, ɵstringify as stringify} from '@angular/core';\n\ntype NgClassSupportedTypes = string[]|Set<string>|{[klass: string]: any}|null|undefined;\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n * ```\n *     <some-element [ngClass]=\"'first second'\">...</some-element>\n *\n *     <some-element [ngClass]=\"['first', 'second']\">...</some-element>\n *\n *     <some-element [ngClass]=\"{'first': true, 'second': true, 'third': false}\">...</some-element>\n *\n *     <some-element [ngClass]=\"stringExp|arrayExp|objExp\">...</some-element>\n *\n *     <some-element [ngClass]=\"{'class1 class2 class3' : true}\">...</some-element>\n * ```\n *\n * @description\n *\n * Adds and removes CSS classes on an HTML element.\n *\n * The CSS classes are updated as follows, depending on the type of the expression evaluation:\n * - `string` - the CSS classes listed in the string (space delimited) are added,\n * - `Array` - the CSS classes declared as Array elements are added,\n * - `Object` - keys are CSS classes that get added when the expression given in the value\n *              evaluates to a truthy value, otherwise they are removed.\n *\n * @publicApi\n */\n@Directive({selector: '[ngClass]'})\nexport class NgClass implements DoCheck {\n  private _iterableDiffer: IterableDiffer<string>|null = null;\n  private _keyValueDiffer: KeyValueDiffer<string, any>|null = null;\n  private _initialClasses: string[] = [];\n  private _rawClass: NgClassSupportedTypes = null;\n\n  constructor(\n      private _iterableDiffers: IterableDiffers, private _keyValueDiffers: KeyValueDiffers,\n      private _ngEl: ElementRef, private _renderer: Renderer2) {}\n\n\n  @Input('class')\n  set klass(value: string) {\n    this._removeClasses(this._initialClasses);\n    this._initialClasses = typeof value === 'string' ? value.split(/\\s+/) : [];\n    this._applyClasses(this._initialClasses);\n    this._applyClasses(this._rawClass);\n  }\n\n  @Input('ngClass')\n  set ngClass(value: string|string[]|Set<string>|{[klass: string]: any}) {\n    this._removeClasses(this._rawClass);\n    this._applyClasses(this._initialClasses);\n\n    this._iterableDiffer = null;\n    this._keyValueDiffer = null;\n\n    this._rawClass = typeof value === 'string' ? value.split(/\\s+/) : value;\n\n    if (this._rawClass) {\n      if (isListLikeIterable(this._rawClass)) {\n        this._iterableDiffer = this._iterableDiffers.find(this._rawClass).create();\n      } else {\n        this._keyValueDiffer = this._keyValueDiffers.find(this._rawClass).create();\n      }\n    }\n  }\n\n  ngDoCheck() {\n    if (this._iterableDiffer) {\n      const iterableChanges = this._iterableDiffer.diff(this._rawClass as string[]);\n      if (iterableChanges) {\n        this._applyIterableChanges(iterableChanges);\n      }\n    } else if (this._keyValueDiffer) {\n      const keyValueChanges = this._keyValueDiffer.diff(this._rawClass as {[k: string]: any});\n      if (keyValueChanges) {\n        this._applyKeyValueChanges(keyValueChanges);\n      }\n    }\n  }\n\n  private _applyKeyValueChanges(changes: KeyValueChanges<string, any>): void {\n    changes.forEachAddedItem((record) => this._toggleClass(record.key, record.currentValue));\n    changes.forEachChangedItem((record) => this._toggleClass(record.key, record.currentValue));\n    changes.forEachRemovedItem((record) => {\n      if (record.previousValue) {\n        this._toggleClass(record.key, false);\n      }\n    });\n  }\n\n  private _applyIterableChanges(changes: IterableChanges<string>): void {\n    changes.forEachAddedItem((record) => {\n      if (typeof record.item === 'string') {\n        this._toggleClass(record.item, true);\n      } else {\n        throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${\n            stringify(record.item)}`);\n      }\n    });\n\n    changes.forEachRemovedItem((record) => this._toggleClass(record.item, false));\n  }\n\n  /**\n   * Applies a collection of CSS classes to the DOM element.\n   *\n   * For argument of type Set and Array CSS class names contained in those collections are always\n   * added.\n   * For argument of type Map CSS class name in the map's key is toggled based on the value (added\n   * for truthy and removed for falsy).\n   */\n  private _applyClasses(rawClassVal: NgClassSupportedTypes) {\n    if (rawClassVal) {\n      if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {\n        (<any>rawClassVal).forEach((klass: string) => this._toggleClass(klass, true));\n      } else {\n        Object.keys(rawClassVal).forEach(klass => this._toggleClass(klass, !!rawClassVal[klass]));\n      }\n    }\n  }\n\n  /**\n   * Removes a collection of CSS classes from the DOM element. This is mostly useful for cleanup\n   * purposes.\n   */\n  private _removeClasses(rawClassVal: NgClassSupportedTypes) {\n    if (rawClassVal) {\n      if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {\n        (<any>rawClassVal).forEach((klass: string) => this._toggleClass(klass, false));\n      } else {\n        Object.keys(rawClassVal).forEach(klass => this._toggleClass(klass, false));\n      }\n    }\n  }\n\n  private _toggleClass(klass: string, enabled: boolean): void {\n    klass = klass.trim();\n    if (klass) {\n      klass.split(/\\s+/g).forEach(klass => {\n        if (enabled) {\n          this._renderer.addClass(this._ngEl.nativeElement, klass);\n        } else {\n          this._renderer.removeClass(this._ngEl.nativeElement, klass);\n        }\n      });\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\nimport {ComponentFactoryResolver, ComponentRef, Directive, Injector, Input, NgModuleFactory, NgModuleRef, OnChanges, OnDestroy, SimpleChanges, StaticProvider, Type, ViewContainerRef} from '@angular/core';\n\n\n/**\n * Instantiates a single {@link Component} type and inserts its Host View into current View.\n * `NgComponentOutlet` provides a declarative approach for dynamic component creation.\n *\n * `NgComponentOutlet` requires a component type, if a falsy value is set the view will clear and\n * any existing component will get destroyed.\n *\n * @usageNotes\n *\n * ### Fine tune control\n *\n * You can control the component creation process by using the following optional attributes:\n *\n * * `ngComponentOutletInjector`: Optional custom {@link Injector} that will be used as parent for\n * the Component. Defaults to the injector of the current view container.\n *\n * * `ngComponentOutletContent`: Optional list of projectable nodes to insert into the content\n * section of the component, if exists.\n *\n * * `ngComponentOutletNgModuleFactory`: Optional module factory to allow dynamically loading other\n * module, then load a component from that module.\n *\n * ### Syntax\n *\n * Simple\n * ```\n * <ng-container *ngComponentOutlet=\"componentTypeExpression\"></ng-container>\n * ```\n *\n * Customized injector/content\n * ```\n * <ng-container *ngComponentOutlet=\"componentTypeExpression;\n *                                   injector: injectorExpression;\n *                                   content: contentNodesExpression;\">\n * </ng-container>\n * ```\n *\n * Customized ngModuleFactory\n * ```\n * <ng-container *ngComponentOutlet=\"componentTypeExpression;\n *                                   ngModuleFactory: moduleFactory;\">\n * </ng-container>\n * ```\n *\n * ### A simple example\n *\n * {@example common/ngComponentOutlet/ts/module.ts region='SimpleExample'}\n *\n * A more complete example with additional options:\n *\n * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'}\n *\n * @publicApi\n * @ngModule CommonModule\n */\n@Directive({selector: '[ngComponentOutlet]'})\nexport class NgComponentOutlet implements OnChanges, OnDestroy {\n  // TODO(issue/24571): remove '!'.\n  @Input() ngComponentOutlet!: Type<any>;\n  // TODO(issue/24571): remove '!'.\n  @Input() ngComponentOutletInjector!: Injector;\n  // TODO(issue/24571): remove '!'.\n  @Input() ngComponentOutletContent!: any[][];\n  // TODO(issue/24571): remove '!'.\n  @Input() ngComponentOutletNgModuleFactory!: NgModuleFactory<any>;\n\n  private _componentRef: ComponentRef<any>|null = null;\n  private _moduleRef: NgModuleRef<any>|null = null;\n\n  constructor(private _viewContainerRef: ViewContainerRef) {}\n\n  ngOnChanges(changes: SimpleChanges) {\n    this._viewContainerRef.clear();\n    this._componentRef = null;\n\n    if (this.ngComponentOutlet) {\n      const elInjector = this.ngComponentOutletInjector || this._viewContainerRef.parentInjector;\n\n      if (changes['ngComponentOutletNgModuleFactory']) {\n        if (this._moduleRef) this._moduleRef.destroy();\n\n        if (this.ngComponentOutletNgModuleFactory) {\n          const parentModule = elInjector.get(NgModuleRef);\n          this._moduleRef = this.ngComponentOutletNgModuleFactory.create(parentModule.injector);\n        } else {\n          this._moduleRef = null;\n        }\n      }\n\n      const componentFactoryResolver = this._moduleRef ? this._moduleRef.componentFactoryResolver :\n                                                         elInjector.get(ComponentFactoryResolver);\n\n      const componentFactory =\n          componentFactoryResolver.resolveComponentFactory(this.ngComponentOutlet);\n\n      this._componentRef = this._viewContainerRef.createComponent(\n          componentFactory, this._viewContainerRef.length, elInjector,\n          this.ngComponentOutletContent);\n    }\n  }\n\n  ngOnDestroy() {\n    if (this._moduleRef) this._moduleRef.destroy();\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\nimport {Directive, DoCheck, EmbeddedViewRef, Input, IterableChangeRecord, IterableChanges, IterableDiffer, IterableDiffers, NgIterable, TemplateRef, TrackByFunction, ViewContainerRef} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport class NgForOfContext<T, U extends NgIterable<T> = NgIterable<T>> {\n  constructor(public $implicit: T, public ngForOf: U, public index: number, public count: number) {}\n\n  get first(): boolean {\n    return this.index === 0;\n  }\n\n  get last(): boolean {\n    return this.index === this.count - 1;\n  }\n\n  get even(): boolean {\n    return this.index % 2 === 0;\n  }\n\n  get odd(): boolean {\n    return !this.even;\n  }\n}\n\n/**\n * A [structural directive](guide/structural-directives) that renders\n * a template for each item in a collection.\n * The directive is placed on an element, which becomes the parent\n * of the cloned templates.\n *\n * The `ngForOf` directive is generally used in the\n * [shorthand form](guide/structural-directives#asterisk) `*ngFor`.\n * In this form, the template to be rendered for each iteration is the content\n * of an anchor element containing the directive.\n *\n * The following example shows the shorthand syntax with some options,\n * contained in an `<li>` element.\n *\n * ```\n * <li *ngFor=\"let item of items; index as i; trackBy: trackByFn\">...</li>\n * ```\n *\n * The shorthand form expands into a long form that uses the `ngForOf` selector\n * on an `<ng-template>` element.\n * The content of the `<ng-template>` element is the `<li>` element that held the\n * short-form directive.\n *\n * Here is the expanded version of the short-form example.\n *\n * ```\n * <ng-template ngFor let-item [ngForOf]=\"items\" let-i=\"index\" [ngForTrackBy]=\"trackByFn\">\n *   <li>...</li>\n * </ng-template>\n * ```\n *\n * Angular automatically expands the shorthand syntax as it compiles the template.\n * The context for each embedded view is logically merged to the current component\n * context according to its lexical position.\n *\n * When using the shorthand syntax, Angular allows only [one structural directive\n * on an element](guide/built-in-directives#one-per-element).\n * If you want to iterate conditionally, for example,\n * put the `*ngIf` on a container element that wraps the `*ngFor` element.\n * For futher discussion, see\n * [Structural Directives](guide/built-in-directives#one-per-element).\n *\n * @usageNotes\n *\n * ### Local variables\n *\n * `NgForOf` provides exported values that can be aliased to local variables.\n * For example:\n *\n *  ```\n * <li *ngFor=\"let user of users; index as i; first as isFirst\">\n *    {{i}}/{{users.length}}. {{user}} <span *ngIf=\"isFirst\">default</span>\n * </li>\n * ```\n *\n * The following exported values can be aliased to local variables:\n *\n * - `$implicit: T`: The value of the individual items in the iterable (`ngForOf`).\n * - `ngForOf: NgIterable<T>`: The value of the iterable expression. Useful when the expression is\n * more complex then a property access, for example when using the async pipe (`userStreams |\n * async`).\n * - `index: number`: The index of the current item in the iterable.\n * - `count: number`: The length of the iterable.\n * - `first: boolean`: True when the item is the first item in the iterable.\n * - `last: boolean`: True when the item is the last item in the iterable.\n * - `even: boolean`: True when the item has an even index in the iterable.\n * - `odd: boolean`: True when the item has an odd index in the iterable.\n *\n * ### Change propagation\n *\n * When the contents of the iterator changes, `NgForOf` makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * Angular uses object identity to track insertions and deletions within the iterator and reproduce\n * those changes in the DOM. This has important implications for animations and any stateful\n * controls that are present, such as `<input>` elements that accept user input. Inserted rows can\n * be animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state\n * such as user input.\n * For more on animations, see [Transitions and Triggers](guide/transition-and-triggers).\n *\n * The identities of elements in the iterator can change while the data does not.\n * This can happen, for example, if the iterator is produced from an RPC to the server, and that\n * RPC is re-run. Even if the data hasn't changed, the second response produces objects with\n * different identities, and Angular must tear down the entire DOM and rebuild it (as if all old\n * elements were deleted and all new elements inserted).\n *\n * To avoid this expensive operation, you can customize the default tracking algorithm.\n * by supplying the `trackBy` option to `NgForOf`.\n * `trackBy` takes a function that has two arguments: `index` and `item`.\n * If `trackBy` is given, Angular tracks changes by the return value of the function.\n *\n * @see [Structural Directives](guide/structural-directives)\n * @ngModule CommonModule\n * @publicApi\n */\n@Directive({selector: '[ngFor][ngForOf]'})\nexport class NgForOf<T, U extends NgIterable<T> = NgIterable<T>> implements DoCheck {\n  /**\n   * The value of the iterable expression, which can be used as a\n   * [template input variable](guide/structural-directives#shorthand).\n   */\n  @Input()\n  set ngForOf(ngForOf: U&NgIterable<T>|undefined|null) {\n    this._ngForOf = ngForOf;\n    this._ngForOfDirty = true;\n  }\n  /**\n   * A function that defines how to track changes for items in the iterable.\n   *\n   * When items are added, moved, or removed in the iterable,\n   * the directive must re-render the appropriate DOM nodes.\n   * To minimize churn in the DOM, only nodes that have changed\n   * are re-rendered.\n   *\n   * By default, the change detector assumes that\n   * the object instance identifies the node in the iterable.\n   * When this function is supplied, the directive uses\n   * the result of calling this function to identify the item node,\n   * rather than the identity of the object itself.\n   *\n   * The function receives two inputs,\n   * the iteration index and the associated node data.\n   */\n  @Input()\n  set ngForTrackBy(fn: TrackByFunction<T>) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && fn != null && typeof fn !== 'function') {\n      // TODO(vicb): use a log service once there is a public one available\n      if (<any>console && <any>console.warn) {\n        console.warn(\n            `trackBy must be a function, but received ${JSON.stringify(fn)}. ` +\n            `See https://angular.io/api/common/NgForOf#change-propagation for more information.`);\n      }\n    }\n    this._trackByFn = fn;\n  }\n\n  get ngForTrackBy(): TrackByFunction<T> {\n    return this._trackByFn;\n  }\n\n  private _ngForOf: U|undefined|null = null;\n  private _ngForOfDirty: boolean = true;\n  private _differ: IterableDiffer<T>|null = null;\n  // TODO(issue/24571): remove '!'.\n  private _trackByFn!: TrackByFunction<T>;\n\n  constructor(\n      private _viewContainer: ViewContainerRef,\n      private _template: TemplateRef<NgForOfContext<T, U>>, private _differs: IterableDiffers) {}\n\n  /**\n   * A reference to the template that is stamped out for each item in the iterable.\n   * @see [template reference variable](guide/template-reference-variables)\n   */\n  @Input()\n  set ngForTemplate(value: TemplateRef<NgForOfContext<T, U>>) {\n    // TODO(TS2.1): make TemplateRef<Partial<NgForRowOf<T>>> once we move to TS v2.1\n    // The current type is too restrictive; a template that just uses index, for example,\n    // should be acceptable.\n    if (value) {\n      this._template = value;\n    }\n  }\n\n  /**\n   * Applies the changes when needed.\n   */\n  ngDoCheck(): void {\n    if (this._ngForOfDirty) {\n      this._ngForOfDirty = false;\n      // React on ngForOf changes only once all inputs have been initialized\n      const value = this._ngForOf;\n      if (!this._differ && value) {\n        try {\n          this._differ = this._differs.find(value).create(this.ngForTrackBy);\n        } catch {\n          throw new Error(`Cannot find a differ supporting object '${value}' of type '${\n              getTypeName(value)}'. NgFor only supports binding to Iterables such as Arrays.`);\n        }\n      }\n    }\n    if (this._differ) {\n      const changes = this._differ.diff(this._ngForOf);\n      if (changes) this._applyChanges(changes);\n    }\n  }\n\n  private _applyChanges(changes: IterableChanges<T>) {\n    const insertTuples: RecordViewTuple<T, U>[] = [];\n    changes.forEachOperation(\n        (item: IterableChangeRecord<any>, adjustedPreviousIndex: number|null,\n         currentIndex: number|null) => {\n          if (item.previousIndex == null) {\n            // NgForOf is never \"null\" or \"undefined\" here because the differ detected\n            // that a new item needs to be inserted from the iterable. This implies that\n            // there is an iterable value for \"_ngForOf\".\n            const view = this._viewContainer.createEmbeddedView(\n                this._template, new NgForOfContext<T, U>(null!, this._ngForOf!, -1, -1),\n                currentIndex === null ? undefined : currentIndex);\n            const tuple = new RecordViewTuple<T, U>(item, view);\n            insertTuples.push(tuple);\n          } else if (currentIndex == null) {\n            this._viewContainer.remove(\n                adjustedPreviousIndex === null ? undefined : adjustedPreviousIndex);\n          } else if (adjustedPreviousIndex !== null) {\n            const view = this._viewContainer.get(adjustedPreviousIndex)!;\n            this._viewContainer.move(view, currentIndex);\n            const tuple = new RecordViewTuple(item, <EmbeddedViewRef<NgForOfContext<T, U>>>view);\n            insertTuples.push(tuple);\n          }\n        });\n\n    for (let i = 0; i < insertTuples.length; i++) {\n      this._perViewChange(insertTuples[i].view, insertTuples[i].record);\n    }\n\n    for (let i = 0, ilen = this._viewContainer.length; i < ilen; i++) {\n      const viewRef = <EmbeddedViewRef<NgForOfContext<T, U>>>this._viewContainer.get(i);\n      viewRef.context.index = i;\n      viewRef.context.count = ilen;\n      viewRef.context.ngForOf = this._ngForOf!;\n    }\n\n    changes.forEachIdentityChange((record: any) => {\n      const viewRef =\n          <EmbeddedViewRef<NgForOfContext<T, U>>>this._viewContainer.get(record.currentIndex);\n      viewRef.context.$implicit = record.item;\n    });\n  }\n\n  private _perViewChange(\n      view: EmbeddedViewRef<NgForOfContext<T, U>>, record: IterableChangeRecord<any>) {\n    view.context.$implicit = record.item;\n  }\n\n  /**\n   * Asserts the correct type of the context for the template that `NgForOf` will render.\n   *\n   * The presence of this method is a signal to the Ivy template type-check compiler that the\n   * `NgForOf` structural directive renders its template with a specific context type.\n   */\n  static ngTemplateContextGuard<T, U extends NgIterable<T>>(dir: NgForOf<T, U>, ctx: any):\n      ctx is NgForOfContext<T, U> {\n    return true;\n  }\n}\n\nclass RecordViewTuple<T, U extends NgIterable<T>> {\n  constructor(public record: any, public view: EmbeddedViewRef<NgForOfContext<T, U>>) {}\n}\n\nfunction getTypeName(type: any): string {\n  return type['name'] || typeof type;\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\nimport {Directive, EmbeddedViewRef, Input, TemplateRef, ViewContainerRef, ɵstringify as stringify} from '@angular/core';\n\n\n/**\n * A structural directive that conditionally includes a template based on the value of\n * an expression coerced to Boolean.\n * When the expression evaluates to true, Angular renders the template\n * provided in a `then` clause, and when  false or null,\n * Angular renders the template provided in an optional `else` clause. The default\n * template for the `else` clause is blank.\n *\n * A [shorthand form](guide/structural-directives#asterisk) of the directive,\n * `*ngIf=\"condition\"`, is generally used, provided\n * as an attribute of the anchor element for the inserted template.\n * Angular expands this into a more explicit version, in which the anchor element\n * is contained in an `<ng-template>` element.\n *\n * Simple form with shorthand syntax:\n *\n * ```\n * <div *ngIf=\"condition\">Content to render when condition is true.</div>\n * ```\n *\n * Simple form with expanded syntax:\n *\n * ```\n * <ng-template [ngIf]=\"condition\"><div>Content to render when condition is\n * true.</div></ng-template>\n * ```\n *\n * Form with an \"else\" block:\n *\n * ```\n * <div *ngIf=\"condition; else elseBlock\">Content to render when condition is true.</div>\n * <ng-template #elseBlock>Content to render when condition is false.</ng-template>\n * ```\n *\n * Shorthand form with \"then\" and \"else\" blocks:\n *\n * ```\n * <div *ngIf=\"condition; then thenBlock else elseBlock\"></div>\n * <ng-template #thenBlock>Content to render when condition is true.</ng-template>\n * <ng-template #elseBlock>Content to render when condition is false.</ng-template>\n * ```\n *\n * Form with storing the value locally:\n *\n * ```\n * <div *ngIf=\"condition as value; else elseBlock\">{{value}}</div>\n * <ng-template #elseBlock>Content to render when value is null.</ng-template>\n * ```\n *\n * @usageNotes\n *\n * The `*ngIf` directive is most commonly used to conditionally show an inline template,\n * as seen in the following  example.\n * The default `else` template is blank.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfSimple'}\n *\n * ### Showing an alternative template using `else`\n *\n * To display a template when `expression` evaluates to false, use an `else` template\n * binding as shown in the following example.\n * The `else` binding points to an `<ng-template>`  element labeled `#elseBlock`.\n * The template can be defined anywhere in the component view, but is typically placed right after\n * `ngIf` for readability.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfElse'}\n *\n * ### Using an external `then` template\n *\n * In the previous example, the then-clause template is specified inline, as the content of the\n * tag that contains the `ngIf` directive. You can also specify a template that is defined\n * externally, by referencing a labeled `<ng-template>` element. When you do this, you can\n * change which template to use at runtime, as shown in the following example.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfThenElse'}\n *\n * ### Storing a conditional result in a variable\n *\n * You might want to show a set of properties from the same object. If you are waiting\n * for asynchronous data, the object can be undefined.\n * In this case, you can use `ngIf` and store the result of the condition in a local\n * variable as shown in the following example.\n *\n * {@example common/ngIf/ts/module.ts region='NgIfAs'}\n *\n * This code uses only one `AsyncPipe`, so only one subscription is created.\n * The conditional statement stores the result of `userStream|async` in the local variable `user`.\n * You can then bind the local `user` repeatedly.\n *\n * The conditional displays the data only if `userStream` returns a value,\n * so you don't need to use the\n * safe-navigation-operator (`?.`)\n * to guard against null values when accessing properties.\n * You can display an alternative template while waiting for the data.\n *\n * ### Shorthand syntax\n *\n * The shorthand syntax `*ngIf` expands into two separate template specifications\n * for the \"then\" and \"else\" clauses. For example, consider the following shorthand statement,\n * that is meant to show a loading page while waiting for data to be loaded.\n *\n * ```\n * <div class=\"hero-list\" *ngIf=\"heroes else loading\">\n *  ...\n * </div>\n *\n * <ng-template #loading>\n *  <div>Loading...</div>\n * </ng-template>\n * ```\n *\n * You can see that the \"else\" clause references the `<ng-template>`\n * with the `#loading` label, and the template for the \"then\" clause\n * is provided as the content of the anchor element.\n *\n * However, when Angular expands the shorthand syntax, it creates\n * another `<ng-template>` tag, with `ngIf` and `ngIfElse` directives.\n * The anchor element containing the template for the \"then\" clause becomes\n * the content of this unlabeled `<ng-template>` tag.\n *\n * ```\n * <ng-template [ngIf]=\"heroes\" [ngIfElse]=\"loading\">\n *  <div class=\"hero-list\">\n *   ...\n *  </div>\n * </ng-template>\n *\n * <ng-template #loading>\n *  <div>Loading...</div>\n * </ng-template>\n * ```\n *\n * The presence of the implicit template object has implications for the nesting of\n * structural directives. For more on this subject, see\n * [Structural Directives](https://angular.io/guide/built-in-directives#one-per-element).\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Directive({selector: '[ngIf]'})\nexport class NgIf<T = unknown> {\n  private _context: NgIfContext<T> = new NgIfContext<T>();\n  private _thenTemplateRef: TemplateRef<NgIfContext<T>>|null = null;\n  private _elseTemplateRef: TemplateRef<NgIfContext<T>>|null = null;\n  private _thenViewRef: EmbeddedViewRef<NgIfContext<T>>|null = null;\n  private _elseViewRef: EmbeddedViewRef<NgIfContext<T>>|null = null;\n\n  constructor(private _viewContainer: ViewContainerRef, templateRef: TemplateRef<NgIfContext<T>>) {\n    this._thenTemplateRef = templateRef;\n  }\n\n  /**\n   * The Boolean expression to evaluate as the condition for showing a template.\n   */\n  @Input()\n  set ngIf(condition: T) {\n    this._context.$implicit = this._context.ngIf = condition;\n    this._updateView();\n  }\n\n  /**\n   * A template to show if the condition expression evaluates to true.\n   */\n  @Input()\n  set ngIfThen(templateRef: TemplateRef<NgIfContext<T>>|null) {\n    assertTemplate('ngIfThen', templateRef);\n    this._thenTemplateRef = templateRef;\n    this._thenViewRef = null;  // clear previous view if any.\n    this._updateView();\n  }\n\n  /**\n   * A template to show if the condition expression evaluates to false.\n   */\n  @Input()\n  set ngIfElse(templateRef: TemplateRef<NgIfContext<T>>|null) {\n    assertTemplate('ngIfElse', templateRef);\n    this._elseTemplateRef = templateRef;\n    this._elseViewRef = null;  // clear previous view if any.\n    this._updateView();\n  }\n\n  private _updateView() {\n    if (this._context.$implicit) {\n      if (!this._thenViewRef) {\n        this._viewContainer.clear();\n        this._elseViewRef = null;\n        if (this._thenTemplateRef) {\n          this._thenViewRef =\n              this._viewContainer.createEmbeddedView(this._thenTemplateRef, this._context);\n        }\n      }\n    } else {\n      if (!this._elseViewRef) {\n        this._viewContainer.clear();\n        this._thenViewRef = null;\n        if (this._elseTemplateRef) {\n          this._elseViewRef =\n              this._viewContainer.createEmbeddedView(this._elseTemplateRef, this._context);\n        }\n      }\n    }\n  }\n\n  /** @internal */\n  public static ngIfUseIfTypeGuard: void;\n\n  /**\n   * Assert the correct type of the expression bound to the `ngIf` input within the template.\n   *\n   * The presence of this static field is a signal to the Ivy template type check compiler that\n   * when the `NgIf` structural directive renders its template, the type of the expression bound\n   * to `ngIf` should be narrowed in some way. For `NgIf`, the binding expression itself is used to\n   * narrow its type, which allows the strictNullChecks feature of TypeScript to work with `NgIf`.\n   */\n  static ngTemplateGuard_ngIf: 'binding';\n\n  /**\n   * Asserts the correct type of the context for the template that `NgIf` will render.\n   *\n   * The presence of this method is a signal to the Ivy template type-check compiler that the\n   * `NgIf` structural directive renders its template with a specific context type.\n   */\n  static ngTemplateContextGuard<T>(dir: NgIf<T>, ctx: any):\n      ctx is NgIfContext<Exclude<T, false|0|''|null|undefined>> {\n    return true;\n  }\n}\n\n/**\n * @publicApi\n */\nexport class NgIfContext<T = unknown> {\n  public $implicit: T = null!;\n  public ngIf: T = null!;\n}\n\nfunction assertTemplate(property: string, templateRef: TemplateRef<any>|null): void {\n  const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n  if (!isTemplateRefOrNull) {\n    throw new Error(`${property} must be a TemplateRef, but received '${stringify(templateRef)}'.`);\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\nimport {Directive, DoCheck, Host, Input, Optional, TemplateRef, ViewContainerRef, ɵRuntimeError as RuntimeError, ɵRuntimeErrorCode as RuntimeErrorCode} from '@angular/core';\n\nexport class SwitchView {\n  private _created = false;\n\n  constructor(\n      private _viewContainerRef: ViewContainerRef, private _templateRef: TemplateRef<Object>) {}\n\n  create(): void {\n    this._created = true;\n    this._viewContainerRef.createEmbeddedView(this._templateRef);\n  }\n\n  destroy(): void {\n    this._created = false;\n    this._viewContainerRef.clear();\n  }\n\n  enforceState(created: boolean) {\n    if (created && !this._created) {\n      this.create();\n    } else if (!created && this._created) {\n      this.destroy();\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n * The `[ngSwitch]` directive on a container specifies an expression to match against.\n * The expressions to match are provided by `ngSwitchCase` directives on views within the container.\n * - Every view that matches is rendered.\n * - If there are no matches, a view with the `ngSwitchDefault` directive is rendered.\n * - Elements within the `[NgSwitch]` statement but outside of any `NgSwitchCase`\n * or `ngSwitchDefault` directive are preserved at the location.\n *\n * @usageNotes\n * Define a container element for the directive, and specify the switch expression\n * to match against as an attribute:\n *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n * ```\n *\n * Within the container, `*ngSwitchCase` statements specify the match expressions\n * as attributes. Include `*ngSwitchDefault` as the final case.\n *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n *    <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n * ...\n *    <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * ### Usage Examples\n *\n * The following example shows how to use more than one case to display the same view:\n *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n *   <!-- the same view can be shown in more than one case -->\n *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *   <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n *   <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n *   <!--default case when there are no matches -->\n *   <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * The following example shows how cases can be nested:\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n *       <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *       <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n *       <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n *       <ng-container *ngSwitchCase=\"match_expression_3\">\n *         <!-- use a ng-container to group multiple root nodes -->\n *         <inner-element></inner-element>\n *         <inner-other-element></inner-other-element>\n *       </ng-container>\n *       <some-element *ngSwitchDefault>...</some-element>\n *     </container-element>\n * ```\n *\n * @publicApi\n * @see `NgSwitchCase`\n * @see `NgSwitchDefault`\n * @see [Structural Directives](guide/structural-directives)\n *\n */\n@Directive({selector: '[ngSwitch]'})\nexport class NgSwitch {\n  // TODO(issue/24571): remove '!'.\n  private _defaultViews!: SwitchView[];\n  private _defaultUsed = false;\n  private _caseCount = 0;\n  private _lastCaseCheckIndex = 0;\n  private _lastCasesMatched = false;\n  private _ngSwitch: any;\n\n  @Input()\n  set ngSwitch(newValue: any) {\n    this._ngSwitch = newValue;\n    if (this._caseCount === 0) {\n      this._updateDefaultCases(true);\n    }\n  }\n\n  /** @internal */\n  _addCase(): number {\n    return this._caseCount++;\n  }\n\n  /** @internal */\n  _addDefault(view: SwitchView) {\n    if (!this._defaultViews) {\n      this._defaultViews = [];\n    }\n    this._defaultViews.push(view);\n  }\n\n  /** @internal */\n  _matchCase(value: any): boolean {\n    const matched = value == this._ngSwitch;\n    this._lastCasesMatched = this._lastCasesMatched || matched;\n    this._lastCaseCheckIndex++;\n    if (this._lastCaseCheckIndex === this._caseCount) {\n      this._updateDefaultCases(!this._lastCasesMatched);\n      this._lastCaseCheckIndex = 0;\n      this._lastCasesMatched = false;\n    }\n    return matched;\n  }\n\n  private _updateDefaultCases(useDefault: boolean) {\n    if (this._defaultViews && useDefault !== this._defaultUsed) {\n      this._defaultUsed = useDefault;\n      for (let i = 0; i < this._defaultViews.length; i++) {\n        const defaultView = this._defaultViews[i];\n        defaultView.enforceState(useDefault);\n      }\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n * Provides a switch case expression to match against an enclosing `ngSwitch` expression.\n * When the expressions match, the given `NgSwitchCase` template is rendered.\n * If multiple match expressions match the switch expression value, all of them are displayed.\n *\n * @usageNotes\n *\n * Within a switch container, `*ngSwitchCase` statements specify the match expressions\n * as attributes. Include `*ngSwitchDefault` as the final case.\n *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n *   <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n *   ...\n *   <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n *\n * Each switch-case statement contains an in-line HTML template or template reference\n * that defines the subtree to be selected if the value of the match expression\n * matches the value of the switch expression.\n *\n * Unlike JavaScript, which uses strict equality, Angular uses loose equality.\n * This means that the empty string, `\"\"` matches 0.\n *\n * @publicApi\n * @see `NgSwitch`\n * @see `NgSwitchDefault`\n *\n */\n@Directive({selector: '[ngSwitchCase]'})\nexport class NgSwitchCase implements DoCheck {\n  private _view: SwitchView;\n  /**\n   * Stores the HTML template to be selected on match.\n   */\n  @Input() ngSwitchCase: any;\n\n  constructor(\n      viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>,\n      @Optional() @Host() private ngSwitch: NgSwitch) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {\n      throwNgSwitchProviderNotFoundError('ngSwitchCase', 'NgSwitchCase');\n    }\n\n    ngSwitch._addCase();\n    this._view = new SwitchView(viewContainer, templateRef);\n  }\n\n  /**\n   * Performs case matching. For internal use only.\n   */\n  ngDoCheck() {\n    this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase));\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Creates a view that is rendered when no `NgSwitchCase` expressions\n * match the `NgSwitch` expression.\n * This statement should be the final case in an `NgSwitch`.\n *\n * @publicApi\n * @see `NgSwitch`\n * @see `NgSwitchCase`\n *\n */\n@Directive({selector: '[ngSwitchDefault]'})\nexport class NgSwitchDefault {\n  constructor(\n      viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>,\n      @Optional() @Host() ngSwitch: NgSwitch) {\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {\n      throwNgSwitchProviderNotFoundError('ngSwitchDefault', 'NgSwitchDefault');\n    }\n\n    ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));\n  }\n}\n\nfunction throwNgSwitchProviderNotFoundError(attrName: string, directiveName: string): never {\n  throw new RuntimeError(\n      RuntimeErrorCode.TEMPLATE_STRUCTURE_ERROR,\n      `An element with the \"${attrName}\" attribute ` +\n          `(matching the \"${\n              directiveName}\" directive) must be located inside an element with the \"ngSwitch\" attribute ` +\n          `(matching \"NgSwitch\" directive)`);\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\nimport {Attribute, Directive, Host, Input, TemplateRef, ViewContainerRef} from '@angular/core';\n\nimport {getPluralCategory, NgLocalization} from '../i18n/localization';\n\nimport {SwitchView} from './ng_switch';\n\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n * ```\n * <some-element [ngPlural]=\"value\">\n *   <ng-template ngPluralCase=\"=0\">there is nothing</ng-template>\n *   <ng-template ngPluralCase=\"=1\">there is one</ng-template>\n *   <ng-template ngPluralCase=\"few\">there are a few</ng-template>\n * </some-element>\n * ```\n *\n * @description\n *\n * Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.\n *\n * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees\n * that match the switch expression's pluralization category.\n *\n * To use this directive you must provide a container element that sets the `[ngPlural]` attribute\n * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their\n * expression:\n * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value\n *   matches the switch expression exactly,\n * - otherwise, the view will be treated as a \"category match\", and will only display if exact\n *   value matches aren't found and the value maps to its category for the defined locale.\n *\n * See http://cldr.unicode.org/index/cldr-spec/plural-rules\n *\n * @publicApi\n */\n@Directive({selector: '[ngPlural]'})\nexport class NgPlural {\n  // TODO(issue/24571): remove '!'.\n  private _switchValue!: number;\n  // TODO(issue/24571): remove '!'.\n  private _activeView!: SwitchView;\n  private _caseViews: {[k: string]: SwitchView} = {};\n\n  constructor(private _localization: NgLocalization) {}\n\n  @Input()\n  set ngPlural(value: number) {\n    this._switchValue = value;\n    this._updateView();\n  }\n\n  addCase(value: string, switchView: SwitchView): void {\n    this._caseViews[value] = switchView;\n  }\n\n  private _updateView(): void {\n    this._clearViews();\n\n    const cases = Object.keys(this._caseViews);\n    const key = getPluralCategory(this._switchValue, cases, this._localization);\n    this._activateView(this._caseViews[key]);\n  }\n\n  private _clearViews() {\n    if (this._activeView) this._activeView.destroy();\n  }\n\n  private _activateView(view: SwitchView) {\n    if (view) {\n      this._activeView = view;\n      this._activeView.create();\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Creates a view that will be added/removed from the parent {@link NgPlural} when the\n * given expression matches the plural expression according to CLDR rules.\n *\n * @usageNotes\n * ```\n * <some-element [ngPlural]=\"value\">\n *   <ng-template ngPluralCase=\"=0\">...</ng-template>\n *   <ng-template ngPluralCase=\"other\">...</ng-template>\n * </some-element>\n *```\n *\n * See {@link NgPlural} for more details and example.\n *\n * @publicApi\n */\n@Directive({selector: '[ngPluralCase]'})\nexport class NgPluralCase {\n  constructor(\n      @Attribute('ngPluralCase') public value: string, template: TemplateRef<Object>,\n      viewContainer: ViewContainerRef, @Host() ngPlural: NgPlural) {\n    const isANumber: boolean = !isNaN(Number(value));\n    ngPlural.addCase(isANumber ? `=${value}` : value, new SwitchView(viewContainer, template));\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 */\nimport {Directive, DoCheck, ElementRef, Input, KeyValueChanges, KeyValueDiffer, KeyValueDiffers, Renderer2} from '@angular/core';\n\n\n/**\n * @ngModule CommonModule\n *\n * @usageNotes\n *\n * Set the font of the containing element to the result of an expression.\n *\n * ```\n * <some-element [ngStyle]=\"{'font-style': styleExp}\">...</some-element>\n * ```\n *\n * Set the width of the containing element to a pixel value returned by an expression.\n *\n * ```\n * <some-element [ngStyle]=\"{'max-width.px': widthExp}\">...</some-element>\n * ```\n *\n * Set a collection of style values using an expression that returns key-value pairs.\n *\n * ```\n * <some-element [ngStyle]=\"objExp\">...</some-element>\n * ```\n *\n * @description\n *\n * An attribute directive that updates styles for the containing HTML element.\n * Sets one or more style properties, specified as colon-separated key-value pairs.\n * The key is a style name, with an optional `.<unit>` suffix\n * (such as 'top.px', 'font-style.em').\n * The value is an expression to be evaluated.\n * The resulting non-null value, expressed in the given unit,\n * is assigned to the given style property.\n * If the result of evaluation is null, the corresponding style is removed.\n *\n * @publicApi\n */\n@Directive({selector: '[ngStyle]'})\nexport class NgStyle implements DoCheck {\n  private _ngStyle: {[key: string]: string}|null = null;\n  private _differ: KeyValueDiffer<string, string|number>|null = null;\n\n  constructor(\n      private _ngEl: ElementRef, private _differs: KeyValueDiffers, private _renderer: Renderer2) {}\n\n  @Input('ngStyle')\n  set ngStyle(values: {[klass: string]: any}|null) {\n    this._ngStyle = values;\n    if (!this._differ && values) {\n      this._differ = this._differs.find(values).create();\n    }\n  }\n\n  ngDoCheck() {\n    if (this._differ) {\n      const changes = this._differ.diff(this._ngStyle!);\n      if (changes) {\n        this._applyChanges(changes);\n      }\n    }\n  }\n\n  private _setStyle(nameAndUnit: string, value: string|number|null|undefined): void {\n    const [name, unit] = nameAndUnit.split('.');\n    value = value != null && unit ? `${value}${unit}` : value;\n\n    if (value != null) {\n      this._renderer.setStyle(this._ngEl.nativeElement, name, value as string);\n    } else {\n      this._renderer.removeStyle(this._ngEl.nativeElement, name);\n    }\n  }\n\n  private _applyChanges(changes: KeyValueChanges<string, string|number>): void {\n    changes.forEachRemovedItem((record) => this._setStyle(record.key, null));\n    changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));\n    changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));\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\nimport {Directive, EmbeddedViewRef, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core';\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Inserts an embedded view from a prepared `TemplateRef`.\n *\n * You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.\n * `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding\n * by the local template `let` declarations.\n *\n * @usageNotes\n * ```\n * <ng-container *ngTemplateOutlet=\"templateRefExp; context: contextExp\"></ng-container>\n * ```\n *\n * Using the key `$implicit` in the context object will set its value as default.\n *\n * ### Example\n *\n * {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}\n *\n * @publicApi\n */\n@Directive({selector: '[ngTemplateOutlet]'})\nexport class NgTemplateOutlet implements OnChanges {\n  private _viewRef: EmbeddedViewRef<any>|null = null;\n\n  /**\n   * A context object to attach to the {@link EmbeddedViewRef}. This should be an\n   * object, the object's keys will be available for binding by the local template `let`\n   * declarations.\n   * Using the key `$implicit` in the context object will set its value as default.\n   */\n  @Input() public ngTemplateOutletContext: Object|null = null;\n\n  /**\n   * A string defining the template reference and optionally the context object for the template.\n   */\n  @Input() public ngTemplateOutlet: TemplateRef<any>|null = null;\n\n  constructor(private _viewContainerRef: ViewContainerRef) {}\n\n  ngOnChanges(changes: SimpleChanges) {\n    const recreateView = this._shouldRecreateView(changes);\n\n    if (recreateView) {\n      const viewContainerRef = this._viewContainerRef;\n\n      if (this._viewRef) {\n        viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef));\n      }\n\n      this._viewRef = this.ngTemplateOutlet ?\n          viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, this.ngTemplateOutletContext) :\n          null;\n    } else if (this._viewRef && this.ngTemplateOutletContext) {\n      this._updateExistingContext(this.ngTemplateOutletContext);\n    }\n  }\n\n  /**\n   * We need to re-create existing embedded view if:\n   * - templateRef has changed\n   * - context has changes\n   *\n   * We mark context object as changed when the corresponding object\n   * shape changes (new properties are added or existing properties are removed).\n   * In other words we consider context with the same properties as \"the same\" even\n   * if object reference changes (see https://github.com/angular/angular/issues/13407).\n   */\n  private _shouldRecreateView(changes: SimpleChanges): boolean {\n    const ctxChange = changes['ngTemplateOutletContext'];\n    return !!changes['ngTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange));\n  }\n\n  private _hasContextShapeChanged(ctxChange: SimpleChange): boolean {\n    const prevCtxKeys = Object.keys(ctxChange.previousValue || {});\n    const currCtxKeys = Object.keys(ctxChange.currentValue || {});\n\n    if (prevCtxKeys.length === currCtxKeys.length) {\n      for (let propName of currCtxKeys) {\n        if (prevCtxKeys.indexOf(propName) === -1) {\n          return true;\n        }\n      }\n      return false;\n    }\n    return true;\n  }\n\n  private _updateExistingContext(ctx: Object): void {\n    for (let propName of Object.keys(ctx)) {\n      (<any>this._viewRef!.context)[propName] = (<any>this.ngTemplateOutletContext)[propName];\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\nimport {Provider} from '@angular/core';\nimport {NgClass} from './ng_class';\nimport {NgComponentOutlet} from './ng_component_outlet';\nimport {NgForOf, NgForOfContext} from './ng_for_of';\nimport {NgIf, NgIfContext} from './ng_if';\nimport {NgPlural, NgPluralCase} from './ng_plural';\nimport {NgStyle} from './ng_style';\nimport {NgSwitch, NgSwitchCase, NgSwitchDefault} from './ng_switch';\nimport {NgTemplateOutlet} from './ng_template_outlet';\n\nexport {\n  NgClass,\n  NgComponentOutlet,\n  NgForOf,\n  NgForOfContext,\n  NgIf,\n  NgIfContext,\n  NgPlural,\n  NgPluralCase,\n  NgStyle,\n  NgSwitch,\n  NgSwitchCase,\n  NgSwitchDefault,\n  NgTemplateOutlet,\n};\n\n\n\n/**\n * A collection of Angular directives that are likely to be used in each and every Angular\n * application.\n */\nexport const COMMON_DIRECTIVES: Provider[] = [\n  NgClass,\n  NgComponentOutlet,\n  NgForOf,\n  NgIf,\n  NgTemplateOutlet,\n  NgStyle,\n  NgSwitch,\n  NgSwitchCase,\n  NgSwitchDefault,\n  NgPlural,\n  NgPluralCase,\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\nimport {Type, ɵstringify as stringify} from '@angular/core';\n\nexport function invalidPipeArgumentError(type: Type<any>, value: Object) {\n  return Error(`InvalidPipeArgument: '${value}' for pipe '${stringify(type)}'`);\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\nimport {ChangeDetectorRef, EventEmitter, OnDestroy, Pipe, PipeTransform, ɵisPromise, ɵisSubscribable} from '@angular/core';\nimport {Observable, Subscribable, Unsubscribable} from 'rxjs';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\ninterface SubscriptionStrategy {\n  createSubscription(async: Subscribable<any>|Promise<any>, updateLatestValue: any): Unsubscribable\n      |Promise<any>;\n  dispose(subscription: Unsubscribable|Promise<any>): void;\n  onDestroy(subscription: Unsubscribable|Promise<any>): void;\n}\n\nclass SubscribableStrategy implements SubscriptionStrategy {\n  createSubscription(async: Subscribable<any>, updateLatestValue: any): Unsubscribable {\n    return async.subscribe({\n      next: updateLatestValue,\n      error: (e: any) => {\n        throw e;\n      }\n    });\n  }\n\n  dispose(subscription: Unsubscribable): void {\n    subscription.unsubscribe();\n  }\n\n  onDestroy(subscription: Unsubscribable): void {\n    subscription.unsubscribe();\n  }\n}\n\nclass PromiseStrategy implements SubscriptionStrategy {\n  createSubscription(async: Promise<any>, updateLatestValue: (v: any) => any): Promise<any> {\n    return async.then(updateLatestValue, e => {\n      throw e;\n    });\n  }\n\n  dispose(subscription: Promise<any>): void {}\n\n  onDestroy(subscription: Promise<any>): void {}\n}\n\nconst _promiseStrategy = new PromiseStrategy();\nconst _subscribableStrategy = new SubscribableStrategy();\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Unwraps a value from an asynchronous primitive.\n *\n * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has\n * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for\n * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid\n * potential memory leaks.\n *\n * @usageNotes\n *\n * ### Examples\n *\n * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the\n * promise.\n *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}\n *\n * It's also possible to use `async` with Observables. The example below binds the `time` Observable\n * to the view. The Observable continuously updates the view with the current time.\n *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}\n *\n * @publicApi\n */\n@Pipe({name: 'async', pure: false})\nexport class AsyncPipe implements OnDestroy, PipeTransform {\n  private _latestValue: any = null;\n\n  private _subscription: Unsubscribable|Promise<any>|null = null;\n  private _obj: Subscribable<any>|Promise<any>|EventEmitter<any>|null = null;\n  private _strategy: SubscriptionStrategy = null!;\n\n  constructor(private _ref: ChangeDetectorRef) {}\n\n  ngOnDestroy(): void {\n    if (this._subscription) {\n      this._dispose();\n    }\n  }\n\n  // NOTE(@benlesh): Because Observable has deprecated a few call patterns for `subscribe`,\n  // TypeScript has a hard time matching Observable to Subscribable, for more information\n  // see https://github.com/microsoft/TypeScript/issues/43643\n\n  transform<T>(obj: Observable<T>|Subscribable<T>|Promise<T>): T|null;\n  transform<T>(obj: null|undefined): null;\n  transform<T>(obj: Observable<T>|Subscribable<T>|Promise<T>|null|undefined): T|null;\n  transform<T>(obj: Observable<T>|Subscribable<T>|Promise<T>|null|undefined): T|null {\n    if (!this._obj) {\n      if (obj) {\n        this._subscribe(obj);\n      }\n      return this._latestValue;\n    }\n\n    if (obj !== this._obj) {\n      this._dispose();\n      return this.transform(obj);\n    }\n\n    return this._latestValue;\n  }\n\n  private _subscribe(obj: Subscribable<any>|Promise<any>|EventEmitter<any>): void {\n    this._obj = obj;\n    this._strategy = this._selectStrategy(obj);\n    this._subscription = this._strategy.createSubscription(\n        obj, (value: Object) => this._updateLatestValue(obj, value));\n  }\n\n  private _selectStrategy(obj: Subscribable<any>|Promise<any>|EventEmitter<any>): any {\n    if (ɵisPromise(obj)) {\n      return _promiseStrategy;\n    }\n\n    if (ɵisSubscribable(obj)) {\n      return _subscribableStrategy;\n    }\n\n    throw invalidPipeArgumentError(AsyncPipe, obj);\n  }\n\n  private _dispose(): void {\n    this._strategy.dispose(this._subscription!);\n    this._latestValue = null;\n    this._subscription = null;\n    this._obj = null;\n  }\n\n  private _updateLatestValue(async: any, value: Object): void {\n    if (async === this._obj) {\n      this._latestValue = value;\n      this._ref.markForCheck();\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * Transforms text to all lower case.\n *\n * @see `UpperCasePipe`\n * @see `TitleCasePipe`\n * @usageNotes\n *\n * The following example defines a view that allows the user to enter\n * text, and then uses the pipe to convert the input text to all lower case.\n *\n * <code-example path=\"common/pipes/ts/lowerupper_pipe.ts\" region='LowerUpperPipe'></code-example>\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({name: 'lowercase'})\nexport class LowerCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to lower case.\n   */\n  transform(value: string): string;\n  transform(value: null|undefined): null;\n  transform(value: string|null|undefined): string|null;\n  transform(value: string|null|undefined): string|null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(LowerCasePipe, value);\n    }\n    return value.toLowerCase();\n  }\n}\n\n//\n// Regex below matches any Unicode word and compatible with ES5. In ES2018 the same result\n// can be achieved by using /\\p{L}\\S*/gu and also known as Unicode Property Escapes\n// (https://2ality.com/2017/07/regexp-unicode-property-escapes.html). Since there is no\n// transpilation of this functionality down to ES5 without external tool, the only solution is\n// to use already transpiled form. Example can be found here -\n// https://mothereff.in/regexpu#input=var+regex+%3D+/%5Cp%7BL%7D/u%3B&unicodePropertyEscape=1\n//\n\nconst unicodeWordMatch =\n    /(?:[A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D])\\S*/g;\n\n/**\n * Transforms text to title case.\n * Capitalizes the first letter of each word and transforms the\n * rest of the word to lower case.\n * Words are delimited by any whitespace character, such as a space, tab, or line-feed character.\n *\n * @see `LowerCasePipe`\n * @see `UpperCasePipe`\n *\n * @usageNotes\n * The following example shows the result of transforming various strings into title case.\n *\n * <code-example path=\"common/pipes/ts/titlecase_pipe.ts\" region='TitleCasePipe'></code-example>\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({name: 'titlecase'})\nexport class TitleCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to title case.\n   */\n  transform(value: string): string;\n  transform(value: null|undefined): null;\n  transform(value: string|null|undefined): string|null;\n  transform(value: string|null|undefined): string|null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(TitleCasePipe, value);\n    }\n\n    return value.replace(\n        unicodeWordMatch, (txt => txt[0].toUpperCase() + txt.substr(1).toLowerCase()));\n  }\n}\n\n/**\n * Transforms text to all upper case.\n * @see `LowerCasePipe`\n * @see `TitleCasePipe`\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({name: 'uppercase'})\nexport class UpperCasePipe implements PipeTransform {\n  /**\n   * @param value The string to transform to upper case.\n   */\n  transform(value: string): string;\n  transform(value: null|undefined): null;\n  transform(value: string|null|undefined): string|null;\n  transform(value: string|null|undefined): string|null {\n    if (value == null) return null;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(UpperCasePipe, value);\n    }\n    return value.toUpperCase();\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\nimport {Inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\nimport {formatDate} from '../i18n/format_date';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n// clang-format off\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a date value according to locale rules.\n *\n * Only the `en-US` locale data comes with Angular. To localize dates\n * in another language, you must import the corresponding locale data.\n * See the [I18n guide](guide/i18n#i18n-pipes) for more information.\n *\n * @see `formatDate()`\n *\n *\n * @usageNotes\n *\n * The result of this pipe is not reevaluated when the input is mutated. To avoid the need to\n * reformat the date on every change-detection cycle, treat the date as an immutable object\n * and change the reference when the pipe needs to run again.\n *\n * ### Pre-defined format options\n *\n * | Option        | Equivalent to                       | Examples (given in `en-US` locale)              |\n * |---------------|-------------------------------------|-------------------------------------------------|\n * | `'short'`     | `'M/d/yy, h:mm a'`                  | `6/15/15, 9:03 AM`                              |\n * | `'medium'`    | `'MMM d, y, h:mm:ss a'`             | `Jun 15, 2015, 9:03:01 AM`                      |\n * | `'long'`      | `'MMMM d, y, h:mm:ss a z'`          | `June 15, 2015 at 9:03:01 AM GMT+1`             |\n * | `'full'`      | `'EEEE, MMMM d, y, h:mm:ss a zzzz'` | `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00` |\n * | `'shortDate'` | `'M/d/yy'`                          | `6/15/15`                                       |\n * | `'mediumDate'`| `'MMM d, y'`                        | `Jun 15, 2015`                                  |\n * | `'longDate'`  | `'MMMM d, y'`                       | `June 15, 2015`                                 |\n * | `'fullDate'`  | `'EEEE, MMMM d, y'`                 | `Monday, June 15, 2015`                         |\n * | `'shortTime'` | `'h:mm a'`                          | `9:03 AM`                                       |\n * | `'mediumTime'`| `'h:mm:ss a'`                       | `9:03:01 AM`                                    |\n * | `'longTime'`  | `'h:mm:ss a z'`                     | `9:03:01 AM GMT+1`                              |\n * | `'fullTime'`  | `'h:mm:ss a zzzz'`                  | `9:03:01 AM GMT+01:00`                          |\n *\n * ### Custom format options\n *\n * You can construct a format string using symbols to specify the components\n * of a date-time value, as described in the following table.\n * Format details depend on the locale.\n * Fields marked with (*) are only available in the extra data set for the given locale.\n *\n *  | Field type         | Format      | Description                                                   | Example Value                                              |\n *  |--------------------|-------------|---------------------------------------------------------------|------------------------------------------------------------|\n *  | Era                | G, GG & GGG | Abbreviated                                                   | AD                                                         |\n *  |                    | GGGG        | Wide                                                          | Anno Domini                                                |\n *  |                    | GGGGG       | Narrow                                                        | A                                                          |\n *  | Year               | y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |\n *  |                    | yy          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |\n *  |                    | yyy         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |\n *  |                    | yyyy        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |\n *  | Week-numbering year| Y           | Numeric: minimum digits                                       | 2, 20, 201, 2017, 20173                                    |\n *  |                    | YY          | Numeric: 2 digits + zero padded                               | 02, 20, 01, 17, 73                                         |\n *  |                    | YYY         | Numeric: 3 digits + zero padded                               | 002, 020, 201, 2017, 20173                                 |\n *  |                    | YYYY        | Numeric: 4 digits or more + zero padded                       | 0002, 0020, 0201, 2017, 20173                              |\n *  | Month              | M           | Numeric: 1 digit                                              | 9, 12                                                      |\n *  |                    | MM          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |\n *  |                    | MMM         | Abbreviated                                                   | Sep                                                        |\n *  |                    | MMMM        | Wide                                                          | September                                                  |\n *  |                    | MMMMM       | Narrow                                                        | S                                                          |\n *  | Month standalone   | L           | Numeric: 1 digit                                              | 9, 12                                                      |\n *  |                    | LL          | Numeric: 2 digits + zero padded                               | 09, 12                                                     |\n *  |                    | LLL         | Abbreviated                                                   | Sep                                                        |\n *  |                    | LLLL        | Wide                                                          | September                                                  |\n *  |                    | LLLLL       | Narrow                                                        | S                                                          |\n *  | Week of year       | w           | Numeric: minimum digits                                       | 1... 53                                                    |\n *  |                    | ww          | Numeric: 2 digits + zero padded                               | 01... 53                                                   |\n *  | Week of month      | W           | Numeric: 1 digit                                              | 1... 5                                                     |\n *  | Day of month       | d           | Numeric: minimum digits                                       | 1                                                          |\n *  |                    | dd          | Numeric: 2 digits + zero padded                               | 01                                                          |\n *  | Week day           | E, EE & EEE | Abbreviated                                                   | Tue                                                        |\n *  |                    | EEEE        | Wide                                                          | Tuesday                                                    |\n *  |                    | EEEEE       | Narrow                                                        | T                                                          |\n *  |                    | EEEEEE      | Short                                                         | Tu                                                         |\n *  | Period             | a, aa & aaa | Abbreviated                                                   | am/pm or AM/PM                                             |\n *  |                    | aaaa        | Wide (fallback to `a` when missing)                           | ante meridiem/post meridiem                                |\n *  |                    | aaaaa       | Narrow                                                        | a/p                                                        |\n *  | Period*            | B, BB & BBB | Abbreviated                                                   | mid.                                                       |\n *  |                    | BBBB        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |\n *  |                    | BBBBB       | Narrow                                                        | md                                                         |\n *  | Period standalone* | b, bb & bbb | Abbreviated                                                   | mid.                                                       |\n *  |                    | bbbb        | Wide                                                          | am, pm, midnight, noon, morning, afternoon, evening, night |\n *  |                    | bbbbb       | Narrow                                                        | md                                                         |\n *  | Hour 1-12          | h           | Numeric: minimum digits                                       | 1, 12                                                      |\n *  |                    | hh          | Numeric: 2 digits + zero padded                               | 01, 12                                                     |\n *  | Hour 0-23          | H           | Numeric: minimum digits                                       | 0, 23                                                      |\n *  |                    | HH          | Numeric: 2 digits + zero padded                               | 00, 23                                                     |\n *  | Minute             | m           | Numeric: minimum digits                                       | 8, 59                                                      |\n *  |                    | mm          | Numeric: 2 digits + zero padded                               | 08, 59                                                     |\n *  | Second             | s           | Numeric: minimum digits                                       | 0... 59                                                    |\n *  |                    | ss          | Numeric: 2 digits + zero padded                               | 00... 59                                                   |\n *  | Fractional seconds | S           | Numeric: 1 digit                                              | 0... 9                                                     |\n *  |                    | SS          | Numeric: 2 digits + zero padded                               | 00... 99                                                   |\n *  |                    | SSS         | Numeric: 3 digits + zero padded (= milliseconds)              | 000... 999                                                 |\n *  | Zone               | z, zz & zzz | Short specific non location format (fallback to O)            | GMT-8                                                      |\n *  |                    | zzzz        | Long specific non location format (fallback to OOOO)          | GMT-08:00                                                  |\n *  |                    | Z, ZZ & ZZZ | ISO8601 basic format                                          | -0800                                                      |\n *  |                    | ZZZZ        | Long localized GMT format                                     | GMT-8:00                                                   |\n *  |                    | ZZZZZ       | ISO8601 extended format + Z indicator for offset 0 (= XXXXX)  | -08:00                                                     |\n *  |                    | O, OO & OOO | Short localized GMT format                                    | GMT-8                                                      |\n *  |                    | OOOO        | Long localized GMT format                                     | GMT-08:00                                                  |\n *\n *\n * ### Format examples\n *\n * These examples transform a date into various formats,\n * assuming that `dateObj` is a JavaScript `Date` object for\n * year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11,\n * given in the local time for the `en-US` locale.\n *\n * ```\n * {{ dateObj | date }}               // output is 'Jun 15, 2015'\n * {{ dateObj | date:'medium' }}      // output is 'Jun 15, 2015, 9:43:11 PM'\n * {{ dateObj | date:'shortTime' }}   // output is '9:43 PM'\n * {{ dateObj | date:'mm:ss' }}       // output is '43:11'\n * ```\n *\n * ### Usage example\n *\n * The following component uses a date pipe to display the current date in different formats.\n *\n * ```\n * @Component({\n *  selector: 'date-pipe',\n *  template: `<div>\n *    <p>Today is {{today | date}}</p>\n *    <p>Or if you prefer, {{today | date:'fullDate'}}</p>\n *    <p>The time is {{today | date:'h:mm a z'}}</p>\n *  </div>`\n * })\n * // Get the current date and time as a date-time value.\n * export class DatePipeComponent {\n *   today: number = Date.now();\n * }\n * ```\n *\n * @publicApi\n */\n// clang-format on\n@Pipe({name: 'date', pure: true})\nexport class DatePipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private locale: string) {}\n\n  /**\n   * @param value The date expression: a `Date` object,  a number\n   * (milliseconds since UTC epoch), or an ISO string (https://www.w3.org/TR/NOTE-datetime).\n   * @param format The date/time components to include, using predefined options or a\n   * custom format string.\n   * @param timezone A timezone offset (such as `'+0430'`), or a standard\n   * UTC/GMT or continental US timezone abbreviation.\n   * When not supplied, uses the end-user's local system timezone.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n#setting-up-the-locale-of-your-app).\n   * @returns A date string in the desired format.\n   */\n  transform(value: Date|string|number, format?: string, timezone?: string, locale?: string): string\n      |null;\n  transform(value: null|undefined, format?: string, timezone?: string, locale?: string): null;\n  transform(\n      value: Date|string|number|null|undefined, format?: string, timezone?: string,\n      locale?: string): string|null;\n  transform(\n      value: Date|string|number|null|undefined, format = 'mediumDate', timezone?: string,\n      locale?: string): string|null {\n    if (value == null || value === '' || value !== value) return null;\n\n    try {\n      return formatDate(value, format, locale || this.locale, timezone);\n    } catch (error) {\n      throw invalidPipeArgumentError(DatePipe, error.message);\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\nimport {Pipe, PipeTransform} from '@angular/core';\n\nimport {getPluralCategory, NgLocalization} from '../i18n/localization';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\nconst _INTERPOLATION_REGEXP: RegExp = /#/g;\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Maps a value to a string that pluralizes the value according to locale rules.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}\n *\n * @publicApi\n */\n@Pipe({name: 'i18nPlural', pure: true})\nexport class I18nPluralPipe implements PipeTransform {\n  constructor(private _localization: NgLocalization) {}\n\n  /**\n   * @param value the number to be formatted\n   * @param pluralMap an object that mimics the ICU format, see\n   * http://userguide.icu-project.org/formatparse/messages.\n   * @param locale a `string` defining the locale to use (uses the current {@link LOCALE_ID} by\n   * default).\n   */\n  transform(value: number|null|undefined, pluralMap: {[count: string]: string}, locale?: string):\n      string {\n    if (value == null) return '';\n\n    if (typeof pluralMap !== 'object' || pluralMap === null) {\n      throw invalidPipeArgumentError(I18nPluralPipe, pluralMap);\n    }\n\n    const key = getPluralCategory(value, Object.keys(pluralMap), this._localization, locale);\n\n    return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Generic selector that displays the string that matches the current value.\n *\n * If none of the keys of the `mapping` match the `value`, then the content\n * of the `other` key is returned when present, otherwise an empty string is returned.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}\n *\n * @publicApi\n */\n@Pipe({name: 'i18nSelect', pure: true})\nexport class I18nSelectPipe implements PipeTransform {\n  /**\n   * @param value a string to be internationalized.\n   * @param mapping an object that indicates the text that should be displayed\n   * for different values of the provided `value`.\n   */\n  transform(value: string|null|undefined, mapping: {[key: string]: string}): string {\n    if (value == null) return '';\n\n    if (typeof mapping !== 'object' || typeof value !== 'string') {\n      throw invalidPipeArgumentError(I18nSelectPipe, mapping);\n    }\n\n    if (mapping.hasOwnProperty(value)) {\n      return mapping[value];\n    }\n\n    if (mapping.hasOwnProperty('other')) {\n      return mapping['other'];\n    }\n\n    return '';\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\nimport {Pipe, PipeTransform} from '@angular/core';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Converts a value into its JSON-format representation.  Useful for debugging.\n *\n * @usageNotes\n *\n * The following component uses a JSON pipe to convert an object\n * to JSON format, and displays the string in both formats for comparison.\n *\n * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}\n *\n * @publicApi\n */\n@Pipe({name: 'json', pure: false})\nexport class JsonPipe implements PipeTransform {\n  /**\n   * @param value A value of any type to convert into a JSON-format string.\n   */\n  transform(value: any): string {\n    return JSON.stringify(value, null, 2);\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\nimport {KeyValueChangeRecord, KeyValueChanges, KeyValueDiffer, KeyValueDiffers, Pipe, PipeTransform} from '@angular/core';\n\nfunction makeKeyValuePair<K, V>(key: K, value: V): KeyValue<K, V> {\n  return {key: key, value: value};\n}\n\n/**\n * A key value pair.\n * Usually used to represent the key value pairs from a Map or Object.\n *\n * @publicApi\n */\nexport interface KeyValue<K, V> {\n  key: K;\n  value: V;\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms Object or Map into an array of key value pairs.\n *\n * The output array will be ordered by keys.\n * By default the comparator will be by Unicode point value.\n * You can optionally pass a compareFn if your keys are complex types.\n *\n * @usageNotes\n * ### Examples\n *\n * This examples show how an Object or a Map can be iterated by ngFor with the use of this\n * keyvalue pipe.\n *\n * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}\n *\n * @publicApi\n */\n@Pipe({name: 'keyvalue', pure: false})\nexport class KeyValuePipe implements PipeTransform {\n  constructor(private readonly differs: KeyValueDiffers) {}\n\n  private differ!: KeyValueDiffer<any, any>;\n  private keyValues: Array<KeyValue<any, any>> = [];\n\n  /*\n   * NOTE: when the `input` value is a simple Record<K, V> object, the keys are extracted with\n   * Object.keys(). This means that even if the `input` type is Record<number, V> the keys are\n   * compared/returned as `string`s.\n   */\n  transform<K, V>(\n      input: ReadonlyMap<K, V>,\n      compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number): Array<KeyValue<K, V>>;\n  transform<K extends number, V>(\n      input: Record<K, V>, compareFn?: (a: KeyValue<string, V>, b: KeyValue<string, V>) => number):\n      Array<KeyValue<string, V>>;\n  transform<K extends string, V>(\n      input: Record<K, V>|ReadonlyMap<K, V>,\n      compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number): Array<KeyValue<K, V>>;\n  transform(\n      input: null|undefined,\n      compareFn?: (a: KeyValue<unknown, unknown>, b: KeyValue<unknown, unknown>) => number): null;\n  transform<K, V>(\n      input: ReadonlyMap<K, V>|null|undefined,\n      compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number): Array<KeyValue<K, V>>|null;\n  transform<K extends number, V>(\n      input: Record<K, V>|null|undefined,\n      compareFn?: (a: KeyValue<string, V>, b: KeyValue<string, V>) => number):\n      Array<KeyValue<string, V>>|null;\n  transform<K extends string, V>(\n      input: Record<K, V>|ReadonlyMap<K, V>|null|undefined,\n      compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number): Array<KeyValue<K, V>>|null;\n  transform<K, V>(\n      input: undefined|null|{[key: string]: V, [key: number]: V}|ReadonlyMap<K, V>,\n      compareFn: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number = defaultComparator):\n      Array<KeyValue<K, V>>|null {\n    if (!input || (!(input instanceof Map) && typeof input !== 'object')) {\n      return null;\n    }\n\n    if (!this.differ) {\n      // make a differ for whatever type we've been passed in\n      this.differ = this.differs.find(input).create();\n    }\n\n    const differChanges: KeyValueChanges<K, V>|null = this.differ.diff(input as any);\n\n    if (differChanges) {\n      this.keyValues = [];\n      differChanges.forEachItem((r: KeyValueChangeRecord<K, V>) => {\n        this.keyValues.push(makeKeyValuePair(r.key, r.currentValue!));\n      });\n      this.keyValues.sort(compareFn);\n    }\n    return this.keyValues;\n  }\n}\n\nexport function defaultComparator<K, V>(\n    keyValueA: KeyValue<K, V>, keyValueB: KeyValue<K, V>): number {\n  const a = keyValueA.key;\n  const b = keyValueB.key;\n  // if same exit with 0;\n  if (a === b) return 0;\n  // make sure that undefined are at the end of the sort.\n  if (a === undefined) return 1;\n  if (b === undefined) return -1;\n  // make sure that nulls are at the end of the sort.\n  if (a === null) return 1;\n  if (b === null) return -1;\n  if (typeof a == 'string' && typeof b == 'string') {\n    return a < b ? -1 : 1;\n  }\n  if (typeof a == 'number' && typeof b == 'number') {\n    return a - b;\n  }\n  if (typeof a == 'boolean' && typeof b == 'boolean') {\n    return a < b ? -1 : 1;\n  }\n  // `a` and `b` are of different types. Compare their string values.\n  const aString = String(a);\n  const bString = String(b);\n  return aString == bString ? 0 : aString < bString ? -1 : 1;\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\nimport {DEFAULT_CURRENCY_CODE, Inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\nimport {formatCurrency, formatNumber, formatPercent} from '../i18n/format_number';\nimport {getCurrencySymbol} from '../i18n/locale_data_api';\n\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a value according to digit options and locale rules.\n * Locale determines group sizing and separator,\n * decimal point character, and other locale-specific configurations.\n *\n * @see `formatNumber()`\n *\n * @usageNotes\n *\n * ### digitsInfo\n *\n * The value's decimal representation is specified by the `digitsInfo`\n * parameter, written in the following format:<br>\n *\n * ```\n * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}\n * ```\n *\n *  - `minIntegerDigits`:\n * The minimum number of integer digits before the decimal point.\n * Default is 1.\n *\n * - `minFractionDigits`:\n * The minimum number of digits after the decimal point.\n * Default is 0.\n *\n *  - `maxFractionDigits`:\n * The maximum number of digits after the decimal point.\n * Default is 3.\n *\n * If the formatted value is truncated it will be rounded using the \"to-nearest\" method:\n *\n * ```\n * {{3.6 | number: '1.0-0'}}\n * <!--will output '4'-->\n *\n * {{-3.6 | number:'1.0-0'}}\n * <!--will output '-4'-->\n * ```\n *\n * ### locale\n *\n * `locale` will format a value according to locale rules.\n * Locale determines group sizing and separator,\n * decimal point character, and other locale-specific configurations.\n *\n * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n *\n * See [Setting your app locale](guide/i18n#setting-up-the-locale-of-your-app).\n *\n * ### Example\n *\n * The following code shows how the pipe transforms values\n * according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * <code-example path=\"common/pipes/ts/number_pipe.ts\" region='NumberPipe'></code-example>\n *\n * @publicApi\n */\n@Pipe({name: 'number'})\nexport class DecimalPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n  transform(value: number|string, digitsInfo?: string, locale?: string): string|null;\n  transform(value: null|undefined, digitsInfo?: string, locale?: string): null;\n  transform(value: number|string|null|undefined, digitsInfo?: string, locale?: string): string|null;\n\n  /**\n   * @param value The value to be formatted.\n   * @param digitsInfo Sets digit and decimal representation.\n   * [See more](#digitsinfo).\n   * @param locale Specifies what locale format rules to use.\n   * [See more](#locale).\n   */\n  transform(value: number|string|null|undefined, digitsInfo?: string, locale?: string): string\n      |null {\n    if (!isValue(value)) return null;\n\n    locale = locale || this._locale;\n\n    try {\n      const num = strToNumber(value);\n      return formatNumber(num, locale, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(DecimalPipe, error.message);\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms a number to a percentage\n * string, formatted according to locale rules that determine group sizing and\n * separator, decimal-point character, and other locale-specific\n * configurations.\n *\n * @see `formatPercent()`\n *\n * @usageNotes\n * The following code shows how the pipe transforms numbers\n * into text strings, according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * <code-example path=\"common/pipes/ts/percent_pipe.ts\" region='PercentPipe'></code-example>\n *\n * @publicApi\n */\n@Pipe({name: 'percent'})\nexport class PercentPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  /**\n   *\n   * @param value The number to be formatted as a percentage.\n   * @param digitsInfo Decimal representation options, specified by a string\n   * in the following format:<br>\n   * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.\n   *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.\n   * Default is `1`.\n   *   - `minFractionDigits`: The minimum number of digits after the decimal point.\n   * Default is `0`.\n   *   - `maxFractionDigits`: The maximum number of digits after the decimal point.\n   * Default is `0`.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n#setting-up-the-locale-of-your-app).\n   */\n  transform(value: number|string, digitsInfo?: string, locale?: string): string|null;\n  transform(value: null|undefined, digitsInfo?: string, locale?: string): null;\n  transform(value: number|string|null|undefined, digitsInfo?: string, locale?: string): string|null;\n  transform(value: number|string|null|undefined, digitsInfo?: string, locale?: string): string\n      |null {\n    if (!isValue(value)) return null;\n    locale = locale || this._locale;\n    try {\n      const num = strToNumber(value);\n      return formatPercent(num, locale, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(PercentPipe, error.message);\n    }\n  }\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms a number to a currency string, formatted according to locale rules\n * that determine group sizing and separator, decimal-point character,\n * and other locale-specific configurations.\n *\n * {@a currency-code-deprecation}\n * <div class=\"alert is-helpful\">\n *\n * **Deprecation notice:**\n *\n * The default currency code is currently always `USD` but this is deprecated from v9.\n *\n * **In v11 the default currency code will be taken from the current locale identified by\n * the `LOCALE_ID` token. See the [i18n guide](guide/i18n#setting-up-the-locale-of-your-app) for\n * more information.**\n *\n * If you need the previous behavior then set it by creating a `DEFAULT_CURRENCY_CODE` provider in\n * your application `NgModule`:\n *\n * ```ts\n * {provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}\n * ```\n *\n * </div>\n *\n * @see `getCurrencySymbol()`\n * @see `formatCurrency()`\n *\n * @usageNotes\n * The following code shows how the pipe transforms numbers\n * into text strings, according to various format specifications,\n * where the caller's default locale is `en-US`.\n *\n * <code-example path=\"common/pipes/ts/currency_pipe.ts\" region='CurrencyPipe'></code-example>\n *\n * @publicApi\n */\n@Pipe({name: 'currency'})\nexport class CurrencyPipe implements PipeTransform {\n  constructor(\n      @Inject(LOCALE_ID) private _locale: string,\n      @Inject(DEFAULT_CURRENCY_CODE) private _defaultCurrencyCode: string = 'USD') {}\n\n  /**\n   *\n   * @param value The number to be formatted as currency.\n   * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code,\n   * such as `USD` for the US dollar and `EUR` for the euro. The default currency code can be\n   * configured using the `DEFAULT_CURRENCY_CODE` injection token.\n   * @param display The format for the currency indicator. One of the following:\n   *   - `code`: Show the code (such as `USD`).\n   *   - `symbol`(default): Show the symbol (such as `$`).\n   *   - `symbol-narrow`: Use the narrow symbol for locales that have two symbols for their\n   * currency.\n   * For example, the Canadian dollar CAD has the symbol `CA$` and the symbol-narrow `$`. If the\n   * locale has no narrow symbol, uses the standard symbol for the locale.\n   *   - String: Use the given string value instead of a code or a symbol.\n   * For example, an empty string will suppress the currency & symbol.\n   *   - Boolean (marked deprecated in v5): `true` for symbol and false for `code`.\n   *\n   * @param digitsInfo Decimal representation options, specified by a string\n   * in the following format:<br>\n   * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>.\n   *   - `minIntegerDigits`: The minimum number of integer digits before the decimal point.\n   * Default is `1`.\n   *   - `minFractionDigits`: The minimum number of digits after the decimal point.\n   * Default is `2`.\n   *   - `maxFractionDigits`: The maximum number of digits after the decimal point.\n   * Default is `2`.\n   * If not provided, the number will be formatted with the proper amount of digits,\n   * depending on what the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) specifies.\n   * For example, the Canadian dollar has 2 digits, whereas the Chilean peso has none.\n   * @param locale A locale code for the locale format rules to use.\n   * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.\n   * See [Setting your app locale](guide/i18n#setting-up-the-locale-of-your-app).\n   */\n  transform(\n      value: number|string, currencyCode?: string,\n      display?: 'code'|'symbol'|'symbol-narrow'|string|boolean, digitsInfo?: string,\n      locale?: string): string|null;\n  transform(\n      value: null|undefined, currencyCode?: string,\n      display?: 'code'|'symbol'|'symbol-narrow'|string|boolean, digitsInfo?: string,\n      locale?: string): null;\n  transform(\n      value: number|string|null|undefined, currencyCode?: string,\n      display?: 'code'|'symbol'|'symbol-narrow'|string|boolean, digitsInfo?: string,\n      locale?: string): string|null;\n  transform(\n      value: number|string|null|undefined, currencyCode?: string,\n      display: 'code'|'symbol'|'symbol-narrow'|string|boolean = 'symbol', digitsInfo?: string,\n      locale?: string): string|null {\n    if (!isValue(value)) return null;\n\n    locale = locale || this._locale;\n\n    if (typeof display === 'boolean') {\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && <any>console && <any>console.warn) {\n        console.warn(\n            `Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are \"code\", \"symbol\" or \"symbol-narrow\".`);\n      }\n      display = display ? 'symbol' : 'code';\n    }\n\n    let currency: string = currencyCode || this._defaultCurrencyCode;\n    if (display !== 'code') {\n      if (display === 'symbol' || display === 'symbol-narrow') {\n        currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);\n      } else {\n        currency = display;\n      }\n    }\n\n    try {\n      const num = strToNumber(value);\n      return formatCurrency(num, locale, currency, currencyCode, digitsInfo);\n    } catch (error) {\n      throw invalidPipeArgumentError(CurrencyPipe, error.message);\n    }\n  }\n}\n\nfunction isValue(value: number|string|null|undefined): value is number|string {\n  return !(value == null || value === '' || value !== value);\n}\n\n/**\n * Transforms a string into a number (if needed).\n */\nfunction strToNumber(value: number|string): number {\n  // Convert strings to numbers\n  if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {\n    return Number(value);\n  }\n  if (typeof value !== 'number') {\n    throw new Error(`${value} is not a number`);\n  }\n  return value;\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Creates a new `Array` or `String` containing a subset (slice) of the elements.\n *\n * @usageNotes\n *\n * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`\n * and `String.prototype.slice()`.\n *\n * When operating on an `Array`, the returned `Array` is always a copy even when all\n * the elements are being returned.\n *\n * When operating on a blank value, the pipe returns the blank value.\n *\n * ### List Example\n *\n * This `ngFor` example:\n *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}\n *\n * produces the following:\n *\n * ```html\n * <li>b</li>\n * <li>c</li>\n * ```\n *\n * ### String Examples\n *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}\n *\n * @publicApi\n */\n@Pipe({name: 'slice', pure: false})\nexport class SlicePipe implements PipeTransform {\n  /**\n   * @param value a list or a string to be sliced.\n   * @param start the starting index of the subset to return:\n   *   - **a positive integer**: return the item at `start` index and all items after\n   *     in the list or string expression.\n   *   - **a negative integer**: return the item at `start` index from the end and all items after\n   *     in the list or string expression.\n   *   - **if positive and greater than the size of the expression**: return an empty list or\n   * string.\n   *   - **if negative and greater than the size of the expression**: return entire list or string.\n   * @param end the ending index of the subset to return:\n   *   - **omitted**: return all items until the end.\n   *   - **if positive**: return all items before `end` index of the list or string.\n   *   - **if negative**: return all items before `end` index from the end of the list or string.\n   */\n  transform<T>(value: ReadonlyArray<T>, start: number, end?: number): Array<T>;\n  transform(value: null|undefined, start: number, end?: number): null;\n  transform<T>(value: ReadonlyArray<T>|null|undefined, start: number, end?: number): Array<T>|null;\n  transform(value: string, start: number, end?: number): string;\n  transform(value: string|null|undefined, start: number, end?: number): string|null;\n  transform<T>(value: ReadonlyArray<T>|string|null|undefined, start: number, end?: number):\n      Array<T>|string|null {\n    if (value == null) return null;\n\n    if (!this.supports(value)) {\n      throw invalidPipeArgumentError(SlicePipe, value);\n    }\n\n    return value.slice(start, end);\n  }\n\n  private supports(obj: any): boolean {\n    return typeof obj === 'string' || Array.isArray(obj);\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 * @module\n * @description\n * This module provides a set of common Pipes.\n */\nimport {AsyncPipe} from './async_pipe';\nimport {LowerCasePipe, TitleCasePipe, UpperCasePipe} from './case_conversion_pipes';\nimport {DatePipe} from './date_pipe';\nimport {I18nPluralPipe} from './i18n_plural_pipe';\nimport {I18nSelectPipe} from './i18n_select_pipe';\nimport {JsonPipe} from './json_pipe';\nimport {KeyValue, KeyValuePipe} from './keyvalue_pipe';\nimport {CurrencyPipe, DecimalPipe, PercentPipe} from './number_pipe';\nimport {SlicePipe} from './slice_pipe';\n\nexport {\n  AsyncPipe,\n  CurrencyPipe,\n  DatePipe,\n  DecimalPipe,\n  I18nPluralPipe,\n  I18nSelectPipe,\n  JsonPipe,\n  KeyValue,\n  KeyValuePipe,\n  LowerCasePipe,\n  PercentPipe,\n  SlicePipe,\n  TitleCasePipe,\n  UpperCasePipe,\n};\n\n\n/**\n * A collection of Angular pipes that are likely to be used in each and every application.\n */\nexport const COMMON_PIPES = [\n  AsyncPipe,\n  UpperCasePipe,\n  LowerCasePipe,\n  JsonPipe,\n  SlicePipe,\n  DecimalPipe,\n  PercentPipe,\n  TitleCasePipe,\n  CurrencyPipe,\n  DatePipe,\n  I18nPluralPipe,\n  I18nSelectPipe,\n  KeyValuePipe,\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\nimport {NgModule} from '@angular/core';\nimport {COMMON_DIRECTIVES} from './directives/index';\nimport {NgLocaleLocalization, NgLocalization} from './i18n/localization';\nimport {COMMON_PIPES} from './pipes/index';\n\n\n// Note: This does not contain the location providers,\n// as they need some platform specific implementations to work.\n/**\n * Exports all the basic Angular directives and pipes,\n * such as `NgIf`, `NgForOf`, `DecimalPipe`, and so on.\n * Re-exported by `BrowserModule`, which is included automatically in the root\n * `AppModule` when you create a new app with the CLI `new` command.\n *\n * * The `providers` options configure the NgModule's injector to provide\n * localization dependencies to members.\n * * The `exports` options make the declared directives and pipes available for import\n * by other NgModules.\n *\n * @publicApi\n */\n@NgModule({\n  declarations: [COMMON_DIRECTIVES, COMMON_PIPES],\n  exports: [COMMON_DIRECTIVES, COMMON_PIPES],\n  providers: [\n    {provide: NgLocalization, useClass: NgLocaleLocalization},\n  ],\n})\nexport class CommonModule {\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\nexport const PLATFORM_BROWSER_ID = 'browser';\nexport const PLATFORM_SERVER_ID = 'server';\nexport const PLATFORM_WORKER_APP_ID = 'browserWorkerApp';\nexport const PLATFORM_WORKER_UI_ID = 'browserWorkerUi';\n\n/**\n * Returns whether a platform id represents a browser platform.\n * @publicApi\n */\nexport function isPlatformBrowser(platformId: Object): boolean {\n  return platformId === PLATFORM_BROWSER_ID;\n}\n\n/**\n * Returns whether a platform id represents a server platform.\n * @publicApi\n */\nexport function isPlatformServer(platformId: Object): boolean {\n  return platformId === PLATFORM_SERVER_ID;\n}\n\n/**\n * Returns whether a platform id represents a web worker app platform.\n * @publicApi\n */\nexport function isPlatformWorkerApp(platformId: Object): boolean {\n  return platformId === PLATFORM_WORKER_APP_ID;\n}\n\n/**\n * Returns whether a platform id represents a web worker UI platform.\n * @publicApi\n */\nexport function isPlatformWorkerUi(platformId: Object): boolean {\n  return platformId === PLATFORM_WORKER_UI_ID;\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 * @module\n * @description\n * Entry point for all public APIs of the common package.\n */\n\nimport {Version} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport const VERSION = new Version('11.2.14');\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\nimport {ɵɵdefineInjectable, ɵɵinject} from '@angular/core';\n\nimport {DOCUMENT} from './dom_tokens';\n\n\n\n/**\n * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.\n *\n * @publicApi\n */\nexport abstract class ViewportScroller {\n  // De-sugared tree-shakable injection\n  // See #23917\n  /** @nocollapse */\n  static ɵprov = ɵɵdefineInjectable({\n    token: ViewportScroller,\n    providedIn: 'root',\n    factory: () => new BrowserViewportScroller(ɵɵinject(DOCUMENT), window)\n  });\n\n  /**\n   * Configures the top offset used when scrolling to an anchor.\n   * @param offset A position in screen coordinates (a tuple with x and y values)\n   * or a function that returns the top offset position.\n   *\n   */\n  abstract setOffset(offset: [number, number]|(() => [number, number])): void;\n\n  /**\n   * Retrieves the current scroll position.\n   * @returns A position in screen coordinates (a tuple with x and y values).\n   */\n  abstract getScrollPosition(): [number, number];\n\n  /**\n   * Scrolls to a specified position.\n   * @param position A position in screen coordinates (a tuple with x and y values).\n   */\n  abstract scrollToPosition(position: [number, number]): void;\n\n  /**\n   * Scrolls to an anchor element.\n   * @param anchor The ID of the anchor element.\n   */\n  abstract scrollToAnchor(anchor: string): void;\n\n  /**\n   * Disables automatic scroll restoration provided by the browser.\n   * See also [window.history.scrollRestoration\n   * info](https://developers.google.com/web/updates/2015/09/history-api-scroll-restoration).\n   */\n  abstract setHistoryScrollRestoration(scrollRestoration: 'auto'|'manual'): void;\n}\n\n/**\n * Manages the scroll position for a browser window.\n */\nexport class BrowserViewportScroller implements ViewportScroller {\n  private offset: () => [number, number] = () => [0, 0];\n\n  constructor(private document: Document, private window: Window) {}\n\n  /**\n   * Configures the top offset used when scrolling to an anchor.\n   * @param offset A position in screen coordinates (a tuple with x and y values)\n   * or a function that returns the top offset position.\n   *\n   */\n  setOffset(offset: [number, number]|(() => [number, number])): void {\n    if (Array.isArray(offset)) {\n      this.offset = () => offset;\n    } else {\n      this.offset = offset;\n    }\n  }\n\n  /**\n   * Retrieves the current scroll position.\n   * @returns The position in screen coordinates.\n   */\n  getScrollPosition(): [number, number] {\n    if (this.supportsScrolling()) {\n      return [this.window.pageXOffset, this.window.pageYOffset];\n    } else {\n      return [0, 0];\n    }\n  }\n\n  /**\n   * Sets the scroll position.\n   * @param position The new position in screen coordinates.\n   */\n  scrollToPosition(position: [number, number]): void {\n    if (this.supportsScrolling()) {\n      this.window.scrollTo(position[0], position[1]);\n    }\n  }\n\n  /**\n   * Scrolls to an element and attempts to focus the element.\n   *\n   * Note that the function name here is misleading in that the target string may be an ID for a\n   * non-anchor element.\n   *\n   * @param target The ID of an element or name of the anchor.\n   *\n   * @see https://html.spec.whatwg.org/#the-indicated-part-of-the-document\n   * @see https://html.spec.whatwg.org/#scroll-to-fragid\n   */\n  scrollToAnchor(target: string): void {\n    if (!this.supportsScrolling()) {\n      return;\n    }\n    // TODO(atscott): The correct behavior for `getElementsByName` would be to also verify that the\n    // element is an anchor. However, this could be considered a breaking change and should be\n    // done in a major version.\n    const elSelected = findAnchorFromDocument(this.document, target);\n\n    if (elSelected) {\n      this.scrollToElement(elSelected);\n      // After scrolling to the element, the spec dictates that we follow the focus steps for the\n      // target. Rather than following the robust steps, simply attempt focus.\n      this.attemptFocus(elSelected);\n    }\n  }\n\n  /**\n   * Disables automatic scroll restoration provided by the browser.\n   */\n  setHistoryScrollRestoration(scrollRestoration: 'auto'|'manual'): void {\n    if (this.supportScrollRestoration()) {\n      const history = this.window.history;\n      if (history && history.scrollRestoration) {\n        history.scrollRestoration = scrollRestoration;\n      }\n    }\n  }\n\n  /**\n   * Scrolls to an element using the native offset and the specified offset set on this scroller.\n   *\n   * The offset can be used when we know that there is a floating header and scrolling naively to an\n   * element (ex: `scrollIntoView`) leaves the element hidden behind the floating header.\n   */\n  private scrollToElement(el: HTMLElement): void {\n    const rect = el.getBoundingClientRect();\n    const left = rect.left + this.window.pageXOffset;\n    const top = rect.top + this.window.pageYOffset;\n    const offset = this.offset();\n    this.window.scrollTo(left - offset[0], top - offset[1]);\n  }\n\n  /**\n   * Calls `focus` on the `focusTarget` and returns `true` if the element was focused successfully.\n   *\n   * If `false`, further steps may be necessary to determine a valid substitute to be focused\n   * instead.\n   *\n   * @see https://html.spec.whatwg.org/#get-the-focusable-area\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/focus\n   * @see https://html.spec.whatwg.org/#focusable-area\n   */\n  private attemptFocus(focusTarget: HTMLElement): boolean {\n    focusTarget.focus();\n    return this.document.activeElement === focusTarget;\n  }\n\n  /**\n   * We only support scroll restoration when we can get a hold of window.\n   * This means that we do not support this behavior when running in a web worker.\n   *\n   * Lifting this restriction right now would require more changes in the dom adapter.\n   * Since webworkers aren't widely used, we will lift it once RouterScroller is\n   * battle-tested.\n   */\n  private supportScrollRestoration(): boolean {\n    try {\n      if (!this.supportsScrolling()) {\n        return false;\n      }\n      // The `scrollRestoration` property could be on the `history` instance or its prototype.\n      const scrollRestorationDescriptor = getScrollRestorationProperty(this.window.history) ||\n          getScrollRestorationProperty(Object.getPrototypeOf(this.window.history));\n      // We can write to the `scrollRestoration` property if it is a writable data field or it has a\n      // setter function.\n      return !!scrollRestorationDescriptor &&\n          !!(scrollRestorationDescriptor.writable || scrollRestorationDescriptor.set);\n    } catch {\n      return false;\n    }\n  }\n\n  private supportsScrolling(): boolean {\n    try {\n      return !!this.window && !!this.window.scrollTo && 'pageXOffset' in this.window;\n    } catch {\n      return false;\n    }\n  }\n}\n\nfunction getScrollRestorationProperty(obj: any): PropertyDescriptor|undefined {\n  return Object.getOwnPropertyDescriptor(obj, 'scrollRestoration');\n}\n\nfunction findAnchorFromDocument(document: Document, target: string): HTMLElement|null {\n  const documentResult = document.getElementById(target) || document.getElementsByName(target)[0];\n\n  if (documentResult) {\n    return documentResult;\n  }\n\n  // `getElementById` and `getElementsByName` won't pierce through the shadow DOM so we\n  // have to traverse the DOM manually and do the lookup through the shadow roots.\n  if (typeof document.createTreeWalker === 'function' && document.body &&\n      ((document.body as any).createShadowRoot || document.body.attachShadow)) {\n    const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);\n    let currentNode = treeWalker.currentNode as HTMLElement | null;\n\n    while (currentNode) {\n      const shadowRoot = currentNode.shadowRoot;\n\n      if (shadowRoot) {\n        // Note that `ShadowRoot` doesn't support `getElementsByName`\n        // so we have to fall back to `querySelector`.\n        const result =\n            shadowRoot.getElementById(target) || shadowRoot.querySelector(`[name=\"${target}\"]`);\n        if (result) {\n          return result;\n        }\n      }\n\n      currentNode = treeWalker.nextNode() as HTMLElement | null;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Provides an empty implementation of the viewport scroller.\n */\nexport class NullViewportScroller implements ViewportScroller {\n  /**\n   * Empty implementation\n   */\n  setOffset(offset: [number, number]|(() => [number, number])): void {}\n\n  /**\n   * Empty implementation\n   */\n  getScrollPosition(): [number, number] {\n    return [0, 0];\n  }\n\n  /**\n   * Empty implementation\n   */\n  scrollToPosition(position: [number, number]): void {}\n\n  /**\n   * Empty implementation\n   */\n  scrollToAnchor(anchor: string): void {}\n\n  /**\n   * Empty implementation\n   */\n  setHistoryScrollRestoration(scrollRestoration: 'auto'|'manual'): void {}\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 * @module\n * @description\n * Entry point for all public APIs of the common package.\n */\nexport * from './private_export';\nexport * from './location/index';\nexport {formatDate} from './i18n/format_date';\nexport {formatCurrency, formatNumber, formatPercent} from './i18n/format_number';\nexport {NgLocaleLocalization, NgLocalization} from './i18n/localization';\nexport {registerLocaleData} from './i18n/locale_data';\nexport {Plural, NumberFormatStyle, FormStyle, Time, TranslationWidth, FormatWidth, NumberSymbol, WeekDay, getNumberOfCurrencyDigits, getCurrencySymbol, getLocaleDayPeriods, getLocaleDayNames, getLocaleMonthNames, getLocaleId, getLocaleEraNames, getLocaleWeekEndRange, getLocaleFirstDayOfWeek, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocalePluralCase, getLocaleTimeFormat, getLocaleNumberSymbol, getLocaleNumberFormat, getLocaleCurrencyCode, getLocaleCurrencyName, getLocaleCurrencySymbol, getLocaleDirection} from './i18n/locale_data_api';\nexport {parseCookieValue as ɵparseCookieValue} from './cookie';\nexport {CommonModule} from './common_module';\nexport {NgClass, NgForOf, NgForOfContext, NgIf, NgIfContext, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, NgComponentOutlet} from './directives/index';\nexport {DOCUMENT} from './dom_tokens';\nexport {AsyncPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, JsonPipe, LowerCasePipe, CurrencyPipe, DecimalPipe, PercentPipe, SlicePipe, UpperCasePipe, TitleCasePipe, KeyValuePipe, KeyValue} from './pipes/index';\nexport {PLATFORM_BROWSER_ID as ɵPLATFORM_BROWSER_ID, PLATFORM_SERVER_ID as ɵPLATFORM_SERVER_ID, PLATFORM_WORKER_APP_ID as ɵPLATFORM_WORKER_APP_ID, PLATFORM_WORKER_UI_ID as ɵPLATFORM_WORKER_UI_ID, isPlatformBrowser, isPlatformServer, isPlatformWorkerApp, isPlatformWorkerUi} from './platform_id';\nexport {VERSION} from './version';\nexport {ViewportScroller, NullViewportScroller as ɵNullViewportScroller} from './viewport_scroller';\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 * @module\n * @description\n * Entry point for all public APIs of this package.\n */\nexport * from './src/common';\n\n// This file only reexports content of the `src` folder. Keep it that way.\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// This file is not used to build this module. It is only used during editing\n// by the TypeScript language service and during build for verification. `ngc`\n// replaces this file with production index.ts when it rewrites private symbol\n// names.\n\nexport * from './public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {COMMON_DIRECTIVES as ɵangular_packages_common_common_e} from './src/directives/index';\nexport {createLocation as ɵangular_packages_common_common_c} from './src/location/location';\nexport {provideLocationStrategy as ɵangular_packages_common_common_d} from './src/location/location_strategy';\nexport {createBrowserPlatformLocation as ɵangular_packages_common_common_b,useBrowserPlatformLocation as ɵangular_packages_common_common_a} from './src/location/platform_location';\nexport {COMMON_PIPES as ɵangular_packages_common_common_f} from './src/pipes/index';"],"names":["InjectionToken","Injectable","ɵɵinject","Inject","Optional","EventEmitter","NumberFormatStyle","Plural","FormStyle","TranslationWidth","FormatWidth","NumberSymbol","WeekDay","ɵfindLocaleData","ɵLocaleDataIndex","ɵgetLocaleCurrencyCode","ɵgetLocalePluralCase","LOCALE_ID","ɵregisterLocaleData","isListLikeIterable","stringify","Directive","IterableDiffers","KeyValueDiffers","ElementRef","Renderer2","Input","NgModuleRef","ComponentFactoryResolver","ViewContainerRef","TemplateRef","Host","RuntimeError","Attribute","ɵisPromise","ɵisSubscribable","Pipe","ChangeDetectorRef","DEFAULT_CURRENCY_CODE","NgModule","Version","ɵɵdefineInjectable"],"mappings":"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"}