{"version":3,"file":"common.js","sources":["../../../../../../packages/common/src/location/platform_location.ts","../../../../../../packages/common/src/location/location_strategy.ts","../../../../../../packages/common/src/location/location.ts","../../../../../../packages/common/src/location/hash_location_strategy.ts","../../../../../../packages/common/src/location/path_location_strategy.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/styling_differ.ts","../../../../../../packages/common/src/directives/ng_class_impl.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_impl.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/deprecated/intl.ts","../../../../../../packages/common/src/pipes/deprecated/date_pipe.ts","../../../../../../packages/common/src/pipes/deprecated/number_pipe.ts","../../../../../../packages/common/src/pipes/deprecated/index.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/dom_tokens.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 Inc. 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 * 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 platform\n * 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-webworker` provides\n * one suitable for use with web workers.\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 independent.\n *\n * @publicApi\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\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 { (event: LocationChangeEvent): any; }\n","/**\n * @license\n * Copyright Google Inc. 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';\nimport {LocationChangeListener} from './platform_location';\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 */\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\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 * @license\n * Copyright Google Inc. 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} from '@angular/core';\nimport {SubscriptionLike} from 'rxjs';\n\nimport {LocationStrategy} from './location_strategy';\nimport {PlatformLocation} from './platform_location';\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` will either persist\n * to the URL's path or the URL's hash segment.\n *\n * @usageNotes\n *\n * It's better to use the {@link 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()\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\n  constructor(platformStrategy: LocationStrategy, platformLocation: PlatformLocation) {\n    this._platformStrategy = platformStrategy;\n    const browserBaseHref = this._platformStrategy.getBaseHref();\n    this._platformLocation = platformLocation;\n    this._baseHref = Location.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   * Returns the normalized URL path.\n   *\n   * @param includeHash Whether path has an anchor fragment.\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   * Returns the current value of the history.state object.\n   */\n  getState(): unknown { return this._platformLocation.getState(); }\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 + Location.normalizeQueryParams(query));\n  }\n\n  /**\n   * Given a string representing a URL, returns the URL path after stripping the\n   * trailing slashes.\n   *\n   * @param url String representing a URL.\n   *\n   * @returns Normalized URL string.\n   */\n  normalize(url: string): string {\n    return Location.stripTrailingSlash(_stripBaseHref(this._baseHref, _stripIndexHtml(url)));\n  }\n\n  /**\n   * Given a string representing a URL, returns the platform-specific external URL path.\n   * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one\n   * before normalizing. This method also adds a hash if `HashLocationStrategy` is\n   * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n   *\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 browsers URL to a normalized version of the given URL, and pushes a\n   * new item onto the platform's history.\n   *\n   * @param path  URL path to normalizze\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 + Location.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 normalizze\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 + Location.normalizeQueryParams(query)), state);\n  }\n\n  /**\n   * Navigates forward in the platform's history.\n   */\n  forward(): void { this._platformStrategy.forward(); }\n\n  /**\n   * Navigates back in the platform's history.\n   */\n  back(): void { this._platformStrategy.back(); }\n\n  /**\n   * Register URL change listeners. This API can be used to catch updates performed by the Angular\n   * framework. These are not detectible through \"popstate\" or \"hashchange\" events.\n   */\n  onUrlChange(fn: (url: string, state: unknown) => void) {\n    this._urlChangeListeners.push(fn);\n    this.subscribe(v => { this._notifyUrlChangeListeners(v.url, v.state); });\n  }\n\n  /** @internal */\n  _notifyUrlChangeListeners(url: string = '', state: unknown) {\n    this._urlChangeListeners.forEach(fn => fn(url, state));\n  }\n\n  /**\n   * Subscribe 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   * Given a string of url parameters, prepend with `?` if needed, otherwise return the\n   * parameters as is.\n   *\n   *  @param  params String of URL parameters\n   *\n   *  @returns URL parameters prepended with `?` or the parameters as is.\n   */\n  public static normalizeQueryParams(params: string): string {\n    return params && params[0] !== '?' ? '?' + params : params;\n  }\n\n  /**\n   * Given 2 parts of a URL, join them with a slash if needed.\n   *\n   * @param start  URL string\n   * @param end    URL string\n   *\n   *\n   * @returns Given URL strings joined with a slash, if needed.\n   */\n  public static 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   * If URL has a trailing slash, remove it, otherwise return the URL as is. The\n   * method 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 Returns a URL string after removing the trailing slash if one exists, otherwise\n   * returns the string as is.\n   */\n  public static 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\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 Inc. 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';\n\n\nimport {Location} from './location';\nimport {APP_BASE_HREF, LocationStrategy} from './location_strategy';\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\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 { return this._baseHref; }\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 = Location.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 =\n        this.prepareExternalUrl(path + Location.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 + Location.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 { this._platformLocation.forward(); }\n\n  back(): void { this._platformLocation.back(); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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';\n\n\nimport {Location} from './location';\nimport {APP_BASE_HREF, LocationStrategy} from './location_strategy';\nimport {LocationChangeListener, PlatformLocation} from './platform_location';\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 * [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 element to the document. This URL prefix that will be preserved\n * when generating and recognizing URLs.\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`.\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 * @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 { return this._baseHref; }\n\n  prepareExternalUrl(internal: string): string {\n    return Location.joinWithSlash(this._baseHref, internal);\n  }\n\n  path(includeHash: boolean = false): string {\n    const pathname = this._platformLocation.pathname +\n        Location.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 + Location.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 + Location.normalizeQueryParams(queryParams));\n    this._platformLocation.replaceState(state, title, externalUrl);\n  }\n\n  forward(): void { this._platformLocation.forward(); }\n\n  back(): void { this._platformLocation.back(); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 * from './platform_location';\nexport * from './location_strategy';\nexport * from './hash_location_strategy';\nexport * from './path_location_strategy';\nexport * from './location';\n","/**\n * @license\n * Copyright Google Inc. 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, 0],\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, '$', 0],\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, '$', 0],\n      'HKD': ['HK$', '$'],\n      'HNL': [undefined, 'L'],\n      'HRK': [undefined, 'kn'],\n      'HUF': [undefined, 'Ft', 2],\n      'IDR': [undefined, 'Rp', 0],\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, 'â®', 0],\n      'MRO': [undefined, undefined, 0],\n      'MUR': [undefined, 'Rs', 0],\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', 0],\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, 0],\n      'UAH': [undefined, 'â´'],\n      'UGX': [undefined, undefined, 0],\n      'USD': ['$'],\n      'UYI': [undefined, undefined, 0],\n      'UYU': [undefined, '$'],\n      'UZS': [undefined, undefined, 0],\n      'VEF': [undefined, 'Bs'],\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      '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 Inc. 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 {ÉµLocaleDataIndex as LocaleDataIndex, ÉµfindLocaleData as findLocaleData, ÉµgetLocalePluralCase} from '@angular/core';\nimport {CURRENCIES_EN, CurrenciesSymbols} from './currencies';\nimport {CurrencyIndex, ExtraLocaleDataIndex} from './locale_data';\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#TOC-Stand-Alone-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): [string, string] {\n  const data = findLocaleData(locale);\n  const amPmData = <[\n    string, string\n  ][][]>[data[LocaleDataIndex.DayPeriodsFormat], data[LocaleDataIndex.DayPeriodsStandalone]];\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): 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): 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 formStyle The required grammatical form.\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(locale: string, width: TranslationWidth): [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 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(\n        `Missing extra locale data for the locale \"${data[LocaleDataIndex.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 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.0\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 Inc. 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 {FormStyle, FormatWidth, NumberSymbol, Time, TranslationWidth, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleId, getLocaleMonthNames, getLocaleNumberSymbol, getLocaleTimeFormat} 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    /((?:[^GyMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|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\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        let result;\n        rules.forEach((rule: Time | [Time, Time], index: number) => {\n          if (Array.isArray(rule)) {\n            // morning, afternoon, evening, night\n            const {hours: hoursFrom, minutes: minutesFrom} = rule[0];\n            const {hours: hoursTo, minutes: minutesTo} = rule[1];\n            if (currentHours >= hoursFrom && currentMinutes >= minutesFrom &&\n                (currentHours < hoursTo ||\n                 (currentHours === hoursTo && currentMinutes < minutesTo))) {\n              result = dayPeriods[index];\n            }\n          } else {  // noon or midnight\n            const {hours, minutes} = rule;\n            if (hours === currentHours && minutes === currentMinutes) {\n              result = dayPeriods[index];\n            }\n          }\n        });\n        if (result) {\n          return result;\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 = (new Date(year, JANUARY, 1)).getDay();\n  return new Date(\n      year, 0, 1 + ((firstDayOfYear <= THURSDAY) ? THURSDAY : THURSDAY + 7) - firstDayOfYear);\n}\n\nfunction getThursdayThisWeek(datetime: Date) {\n  return new Date(\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 firstThurs = getFirstThursdayOfYear(date.getFullYear());\n      const thisThurs = getThursdayThisWeek(date);\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\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    // 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 9-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    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    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, d] = value.split('-').map((val: string) => +val);\n      return new Date(y, m - 1, d);\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  const ms = Math.round(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 Inc. 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 {NumberFormatStyle, NumberSymbol, getLocaleNumberFormat, getLocaleNumberSymbol, getNumberOfCurrencyDigits} 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 to use in the result string, such as `USD` for the US dollar and `EUR` for the euro.\n * @param digitInfo 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}\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 digitInfo 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 digitInfo 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(\n        `The minimum number of digits after fraction (${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 Inc. 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, LOCALE_ID, Optional} from '@angular/core';\nimport {Plural, getLocalePluralCase} from './locale_data_api';\n\n\n/**\n * @deprecated from v5\n */\nexport const DEPRECATED_PLURAL_FN = new InjectionToken<boolean>('UseV4Plurals');\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(\n      @Inject(LOCALE_ID) protected locale: string,\n      /** @deprecated from v5 */\n      @Optional() @Inject(DEPRECATED_PLURAL_FN) protected deprecatedPluralFn?:\n          ((locale: string, value: number|string) => Plural)|null) {\n    super();\n  }\n\n  getPluralCategory(value: any, locale?: string): string {\n    const plural = this.deprecatedPluralFn ? this.deprecatedPluralFn(locale || this.locale, value) :\n                                             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/**\n * Returns the plural case based on the locale\n *\n * @deprecated from v5 the plural case function is in locale data files common/locales/*.ts\n * @publicApi\n */\nexport function getPluralCase(locale: string, nLike: number | string): Plural {\n  // TODO(vicb): lazy compute\n  if (typeof nLike === 'string') {\n    nLike = parseInt(<string>nLike, 10);\n  }\n  const n: number = nLike as number;\n  const nDecimal = n.toString().replace(/^[^.]*\\.?/, '');\n  const i = Math.floor(Math.abs(n));\n  const v = nDecimal.length;\n  const f = parseInt(nDecimal, 10);\n  const t = parseInt(n.toString().replace(/^[^.]*\\.?|0+$/g, ''), 10) || 0;\n\n  const lang = locale.split('-')[0].toLowerCase();\n\n  switch (lang) {\n    case 'af':\n    case 'asa':\n    case 'az':\n    case 'bem':\n    case 'bez':\n    case 'bg':\n    case 'brx':\n    case 'ce':\n    case 'cgg':\n    case 'chr':\n    case 'ckb':\n    case 'ee':\n    case 'el':\n    case 'eo':\n    case 'es':\n    case 'eu':\n    case 'fo':\n    case 'fur':\n    case 'gsw':\n    case 'ha':\n    case 'haw':\n    case 'hu':\n    case 'jgo':\n    case 'jmc':\n    case 'ka':\n    case 'kk':\n    case 'kkj':\n    case 'kl':\n    case 'ks':\n    case 'ksb':\n    case 'ky':\n    case 'lb':\n    case 'lg':\n    case 'mas':\n    case 'mgo':\n    case 'ml':\n    case 'mn':\n    case 'nb':\n    case 'nd':\n    case 'ne':\n    case 'nn':\n    case 'nnh':\n    case 'nyn':\n    case 'om':\n    case 'or':\n    case 'os':\n    case 'ps':\n    case 'rm':\n    case 'rof':\n    case 'rwk':\n    case 'saq':\n    case 'seh':\n    case 'sn':\n    case 'so':\n    case 'sq':\n    case 'ta':\n    case 'te':\n    case 'teo':\n    case 'tk':\n    case 'tr':\n    case 'ug':\n    case 'uz':\n    case 'vo':\n    case 'vun':\n    case 'wae':\n    case 'xog':\n      if (n === 1) return Plural.One;\n      return Plural.Other;\n    case 'ak':\n    case 'ln':\n    case 'mg':\n    case 'pa':\n    case 'ti':\n      if (n === Math.floor(n) && n >= 0 && n <= 1) return Plural.One;\n      return Plural.Other;\n    case 'am':\n    case 'as':\n    case 'bn':\n    case 'fa':\n    case 'gu':\n    case 'hi':\n    case 'kn':\n    case 'mr':\n    case 'zu':\n      if (i === 0 || n === 1) return Plural.One;\n      return Plural.Other;\n    case 'ar':\n      if (n === 0) return Plural.Zero;\n      if (n === 1) return Plural.One;\n      if (n === 2) return Plural.Two;\n      if (n % 100 === Math.floor(n % 100) && n % 100 >= 3 && n % 100 <= 10) return Plural.Few;\n      if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 99) return Plural.Many;\n      return Plural.Other;\n    case 'ast':\n    case 'ca':\n    case 'de':\n    case 'en':\n    case 'et':\n    case 'fi':\n    case 'fy':\n    case 'gl':\n    case 'it':\n    case 'nl':\n    case 'sv':\n    case 'sw':\n    case 'ur':\n    case 'yi':\n      if (i === 1 && v === 0) return Plural.One;\n      return Plural.Other;\n    case 'be':\n      if (n % 10 === 1 && !(n % 100 === 11)) return Plural.One;\n      if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 &&\n          !(n % 100 >= 12 && n % 100 <= 14))\n        return Plural.Few;\n      if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 ||\n          n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14)\n        return Plural.Many;\n      return Plural.Other;\n    case 'br':\n      if (n % 10 === 1 && !(n % 100 === 11 || n % 100 === 71 || n % 100 === 91)) return Plural.One;\n      if (n % 10 === 2 && !(n % 100 === 12 || n % 100 === 72 || n % 100 === 92)) return Plural.Two;\n      if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) &&\n          !(n % 100 >= 10 && n % 100 <= 19 || n % 100 >= 70 && n % 100 <= 79 ||\n            n % 100 >= 90 && n % 100 <= 99))\n        return Plural.Few;\n      if (!(n === 0) && n % 1e6 === 0) return Plural.Many;\n      return Plural.Other;\n    case 'bs':\n    case 'hr':\n    case 'sr':\n      if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11))\n        return Plural.One;\n      if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n              !(i % 100 >= 12 && i % 100 <= 14) ||\n          f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 &&\n              !(f % 100 >= 12 && f % 100 <= 14))\n        return Plural.Few;\n      return Plural.Other;\n    case 'cs':\n    case 'sk':\n      if (i === 1 && v === 0) return Plural.One;\n      if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0) return Plural.Few;\n      if (!(v === 0)) return Plural.Many;\n      return Plural.Other;\n    case 'cy':\n      if (n === 0) return Plural.Zero;\n      if (n === 1) return Plural.One;\n      if (n === 2) return Plural.Two;\n      if (n === 3) return Plural.Few;\n      if (n === 6) return Plural.Many;\n      return Plural.Other;\n    case 'da':\n      if (n === 1 || !(t === 0) && (i === 0 || i === 1)) return Plural.One;\n      return Plural.Other;\n    case 'dsb':\n    case 'hsb':\n      if (v === 0 && i % 100 === 1 || f % 100 === 1) return Plural.One;\n      if (v === 0 && i % 100 === 2 || f % 100 === 2) return Plural.Two;\n      if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 ||\n          f % 100 === Math.floor(f % 100) && f % 100 >= 3 && f % 100 <= 4)\n        return Plural.Few;\n      return Plural.Other;\n    case 'ff':\n    case 'fr':\n    case 'hy':\n    case 'kab':\n      if (i === 0 || i === 1) return Plural.One;\n      return Plural.Other;\n    case 'fil':\n      if (v === 0 && (i === 1 || i === 2 || i === 3) ||\n          v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) ||\n          !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9))\n        return Plural.One;\n      return Plural.Other;\n    case 'ga':\n      if (n === 1) return Plural.One;\n      if (n === 2) return Plural.Two;\n      if (n === Math.floor(n) && n >= 3 && n <= 6) return Plural.Few;\n      if (n === Math.floor(n) && n >= 7 && n <= 10) return Plural.Many;\n      return Plural.Other;\n    case 'gd':\n      if (n === 1 || n === 11) return Plural.One;\n      if (n === 2 || n === 12) return Plural.Two;\n      if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19)) return Plural.Few;\n      return Plural.Other;\n    case 'gv':\n      if (v === 0 && i % 10 === 1) return Plural.One;\n      if (v === 0 && i % 10 === 2) return Plural.Two;\n      if (v === 0 &&\n          (i % 100 === 0 || i % 100 === 20 || i % 100 === 40 || i % 100 === 60 || i % 100 === 80))\n        return Plural.Few;\n      if (!(v === 0)) return Plural.Many;\n      return Plural.Other;\n    case 'he':\n      if (i === 1 && v === 0) return Plural.One;\n      if (i === 2 && v === 0) return Plural.Two;\n      if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0) return Plural.Many;\n      return Plural.Other;\n    case 'is':\n      if (t === 0 && i % 10 === 1 && !(i % 100 === 11) || !(t === 0)) return Plural.One;\n      return Plural.Other;\n    case 'ksh':\n      if (n === 0) return Plural.Zero;\n      if (n === 1) return Plural.One;\n      return Plural.Other;\n    case 'kw':\n    case 'naq':\n    case 'se':\n    case 'smn':\n      if (n === 1) return Plural.One;\n      if (n === 2) return Plural.Two;\n      return Plural.Other;\n    case 'lag':\n      if (n === 0) return Plural.Zero;\n      if ((i === 0 || i === 1) && !(n === 0)) return Plural.One;\n      return Plural.Other;\n    case 'lt':\n      if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19)) return Plural.One;\n      if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 9 &&\n          !(n % 100 >= 11 && n % 100 <= 19))\n        return Plural.Few;\n      if (!(f === 0)) return Plural.Many;\n      return Plural.Other;\n    case 'lv':\n    case 'prg':\n      if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 ||\n          v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19)\n        return Plural.Zero;\n      if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) ||\n          !(v === 2) && f % 10 === 1)\n        return Plural.One;\n      return Plural.Other;\n    case 'mk':\n      if (v === 0 && i % 10 === 1 || f % 10 === 1) return Plural.One;\n      return Plural.Other;\n    case 'mt':\n      if (n === 1) return Plural.One;\n      if (n === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 2 && n % 100 <= 10)\n        return Plural.Few;\n      if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19) return Plural.Many;\n      return Plural.Other;\n    case 'pl':\n      if (i === 1 && v === 0) return Plural.One;\n      if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n          !(i % 100 >= 12 && i % 100 <= 14))\n        return Plural.Few;\n      if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 ||\n          v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n          v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14)\n        return Plural.Many;\n      return Plural.Other;\n    case 'pt':\n      if (n === Math.floor(n) && n >= 0 && n <= 2 && !(n === 2)) return Plural.One;\n      return Plural.Other;\n    case 'ro':\n      if (i === 1 && v === 0) return Plural.One;\n      if (!(v === 0) || n === 0 ||\n          !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19)\n        return Plural.Few;\n      return Plural.Other;\n    case 'ru':\n    case 'uk':\n      if (v === 0 && i % 10 === 1 && !(i % 100 === 11)) return Plural.One;\n      if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n          !(i % 100 >= 12 && i % 100 <= 14))\n        return Plural.Few;\n      if (v === 0 && i % 10 === 0 ||\n          v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n          v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14)\n        return Plural.Many;\n      return Plural.Other;\n    case 'shi':\n      if (i === 0 || n === 1) return Plural.One;\n      if (n === Math.floor(n) && n >= 2 && n <= 10) return Plural.Few;\n      return Plural.Other;\n    case 'si':\n      if (n === 0 || n === 1 || i === 0 && f === 1) return Plural.One;\n      return Plural.Other;\n    case 'sl':\n      if (v === 0 && i % 100 === 1) return Plural.One;\n      if (v === 0 && i % 100 === 2) return Plural.Two;\n      if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || !(v === 0))\n        return Plural.Few;\n      return Plural.Other;\n    case 'tzm':\n      if (n === Math.floor(n) && n >= 0 && n <= 1 || n === Math.floor(n) && n >= 11 && n <= 99)\n        return Plural.One;\n      return Plural.Other;\n    // When there is no specification, the default is always \"other\"\n    // Spec: http://cldr.unicode.org/index/cldr-spec/plural-rules\n    // > other (requiredâgeneral plural form â also used if the language only has a single form)\n    default:\n      return Plural.Other;\n  }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 {ÉµLOCALE_DATA as LOCALE_DATA, ÉµLocaleDataIndex as LocaleDataIndex} 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 * @publicApi\n */\n// The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1\nexport function registerLocaleData(data: any, localeId?: string | any, extraData?: any): void {\n  if (typeof localeId !== 'string') {\n    extraData = localeId;\n    localeId = data[LocaleDataIndex.LocaleId];\n  }\n\n  localeId = localeId.toLowerCase().replace(/_/g, '-');\n\n  LOCALE_DATA[localeId] = data;\n\n  if (extraData) {\n    LOCALE_DATA[localeId][LocaleDataIndex.ExtraData] = extraData;\n  }\n}\n\n/**\n * Index of each type of locale data from the extra locale data array\n */\nexport const enum ExtraLocaleDataIndex {\n  ExtraDayPeriodFormats = 0,\n  ExtraDayPeriodStandalone,\n  ExtraDayPeriodsRules\n}\n\n/**\n * Index of each value in currency data (used to describe CURRENCIES_EN in currencies.ts)\n */\nexport const enum CurrencyIndex {Symbol = 0, SymbolNarrow, NbOfDigits}\n","/**\n * @license\n * Copyright Google Inc. 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 Inc. 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 * Used to diff and convert ngStyle/ngClass instructions into [style] and [class] bindings.\n *\n * ngStyle and ngClass both accept various forms of input and behave differently than that\n * of how [style] and [class] behave in Angular.\n *\n * The differences are:\n *  - ngStyle and ngClass both **watch** their binding values for changes each time CD runs\n *    while [style] and [class] bindings do not (they check for identity changes)\n *  - ngStyle allows for unit-based keys (e.g. `{'max-width.px':value}`) and [style] does not\n *  - ngClass supports arrays of class values and [class] only accepts map and string values\n *  - ngClass allows for multiple className keys (space-separated) within an array or map\n *     (as the * key) while [class] only accepts a simple key/value map object\n *\n * Having Angular understand and adapt to all the different forms of behavior is complicated\n * and unnecessary. Instead, ngClass and ngStyle should have their input values be converted\n * into something that the core-level [style] and [class] bindings understand.\n *\n * This [StylingDiffer] class handles this conversion by creating a new input value each time\n * the inner representation of the binding value have changed.\n *\n * ## Why do we care about ngStyle/ngClass?\n * The styling algorithm code (documented inside of `render3/interfaces/styling.ts`) needs to\n * respect and understand the styling values emitted through ngStyle and ngClass (when they\n * are present and used in a template).\n *\n * Instead of having these directives manage styling on their own, they should be included\n * into the Angular styling algorithm that exists for [style] and [class] bindings.\n *\n * Here's why:\n *\n * - If ngStyle/ngClass is used in combination with [style]/[class] bindings then the\n *   styles and classes would fall out of sync and be applied and updated at\n *   inconsistent times\n * - Both ngClass/ngStyle do not respect [class.name] and [style.prop] bindings\n *   (they will write over them given the right combination of events)\n *\n *   ```\n *   <!-- if `w1` is updated then it will always override `w2`\n *        if `w2` is updated then it will always override `w1`\n *        if both are updated at the same time then `w1` wins -->\n *   <div [ngStyle]=\"{width:w1}\" [style.width]=\"w2\">...</div>\n *\n *   <!-- if `w1` is updated then it will always lose to `w2`\n *        if `w2` is updated then it will always override `w1`\n *        if both are updated at the same time then `w2` wins -->\n *   <div [style]=\"{width:w1}\" [style.width]=\"w2\">...</div>\n *   ```\n * - ngClass/ngStyle were written as a directives and made use of maps, closures and other\n *   expensive data structures which were evaluated each time CD runs\n */\nexport class StylingDiffer<T> {\n  public readonly value: T|null = null;\n\n  private _lastSetValue: {[key: string]: any}|string|string[]|null = null;\n  private _lastSetValueType: StylingDifferValueTypes = StylingDifferValueTypes.Null;\n  private _lastSetValueIdentityChange = false;\n\n  constructor(private _name: string, private _options: StylingDifferOptions) {}\n\n  /**\n   * Sets (updates) the styling value within the differ.\n   *\n   * Only when `hasValueChanged` is called then this new value will be evaluted\n   * and checked against the previous value.\n   *\n   * @param value the new styling value provided from the ngClass/ngStyle binding\n   */\n  setValue(value: {[key: string]: any}|string[]|string|null) {\n    if (Array.isArray(value)) {\n      this._lastSetValueType = StylingDifferValueTypes.Array;\n    } else if (value instanceof Set) {\n      this._lastSetValueType = StylingDifferValueTypes.Set;\n    } else if (value && typeof value === 'string') {\n      if (!(this._options & StylingDifferOptions.AllowStringValue)) {\n        throw new Error(this._name + ' string values are not allowed');\n      }\n      this._lastSetValueType = StylingDifferValueTypes.String;\n    } else {\n      this._lastSetValueType = value ? StylingDifferValueTypes.Map : StylingDifferValueTypes.Null;\n    }\n\n    this._lastSetValueIdentityChange = true;\n    this._lastSetValue = value || null;\n  }\n\n  /**\n   * Determines whether or not the value has changed.\n   *\n   * This function can be called right after `setValue()` is called, but it can also be\n   * called incase the existing value (if it's a collection) changes internally. If the\n   * value is indeed a collection it will do the necessary diffing work and produce a\n   * new object value as assign that to `value`.\n   *\n   * @returns whether or not the value has changed in some way.\n   */\n  hasValueChanged(): boolean {\n    let valueHasChanged = this._lastSetValueIdentityChange;\n    if (!valueHasChanged && !(this._lastSetValueType & StylingDifferValueTypes.Collection))\n      return false;\n\n    let finalValue: {[key: string]: any}|string|null = null;\n    const trimValues = (this._options & StylingDifferOptions.TrimProperties) ? true : false;\n    const parseOutUnits = (this._options & StylingDifferOptions.AllowUnits) ? true : false;\n    const allowSubKeys = (this._options & StylingDifferOptions.AllowSubKeys) ? true : false;\n\n    switch (this._lastSetValueType) {\n      // case 1: [input]=\"string\"\n      case StylingDifferValueTypes.String:\n        const tokens = (this._lastSetValue as string).split(/\\s+/g);\n        if (this._options & StylingDifferOptions.ForceAsMap) {\n          finalValue = {};\n          tokens.forEach((token, i) => (finalValue as{[key: string]: any})[token] = true);\n        } else {\n          finalValue = tokens.reduce((str, token, i) => str + (i ? ' ' : '') + token);\n        }\n        break;\n\n      // case 2: [input]=\"{key:value}\"\n      case StylingDifferValueTypes.Map:\n        const map: {[key: string]: any} = this._lastSetValue as{[key: string]: any};\n        const keys = Object.keys(map);\n        if (!valueHasChanged) {\n          if (this.value) {\n            // we know that the classExp value exists and that it is\n            // a map (otherwise an identity change would have occurred)\n            valueHasChanged = mapHasChanged(keys, this.value as{[key: string]: any}, map);\n          } else {\n            valueHasChanged = true;\n          }\n        }\n\n        if (valueHasChanged) {\n          finalValue =\n              bulidMapFromValues(this._name, trimValues, parseOutUnits, allowSubKeys, map, keys);\n        }\n        break;\n\n      // case 3a: [input]=\"[str1, str2, ...]\"\n      // case 3b: [input]=\"Set\"\n      case StylingDifferValueTypes.Array:\n      case StylingDifferValueTypes.Set:\n        const values = Array.from(this._lastSetValue as string[] | Set<string>);\n        if (!valueHasChanged) {\n          const keys = Object.keys(this.value !);\n          valueHasChanged = !arrayEqualsArray(keys, values);\n        }\n        if (valueHasChanged) {\n          finalValue =\n              bulidMapFromValues(this._name, trimValues, parseOutUnits, allowSubKeys, values);\n        }\n        break;\n\n      // case 4: [input]=\"null|undefined\"\n      default:\n        finalValue = null;\n        break;\n    }\n\n    if (valueHasChanged) {\n      (this as any).value = finalValue !;\n    }\n\n    return valueHasChanged;\n  }\n}\n\n/**\n * Various options that are consumed by the [StylingDiffer] class.\n */\nexport const enum StylingDifferOptions {\n  None = 0b00000,\n  TrimProperties = 0b00001,\n  AllowSubKeys = 0b00010,\n  AllowStringValue = 0b00100,\n  AllowUnits = 0b01000,\n  ForceAsMap = 0b10000,\n}\n\n/**\n * The different types of inputs that the [StylingDiffer] can deal with\n */\nconst enum StylingDifferValueTypes {\n  Null = 0b0000,\n  String = 0b0001,\n  Map = 0b0010,\n  Array = 0b0100,\n  Set = 0b1000,\n  Collection = 0b1110,\n}\n\n\n/**\n * builds and returns a map based on the values input value\n *\n * If the `keys` param is provided then the `values` param is treated as a\n * string map. Otherwise `values` is treated as a string array.\n */\nfunction bulidMapFromValues(\n    errorPrefix: string, trim: boolean, parseOutUnits: boolean, allowSubKeys: boolean,\n    values: {[key: string]: any} | string[], keys?: string[]) {\n  const map: {[key: string]: any} = {};\n  if (keys) {\n    // case 1: map\n    for (let i = 0; i < keys.length; i++) {\n      let key = keys[i];\n      key = trim ? key.trim() : key;\n      const value = (values as{[key: string]: any})[key];\n      setMapValues(map, key, value, parseOutUnits, allowSubKeys);\n    }\n  } else {\n    // case 2: array\n    for (let i = 0; i < values.length; i++) {\n      let value = (values as string[])[i];\n      assertValidValue(errorPrefix, value);\n      value = trim ? value.trim() : value;\n      setMapValues(map, value, true, false, allowSubKeys);\n    }\n  }\n\n  return map;\n}\n\nfunction assertValidValue(errorPrefix: string, value: any) {\n  if (typeof value !== 'string') {\n    throw new Error(\n        `${errorPrefix} can only toggle CSS classes expressed as strings, got ${value}`);\n  }\n}\n\nfunction setMapValues(\n    map: {[key: string]: any}, key: string, value: any, parseOutUnits: boolean,\n    allowSubKeys: boolean) {\n  if (allowSubKeys && key.indexOf(' ') > 0) {\n    const innerKeys = key.split(/\\s+/g);\n    for (let j = 0; j < innerKeys.length; j++) {\n      setIndividualMapValue(map, innerKeys[j], value, parseOutUnits);\n    }\n  } else {\n    setIndividualMapValue(map, key, value, parseOutUnits);\n  }\n}\n\nfunction setIndividualMapValue(\n    map: {[key: string]: any}, key: string, value: any, parseOutUnits: boolean) {\n  if (parseOutUnits) {\n    const values = normalizeStyleKeyAndValue(key, value);\n    value = values.value;\n    key = values.key;\n  }\n  map[key] = value;\n}\n\nfunction normalizeStyleKeyAndValue(key: string, value: string | null) {\n  const index = key.indexOf('.');\n  if (index > 0) {\n    const unit = key.substr(index + 1);  // ignore the . ([width.px]=\"'40'\" => \"40px\")\n    key = key.substring(0, index);\n    if (value != null) {  // we should not convert null values to string\n      value += unit;\n    }\n  }\n  return {key, value};\n}\n\nfunction mapHasChanged(keys: string[], a: {[key: string]: any}, b: {[key: string]: any}) {\n  const oldKeys = Object.keys(a);\n  const newKeys = keys;\n\n  // the keys are different which means the map changed\n  if (!arrayEqualsArray(oldKeys, newKeys)) {\n    return true;\n  }\n\n  for (let i = 0; i < newKeys.length; i++) {\n    const key = newKeys[i];\n    if (a[key] !== b[key]) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction arrayEqualsArray(a: any[] | null, b: any[] | null) {\n  if (a && b) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (b.indexOf(a[i]) === -1) return false;\n    }\n    return true;\n  }\n  return false;\n}\n","/**\n * @license\n * Copyright Google Inc. 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 {ElementRef, Injectable, IterableChanges, IterableDiffer, IterableDiffers, KeyValueChanges, KeyValueDiffer, KeyValueDiffers, Renderer2, ÉµisListLikeIterable as isListLikeIterable, Éµstringify as stringify} from '@angular/core';\n\nimport {StylingDiffer, StylingDifferOptions} from './styling_differ';\n\n/**\n * Used as a token for an injected service within the NgClass directive.\n *\n * NgClass behaves differenly whether or not VE is being used or not. If\n * present then the legacy ngClass diffing algorithm will be used as an\n * injected service. Otherwise the new diffing algorithm (which delegates\n * to the `[class]` binding) will be used. This toggle behavior is done so\n * via the ivy_switch mechanism.\n */\nexport abstract class NgClassImpl {\n  abstract setClass(value: string): void;\n  abstract setNgClass(value: string|string[]|Set<string>|{[klass: string]: any}): void;\n  abstract applyChanges(): void;\n  abstract getValue(): {[key: string]: any}|null;\n}\n\n@Injectable()\nexport class NgClassR2Impl implements NgClassImpl {\n  // TODO(issue/24571): remove '!'.\n  private _iterableDiffer !: IterableDiffer<string>| null;\n  // TODO(issue/24571): remove '!'.\n  private _keyValueDiffer !: KeyValueDiffer<string, any>| null;\n  private _initialClasses: string[] = [];\n  // TODO(issue/24571): remove '!'.\n  private _rawClass !: string[] | Set<string>| {[klass: string]: any};\n\n  constructor(\n      private _iterableDiffers: IterableDiffers, private _keyValueDiffers: KeyValueDiffers,\n      private _ngEl: ElementRef, private _renderer: Renderer2) {}\n\n  getValue() { return null; }\n\n  setClass(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  setNgClass(value: string) {\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  applyChanges() {\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(\n            `NgClass can only toggle CSS classes expressed as strings, got ${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: string[]|Set<string>|{[klass: string]: any}) {\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: string[]|Set<string>|{[klass: string]: any}) {\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@Injectable()\nexport class NgClassR3Impl implements NgClassImpl {\n  private _value: {[key: string]: boolean}|null = null;\n  private _ngClassDiffer = new StylingDiffer<{[key: string]: boolean}|null>(\n      'NgClass', StylingDifferOptions.TrimProperties|\n                 StylingDifferOptions.AllowSubKeys|\n                 StylingDifferOptions.AllowStringValue|StylingDifferOptions.ForceAsMap);\n  private _classStringDiffer: StylingDiffer<{[key: string]: boolean}>|null = null;\n\n  getValue() { return this._value; }\n\n  setClass(value: string) {\n    // early exit incase the binding gets emitted as an empty value which\n    // means there is no reason to instantiate and diff the values...\n    if (!value && !this._classStringDiffer) return;\n\n    this._classStringDiffer = this._classStringDiffer ||\n        new StylingDiffer('class',\n                          StylingDifferOptions.AllowStringValue | StylingDifferOptions.ForceAsMap);\n    this._classStringDiffer.setValue(value);\n  }\n\n  setNgClass(value: string|string[]|Set<string>|{[klass: string]: any}) {\n    this._ngClassDiffer.setValue(value);\n  }\n\n  applyChanges() {\n    const classChanged =\n        this._classStringDiffer ? this._classStringDiffer.hasValueChanged() : false;\n    const ngClassChanged = this._ngClassDiffer.hasValueChanged();\n    if (classChanged || ngClassChanged) {\n      let value = this._ngClassDiffer.value;\n      if (this._classStringDiffer) {\n        let classValue = this._classStringDiffer.value;\n        if (classValue) {\n          value = value ? {...classValue, ...value} : classValue;\n        }\n      }\n      this._value = value;\n    }\n  }\n}\n\n// the implementation for both NgStyleR2Impl and NgStyleR3Impl are\n// not ivy_switch'd away, instead they are only hooked up into the\n// DI via NgStyle's directive's provider property.\nexport const NgClassImplProvider__PRE_R3__ = {\n  provide: NgClassImpl,\n  useClass: NgClassR2Impl\n};\n\nexport const NgClassImplProvider__POST_R3__ = {\n  provide: NgClassImpl,\n  useClass: NgClassR3Impl\n};\n\nexport const NgClassImplProvider = NgClassImplProvider__PRE_R3__;\n","/**\n * @license\n * Copyright Google Inc. 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, Input, ÉµRenderFlags, ÉµÉµclassMap, ÉµÉµdefineDirective, ÉµÉµstyling, ÉµÉµstylingApply} from '@angular/core';\n\nimport {NgClassImpl, NgClassImplProvider} from './ng_class_impl';\n\n\n\n/*\n * NgClass (as well as NgStyle) behaves differently when loaded in the VE and when not.\n *\n * If the VE is present (which is for older versions of Angular) then NgClass will inject\n * the legacy diffing algorithm as a service and delegate all styling changes to that.\n *\n * If the VE is not present then NgStyle will normalize (through the injected service) and\n * then write all styling changes to the `[style]` binding directly (through a host binding).\n * Then Angular will notice the host binding change and treat the changes as styling\n * changes and apply them via the core styling instructions that exist within Angular.\n */\n\n// used when the VE is present\nexport const ngClassDirectiveDef__PRE_R3__ = undefined;\n\n// used when the VE is not present (note the directive will\n// never be instantiated normally because it is apart of a\n// base class)\nexport const ngClassDirectiveDef__POST_R3__ = ÉµÉµdefineDirective({\n  type: function() {} as any,\n  selectors: null as any,\n  factory: () => {},\n  hostBindings: function(rf: ÉµRenderFlags, ctx: any, elIndex: number) {\n    if (rf & ÉµRenderFlags.Create) {\n      ÉµÉµstyling();\n    }\n    if (rf & ÉµRenderFlags.Update) {\n      ÉµÉµclassMap(ctx.getValue());\n      ÉµÉµstylingApply();\n    }\n  }\n});\n\nexport const ngClassDirectiveDef = ngClassDirectiveDef__PRE_R3__;\n\n/**\n * Serves as the base non-VE container for NgClass.\n *\n * While this is a base class that NgClass extends from, the\n * class itself acts as a container for non-VE code to setup\n * a link to the `[class]` host binding (via the static\n * `ngDirectiveDef` property on the class).\n *\n * Note that the `ngDirectiveDef` property's code is switched\n * depending if VE is present or not (this allows for the\n * binding code to be set only for newer versions of Angular).\n *\n * @publicApi\n */\nexport class NgClassBase {\n  static ngDirectiveDef: any = ngClassDirectiveDef;\n\n  constructor(protected _delegate: NgClassImpl) {}\n\n  getValue() { return this._delegate.getValue(); }\n}\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]', providers: [NgClassImplProvider]})\nexport class NgClass extends NgClassBase implements DoCheck {\n  constructor(delegate: NgClassImpl) { super(delegate); }\n\n  @Input('class')\n  set klass(value: string) { this._delegate.setClass(value); }\n\n  @Input('ngClass')\n  set ngClass(value: string|string[]|Set<string>|{[klass: string]: any}) {\n    this._delegate.setNgClass(value);\n  }\n\n  ngDoCheck() { this._delegate.applyChanges(); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 Inc. 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, forwardRef, isDevMode} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport class NgForOfContext<T> {\n  constructor(\n      public $implicit: T, public ngForOf: NgIterable<T>, public index: number,\n      public count: number) {}\n\n  get first(): boolean { return this.index === 0; }\n\n  get last(): boolean { return this.index === this.count - 1; }\n\n  get even(): boolean { return this.index % 2 === 0; }\n\n  get odd(): boolean { return !this.even; }\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#the-asterisk--prefix) `*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/structural-directives#one-structural-directive-per-host-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/structural-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 userObservable | async as 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 * - `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> implements DoCheck {\n  /**\n   * The value of the iterable expression, which can be used as a\n   * [template input variable](guide/structural-directives#template-input-variable).\n   */\n  @Input()\n  set ngForOf(ngForOf: NgIterable<T>) {\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 node object ID.\n   */\n  @Input()\n  set ngForTrackBy(fn: TrackByFunction<T>) {\n    if (isDevMode() && 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/docs/ts/latest/api/common/index/NgFor-directive.html#!#change-propagation for more information.`);\n      }\n    }\n    this._trackByFn = fn;\n  }\n\n  get ngForTrackBy(): TrackByFunction<T> { return this._trackByFn; }\n\n  // TODO(issue/24571): remove '!'.\n  private _ngForOf !: NgIterable<T>;\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, private _template: TemplateRef<NgForOfContext<T>>,\n      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-syntax#template-reference-variables--var-)\n   */\n  @Input()\n  set ngForTemplate(value: TemplateRef<NgForOfContext<T>>) {\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(\n              `Cannot find a differ supporting object '${value}' of type '${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>[] = [];\n    changes.forEachOperation(\n        (item: IterableChangeRecord<any>, adjustedPreviousIndex: number, currentIndex: number) => {\n          if (item.previousIndex == null) {\n            const view = this._viewContainer.createEmbeddedView(\n                this._template, new NgForOfContext<T>(null !, this._ngForOf, -1, -1), currentIndex);\n            const tuple = new RecordViewTuple<T>(item, view);\n            insertTuples.push(tuple);\n          } else if (currentIndex == null) {\n            this._viewContainer.remove(adjustedPreviousIndex);\n          } else {\n            const view = this._viewContainer.get(adjustedPreviousIndex) !;\n            this._viewContainer.move(view, currentIndex);\n            const tuple = new RecordViewTuple(item, <EmbeddedViewRef<NgForOfContext<T>>>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>>>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>>>this._viewContainer.get(record.currentIndex);\n      viewRef.context.$implicit = record.item;\n    });\n  }\n\n  private _perViewChange(\n      view: EmbeddedViewRef<NgForOfContext<T>>, 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>(dir: NgForOf<T>, ctx: any): ctx is NgForOfContext<T> {\n    return true;\n  }\n}\n\nclass RecordViewTuple<T> {\n  constructor(public record: any, public view: EmbeddedViewRef<NgForOfContext<T>>) {}\n}\n\nfunction getTypeName(type: any): string {\n  return type['name'] || typeof type;\n}\n","/**\n * @license\n * Copyright Google Inc. 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#the-asterisk--prefix) 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 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](guide/template-syntax#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]=\"hero-list\" [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/structural-directives#one-per-element).\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Directive({selector: '[ngIf]'})\nexport class NgIf {\n  private _context: NgIfContext = new NgIfContext();\n  private _thenTemplateRef: TemplateRef<NgIfContext>|null = null;\n  private _elseTemplateRef: TemplateRef<NgIfContext>|null = null;\n  private _thenViewRef: EmbeddedViewRef<NgIfContext>|null = null;\n  private _elseViewRef: EmbeddedViewRef<NgIfContext>|null = null;\n\n  constructor(private _viewContainer: ViewContainerRef, templateRef: TemplateRef<NgIfContext>) {\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: any) {\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>|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>|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/**\n * @publicApi\n */\nexport class NgIfContext {\n  public $implicit: any = null;\n  public ngIf: any = 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 Inc. 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, TemplateRef, ViewContainerRef} 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 A structural directive that adds or removes templates (displaying or hiding views)\n * when the next match expression matches the switch expression.\n *\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 { return this._caseCount++; }\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()\n  ngSwitchCase: any;\n\n  constructor(\n      viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>,\n      @Host() private ngSwitch: NgSwitch) {\n    ngSwitch._addCase();\n    this._view = new SwitchView(viewContainer, templateRef);\n  }\n\n  /**\n   * Performs case matching. For internal use only.\n   */\n  ngDoCheck() { this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase)); }\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      @Host() ngSwitch: NgSwitch) {\n    ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));\n  }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 {NgLocalization, getPluralCategory} 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 { this._caseViews[value] = switchView; }\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 Inc. 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 {ElementRef, Injectable, KeyValueChanges, KeyValueDiffer, KeyValueDiffers, Renderer2} from '@angular/core';\n\nimport {StylingDiffer, StylingDifferOptions} from './styling_differ';\n\n/**\n * Used as a token for an injected service within the NgStyle directive.\n *\n * NgStyle behaves differenly whether or not VE is being used or not. If\n * present then the legacy ngClass diffing algorithm will be used as an\n * injected service. Otherwise the new diffing algorithm (which delegates\n * to the `[style]` binding) will be used. This toggle behavior is done so\n * via the ivy_switch mechanism.\n */\nexport abstract class NgStyleImpl {\n  abstract getValue(): {[key: string]: any}|null;\n  abstract setNgStyle(value: {[key: string]: any}|null): void;\n  abstract applyChanges(): void;\n}\n\n@Injectable()\nexport class NgStyleR2Impl implements NgStyleImpl {\n  // TODO(issue/24571): remove '!'.\n  private _ngStyle !: {[key: string]: string};\n  // TODO(issue/24571): remove '!'.\n  private _differ !: KeyValueDiffer<string, string|number>;\n\n  constructor(\n      private _ngEl: ElementRef, private _differs: KeyValueDiffers, private _renderer: Renderer2) {}\n\n  getValue() { return null; }\n\n  /**\n   * A map of style properties, specified as colon-separated\n   * 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   */\n  setNgStyle(values: {[key: string]: string}) {\n    this._ngStyle = values;\n    if (!this._differ && values) {\n      this._differ = this._differs.find(values).create();\n    }\n  }\n\n  /**\n   * Applies the new styles if needed.\n   */\n  applyChanges() {\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 _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  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\n@Injectable()\nexport class NgStyleR3Impl implements NgStyleImpl {\n  private _differ =\n      new StylingDiffer<{[key: string]: any}|null>('NgStyle', StylingDifferOptions.AllowUnits);\n\n  private _value: {[key: string]: any}|null = null;\n\n  getValue() { return this._value; }\n\n  setNgStyle(value: {[key: string]: any}|null) { this._differ.setValue(value); }\n\n  applyChanges() {\n    if (this._differ.hasValueChanged()) {\n      this._value = this._differ.value;\n    }\n  }\n}\n\n// the implementation for both NgClassR2Impl and NgClassR3Impl are\n// not ivy_switch'd away, instead they are only hooked up into the\n// DI via NgStyle's directive's provider property.\nexport const NgStyleImplProvider__PRE_R3__ = {\n  provide: NgStyleImpl,\n  useClass: NgStyleR2Impl\n};\n\nexport const NgStyleImplProvider__POST_R3__ = {\n  provide: NgStyleImpl,\n  useClass: NgStyleR3Impl\n};\n\nexport const NgStyleImplProvider = NgStyleImplProvider__PRE_R3__;\n","/**\n * @license\n * Copyright Google Inc. 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, Input, ÉµRenderFlags, ÉµÉµdefineDirective, ÉµÉµstyleMap, ÉµÉµstyling, ÉµÉµstylingApply} from '@angular/core';\n\nimport {NgStyleImpl, NgStyleImplProvider} from './ng_style_impl';\n\n\n\n/*\n * NgStyle (as well as NgClass) behaves differently when loaded in the VE and when not.\n *\n * If the VE is present (which is for older versions of Angular) then NgStyle will inject\n * the legacy diffing algorithm as a service and delegate all styling changes to that.\n *\n * If the VE is not present then NgStyle will normalize (through the injected service) and\n * then write all styling changes to the `[style]` binding directly (through a host binding).\n * Then Angular will notice the host binding change and treat the changes as styling\n * changes and apply them via the core styling instructions that exist within Angular.\n */\n\n// used when the VE is present\nexport const ngStyleDirectiveDef__PRE_R3__ = undefined;\n\n// used when the VE is not present (note the directive will\n// never be instantiated normally because it is apart of a\n// base class)\nexport const ngStyleDirectiveDef__POST_R3__ = ÉµÉµdefineDirective({\n  type: function() {} as any,\n  selectors: null as any,\n  factory: () => {},\n  hostBindings: function(rf: ÉµRenderFlags, ctx: any, elIndex: number) {\n    if (rf & ÉµRenderFlags.Create) {\n      ÉµÉµstyling();\n    }\n    if (rf & ÉµRenderFlags.Update) {\n      ÉµÉµstyleMap(ctx.getValue());\n      ÉµÉµstylingApply();\n    }\n  }\n});\n\nexport const ngStyleDirectiveDef = ngStyleDirectiveDef__PRE_R3__;\n\n/**\n * Serves as the base non-VE container for NgStyle.\n *\n * While this is a base class that NgStyle extends from, the\n * class itself acts as a container for non-VE code to setup\n * a link to the `[style]` host binding (via the static\n * `ngDirectiveDef` property on the class).\n *\n * Note that the `ngDirectiveDef` property's code is switched\n * depending if VE is present or not (this allows for the\n * binding code to be set only for newer versions of Angular).\n *\n * @publicApi\n */\nexport class NgStyleBase {\n  static ngDirectiveDef: any = ngStyleDirectiveDef;\n\n  constructor(protected _delegate: NgStyleImpl) {}\n\n  getValue() { return this._delegate.getValue(); }\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]', providers: [NgStyleImplProvider]})\nexport class NgStyle extends NgStyleBase implements DoCheck {\n  constructor(delegate: NgStyleImpl) { super(delegate); }\n\n  @Input('ngStyle')\n  set ngStyle(value: {[klass: string]: any}|null) { this._delegate.setNgStyle(value); }\n\n  ngDoCheck() { this._delegate.applyChanges(); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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      if (this._viewRef) {\n        this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef));\n      }\n\n      if (this.ngTemplateOutlet) {\n        this._viewRef = this._viewContainerRef.createEmbeddedView(\n            this.ngTemplateOutlet, this.ngTemplateOutletContext);\n      }\n    } else {\n      if (this._viewRef && this.ngTemplateOutletContext) {\n        this._updateExistingContext(this.ngTemplateOutletContext);\n      }\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    } else {\n      return true;\n    }\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 Inc. 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, NgClassBase} 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, NgStyleBase} from './ng_style';\nimport {NgSwitch, NgSwitchCase, NgSwitchDefault} from './ng_switch';\nimport {NgTemplateOutlet} from './ng_template_outlet';\n\nexport {\n  NgClass,\n  NgClassBase,\n  NgComponentOutlet,\n  NgForOf,\n  NgForOfContext,\n  NgIf,\n  NgIfContext,\n  NgPlural,\n  NgPluralCase,\n  NgStyle,\n  NgStyleBase,\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 Inc. 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 Inc. 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 {NumberFormatStyle} from '../../i18n/locale_data_api';\n\nexport class NumberFormatter {\n  static format(num: number, locale: string, style: NumberFormatStyle, opts: {\n    minimumIntegerDigits?: number,\n    minimumFractionDigits?: number,\n    maximumFractionDigits?: number,\n    currency?: string|null,\n    currencyAsSymbol?: boolean\n  } = {}): string {\n    const {minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, currency,\n           currencyAsSymbol = false} = opts;\n    const options: Intl.NumberFormatOptions = {\n      minimumIntegerDigits,\n      minimumFractionDigits,\n      maximumFractionDigits,\n      style: NumberFormatStyle[style].toLowerCase()\n    };\n\n    if (style == NumberFormatStyle.Currency) {\n      options.currency = typeof currency == 'string' ? currency : undefined;\n      options.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';\n    }\n    return new Intl.NumberFormat(locale, options).format(num);\n  }\n}\n\ntype DateFormatterFn = (date: Date, locale: string) => string;\n\nconst DATE_FORMATS_SPLIT =\n    /((?:[^yMLdHhmsazZEwGjJ']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|J+|j+|m+|s+|a|z|Z|G+|w+))(.*)/;\n\nconst PATTERN_ALIASES: {[format: string]: DateFormatterFn} = {\n  // Keys are quoted so they do not get renamed during closure compilation.\n  'yMMMdjms': datePartGetterFactory(combine([\n    digitCondition('year', 1),\n    nameCondition('month', 3),\n    digitCondition('day', 1),\n    digitCondition('hour', 1),\n    digitCondition('minute', 1),\n    digitCondition('second', 1),\n  ])),\n  'yMdjm': datePartGetterFactory(combine([\n    digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1),\n    digitCondition('hour', 1), digitCondition('minute', 1)\n  ])),\n  'yMMMMEEEEd': datePartGetterFactory(combine([\n    digitCondition('year', 1), nameCondition('month', 4), nameCondition('weekday', 4),\n    digitCondition('day', 1)\n  ])),\n  'yMMMMd': datePartGetterFactory(\n      combine([digitCondition('year', 1), nameCondition('month', 4), digitCondition('day', 1)])),\n  'yMMMd': datePartGetterFactory(\n      combine([digitCondition('year', 1), nameCondition('month', 3), digitCondition('day', 1)])),\n  'yMd': datePartGetterFactory(\n      combine([digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1)])),\n  'jms': datePartGetterFactory(combine(\n      [digitCondition('hour', 1), digitCondition('second', 1), digitCondition('minute', 1)])),\n  'jm': datePartGetterFactory(combine([digitCondition('hour', 1), digitCondition('minute', 1)]))\n};\n\nconst DATE_FORMATS: {[format: string]: DateFormatterFn} = {\n  // Keys are quoted so they do not get renamed.\n  'yyyy': datePartGetterFactory(digitCondition('year', 4)),\n  'yy': datePartGetterFactory(digitCondition('year', 2)),\n  'y': datePartGetterFactory(digitCondition('year', 1)),\n  'MMMM': datePartGetterFactory(nameCondition('month', 4)),\n  'MMM': datePartGetterFactory(nameCondition('month', 3)),\n  'MM': datePartGetterFactory(digitCondition('month', 2)),\n  'M': datePartGetterFactory(digitCondition('month', 1)),\n  'LLLL': datePartGetterFactory(nameCondition('month', 4)),\n  'L': datePartGetterFactory(nameCondition('month', 1)),\n  'dd': datePartGetterFactory(digitCondition('day', 2)),\n  'd': datePartGetterFactory(digitCondition('day', 1)),\n  'HH': digitModifier(\n      hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), false)))),\n  'H': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), false))),\n  'hh': digitModifier(\n      hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), true)))),\n  'h': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n  'jj': datePartGetterFactory(digitCondition('hour', 2)),\n  'j': datePartGetterFactory(digitCondition('hour', 1)),\n  'mm': digitModifier(datePartGetterFactory(digitCondition('minute', 2))),\n  'm': datePartGetterFactory(digitCondition('minute', 1)),\n  'ss': digitModifier(datePartGetterFactory(digitCondition('second', 2))),\n  's': datePartGetterFactory(digitCondition('second', 1)),\n  // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n  // we can be just safely rely on using `sss` since we currently don't support single or two digit\n  // fractions\n  'sss': datePartGetterFactory(digitCondition('second', 3)),\n  'EEEE': datePartGetterFactory(nameCondition('weekday', 4)),\n  'EEE': datePartGetterFactory(nameCondition('weekday', 3)),\n  'EE': datePartGetterFactory(nameCondition('weekday', 2)),\n  'E': datePartGetterFactory(nameCondition('weekday', 1)),\n  'a': hourClockExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n  'Z': timeZoneGetter('short'),\n  'z': timeZoneGetter('long'),\n  'ww': datePartGetterFactory({}),  // Week of year, padded (00-53). Week 01 is the week with the\n                                    // first Thursday of the year. not support ?\n  'w':\n      datePartGetterFactory({}),  // Week of year (0-53). Week 1 is the week with the first Thursday\n                                  // of the year not support ?\n  'G': datePartGetterFactory(nameCondition('era', 1)),\n  'GG': datePartGetterFactory(nameCondition('era', 2)),\n  'GGG': datePartGetterFactory(nameCondition('era', 3)),\n  'GGGG': datePartGetterFactory(nameCondition('era', 4))\n};\n\n\nfunction digitModifier(inner: DateFormatterFn): DateFormatterFn {\n  return function(date: Date, locale: string): string {\n    const result = inner(date, locale);\n    return result.length == 1 ? '0' + result : result;\n  };\n}\n\nfunction hourClockExtractor(inner: DateFormatterFn): DateFormatterFn {\n  return function(date: Date, locale: string): string { return inner(date, locale).split(' ')[1]; };\n}\n\nfunction hourExtractor(inner: DateFormatterFn): DateFormatterFn {\n  return function(date: Date, locale: string): string { return inner(date, locale).split(' ')[0]; };\n}\n\nfunction intlDateFormat(date: Date, locale: string, options: Intl.DateTimeFormatOptions): string {\n  return new Intl.DateTimeFormat(locale, options).format(date).replace(/[\\u200e\\u200f]/g, '');\n}\n\nfunction timeZoneGetter(timezone: string): DateFormatterFn {\n  // To workaround `Intl` API restriction for single timezone let format with 24 hours\n  const options = {hour: '2-digit', hour12: false, timeZoneName: timezone};\n  return function(date: Date, locale: string): string {\n    const result = intlDateFormat(date, locale, options);\n    // Then extract first 3 letters that related to hours\n    return result ? result.substring(3) : '';\n  };\n}\n\nfunction hour12Modify(\n    options: Intl.DateTimeFormatOptions, value: boolean): Intl.DateTimeFormatOptions {\n  options.hour12 = value;\n  return options;\n}\n\nfunction digitCondition(prop: string, len: number): Intl.DateTimeFormatOptions {\n  const result: {[k: string]: string} = {};\n  result[prop] = len === 2 ? '2-digit' : 'numeric';\n  return result;\n}\n\nfunction nameCondition(prop: string, len: number): Intl.DateTimeFormatOptions {\n  const result: {[k: string]: string} = {};\n  if (len < 4) {\n    result[prop] = len > 1 ? 'short' : 'narrow';\n  } else {\n    result[prop] = 'long';\n  }\n\n  return result;\n}\n\nfunction combine(options: Intl.DateTimeFormatOptions[]): Intl.DateTimeFormatOptions {\n  return options.reduce((merged, opt) => ({...merged, ...opt}), {});\n}\n\nfunction datePartGetterFactory(ret: Intl.DateTimeFormatOptions): DateFormatterFn {\n  return (date: Date, locale: string): string => intlDateFormat(date, locale, ret);\n}\n\nconst DATE_FORMATTER_CACHE = new Map<string, string[]>();\n\nfunction dateFormatter(format: string, date: Date, locale: string): string {\n  const fn = PATTERN_ALIASES[format];\n\n  if (fn) return fn(date, locale);\n\n  const cacheKey = format;\n  let parts = DATE_FORMATTER_CACHE.get(cacheKey);\n\n  if (!parts) {\n    parts = [];\n    let match: RegExpExecArray|null;\n    DATE_FORMATS_SPLIT.exec(format);\n\n    let _format: string|null = format;\n    while (_format) {\n      match = DATE_FORMATS_SPLIT.exec(_format);\n      if (match) {\n        parts = parts.concat(match.slice(1));\n        _format = parts.pop() !;\n      } else {\n        parts.push(_format);\n        _format = null;\n      }\n    }\n\n    DATE_FORMATTER_CACHE.set(cacheKey, parts);\n  }\n\n  return parts.reduce((text, part) => {\n    const fn = DATE_FORMATS[part];\n    return text + (fn ? fn(date, locale) : partToTime(part));\n  }, '');\n}\n\nfunction partToTime(part: string): string {\n  return part === '\\'\\'' ? '\\'' : part.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n}\n\nexport class DateFormatter {\n  static format(date: Date, locale: string, pattern: string): string {\n    return dateFormatter(pattern, date, locale);\n  }\n}\n","/**\n* @license\n* Copyright Google Inc. 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 {ISO8601_DATE_REGEX, isoStringToDate} from '../../i18n/format_date';\nimport {invalidPipeArgumentError} from '../invalid_pipe_argument_error';\nimport {DateFormatter} from './intl';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a date according to locale rules.\n *\n * Where:\n * - `expression` is a date object or a number (milliseconds since UTC epoch) or an ISO string\n * (https://www.w3.org/TR/NOTE-datetime).\n * - `format` indicates which date/time components to include. The format can be predefined as\n *   shown below or custom as shown in the table.\n *   - `'medium'`: equivalent to `'yMMMdjms'` (e.g. `Sep 3, 2010, 12:05:08 PM` for `en-US`)\n *   - `'short'`: equivalent to `'yMdjm'` (e.g. `9/3/2010, 12:05 PM` for `en-US`)\n *   - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. `Friday, September 3, 2010` for `en-US`)\n *   - `'longDate'`: equivalent to `'yMMMMd'` (e.g. `September 3, 2010` for `en-US`)\n *   - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. `Sep 3, 2010` for `en-US`)\n *   - `'shortDate'`: equivalent to `'yMd'` (e.g. `9/3/2010` for `en-US`)\n *   - `'mediumTime'`: equivalent to `'jms'` (e.g. `12:05:08 PM` for `en-US`)\n *   - `'shortTime'`: equivalent to `'jm'` (e.g. `12:05 PM` for `en-US`)\n *\n *\n *  | Component | Symbol | Narrow | Short Form   | Long Form         | Numeric   | 2-digit   |\n *  |-----------|:------:|--------|--------------|-------------------|-----------|-----------|\n *  | era       |   G    | G (A)  | GGG (AD)     | GGGG (Anno Domini)| -         | -         |\n *  | year      |   y    | -      | -            | -                 | y (2015)  | yy (15)   |\n *  | month     |   M    | L (S)  | MMM (Sep)    | MMMM (September)  | M (9)     | MM (09)   |\n *  | day       |   d    | -      | -            | -                 | d (3)     | dd (03)   |\n *  | weekday   |   E    | E (S)  | EEE (Sun)    | EEEE (Sunday)     | -         | -         |\n *  | hour      |   j    | -      | -            | -                 | j (13)    | jj (13)   |\n *  | hour12    |   h    | -      | -            | -                 | h (1 PM)  | hh (01 PM)|\n *  | hour24    |   H    | -      | -            | -                 | H (13)    | HH (13)   |\n *  | minute    |   m    | -      | -            | -                 | m (5)     | mm (05)   |\n *  | second    |   s    | -      | -            | -                 | s (9)     | ss (09)   |\n *  | timezone  |   z    | -      | -            | z (Pacific Standard Time)| -  | -         |\n *  | timezone  |   Z    | -      | Z (GMT-8:00) | -                 | -         | -         |\n *  | timezone  |   a    | -      | a (PM)       | -                 | -         | -         |\n *\n * In javascript, only the components specified will be respected (not the ordering,\n * punctuations, ...) and details of the formatting will be dependent on the locale.\n *\n * Timezone of the formatted text will be the local system timezone of the end-user's machine.\n *\n * When the expression is a ISO string without time (e.g. 2016-09-19) the time zone offset is not\n * applied and the formatted text will have the same day, month and year of the expression.\n *\n * WARNINGS:\n * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.\n *   Instead users should treat the date as an immutable object and change the reference when the\n *   pipe needs to re-run (this is to avoid reformatting the date on every change detection run\n *   which would be an expensive operation).\n * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera\n *   browsers.\n *\n * @usageNotes\n *\n * ### Examples\n *\n * Assuming `dateObj` is (year: 2010, month: 9, day: 3, hour: 12 PM, minute: 05, second: 08)\n * in the _local_ time and locale is 'en-US':\n *\n * {@example common/pipes/ts/date_pipe.ts region='DeprecatedDatePipe'}\n *\n * @publicApi\n */\n@Pipe({name: 'date', pure: true})\nexport class DeprecatedDatePipe implements PipeTransform {\n  /** @internal */\n  static _ALIASES: {[key: string]: string} = {\n    'medium': 'yMMMdjms',\n    'short': 'yMdjm',\n    'fullDate': 'yMMMMEEEEd',\n    'longDate': 'yMMMMd',\n    'mediumDate': 'yMMMd',\n    'shortDate': 'yMd',\n    'mediumTime': 'jms',\n    'shortTime': 'jm'\n  };\n\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  transform(value: any, pattern: string = 'mediumDate'): string|null {\n    if (value == null || value === '' || value !== value) return null;\n\n    let date: Date;\n\n    if (typeof value === 'string') {\n      value = value.trim();\n    }\n\n    if (isDate(value)) {\n      date = value;\n    } else if (!isNaN(value - parseFloat(value))) {\n      date = new Date(parseFloat(value));\n    } else if (typeof value === 'string' && /^(\\d{4}-\\d{1,2}-\\d{1,2})$/.test(value)) {\n      /**\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\n       * timeoffset\n       * is applied\n       * Note: ISO months are 0 for January, 1 for February, ...\n       */\n      const [y, m, d] = value.split('-').map((val: string) => parseInt(val, 10));\n      date = new Date(y, m - 1, d);\n    } else {\n      date = new Date(value);\n    }\n\n    if (!isDate(date)) {\n      let match: RegExpMatchArray|null;\n      if ((typeof value === 'string') && (match = value.match(ISO8601_DATE_REGEX))) {\n        date = isoStringToDate(match);\n      } else {\n        throw invalidPipeArgumentError(DeprecatedDatePipe, value);\n      }\n    }\n\n    return DateFormatter.format(\n        date, this._locale, DeprecatedDatePipe._ALIASES[pattern] || pattern);\n  }\n}\n\nfunction isDate(value: any): value is Date {\n  return value instanceof Date && !isNaN(value.valueOf());\n}\n","/**\n * @license\n * Copyright Google Inc. 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, Type} from '@angular/core';\nimport {NUMBER_FORMAT_REGEXP, parseIntAutoRadix} from '../../i18n/format_number';\nimport {NumberFormatStyle} from '../../i18n/locale_data_api';\nimport {invalidPipeArgumentError} from '../invalid_pipe_argument_error';\nimport {NumberFormatter} from './intl';\n\nfunction formatNumber(\n    pipe: Type<any>, locale: string, value: number | string, style: NumberFormatStyle,\n    digits?: string | null, currency: string | null = null,\n    currencyAsSymbol: boolean = false): string|null {\n  if (value == null) return null;\n\n  // Convert strings to numbers\n  value = typeof value === 'string' && !isNaN(+value - parseFloat(value)) ? +value : value;\n  if (typeof value !== 'number') {\n    throw invalidPipeArgumentError(pipe, value);\n  }\n\n  let minInt: number|undefined;\n  let minFraction: number|undefined;\n  let maxFraction: number|undefined;\n  if (style !== NumberFormatStyle.Currency) {\n    // rely on Intl default for currency\n    minInt = 1;\n    minFraction = 0;\n    maxFraction = 3;\n  }\n\n  if (digits) {\n    const parts = digits.match(NUMBER_FORMAT_REGEXP);\n    if (parts === null) {\n      throw new Error(`${digits} is not a valid digit info for number pipes`);\n    }\n    if (parts[1] != null) {  // min integer digits\n      minInt = parseIntAutoRadix(parts[1]);\n    }\n    if (parts[3] != null) {  // min fraction digits\n      minFraction = parseIntAutoRadix(parts[3]);\n    }\n    if (parts[5] != null) {  // max fraction digits\n      maxFraction = parseIntAutoRadix(parts[5]);\n    }\n  }\n\n  return NumberFormatter.format(value as number, locale, style, {\n    minimumIntegerDigits: minInt,\n    minimumFractionDigits: minFraction,\n    maximumFractionDigits: maxFraction,\n    currency: currency,\n    currencyAsSymbol: currencyAsSymbol,\n  });\n}\n\n/**\n * Formats a number as text. Group sizing and separator and other locale-specific\n * configurations are based on the active locale.\n *\n * where `expression` is a number:\n *  - `digitInfo` is a `string` which has a following format: <br>\n *     <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>\n *   - `minIntegerDigits` is the minimum number of integer digits to use. Defaults to `1`.\n *   - `minFractionDigits` is the minimum number of digits after fraction. Defaults to `0`.\n *   - `maxFractionDigits` is the maximum number of digits after fraction. Defaults to `3`.\n *\n * For more information on the acceptable range for each of these numbers and other\n * details see your native internationalization library.\n *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See [Browser Support](guide/browser-support) for details.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/number_pipe.ts region='DeprecatedNumberPipe'}\n *\n * @ngModule CommonModule\n * @publicApi\n */\n@Pipe({name: 'number'})\nexport class DeprecatedDecimalPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  transform(value: any, digits?: string): string|null {\n    return formatNumber(\n        DeprecatedDecimalPipe, this._locale, value, NumberFormatStyle.Decimal, digits);\n  }\n}\n\n/**\n * @ngModule CommonModule\n *\n * @description\n *\n * Formats a number as percentage according to locale rules.\n *\n * - `digitInfo` See {@link DecimalPipe} for detailed description.\n *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See [Browser Support](guide/browser-support) for details.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/percent_pipe.ts region='DeprecatedPercentPipe'}\n *\n * @publicApi\n */\n@Pipe({name: 'percent'})\nexport class DeprecatedPercentPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  transform(value: any, digits?: string): string|null {\n    return formatNumber(\n        DeprecatedPercentPipe, this._locale, value, NumberFormatStyle.Percent, digits);\n  }\n}\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Formats a number as currency using locale rules.\n *\n * Use `currency` to format a number as currency.\n *\n * - `currencyCode` is the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such\n *    as `USD` for the US dollar and `EUR` for the euro.\n * - `symbolDisplay` is a boolean indicating whether to use the currency symbol or code.\n *   - `true`: use symbol (e.g. `$`).\n *   - `false`(default): use code (e.g. `USD`).\n * - `digitInfo` See {@link DecimalPipe} for detailed description.\n *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See [Browser Support](guide/browser-support) for details.\n *\n * @usageNotes\n *\n * ### Example\n *\n * {@example common/pipes/ts/currency_pipe.ts region='DeprecatedCurrencyPipe'}\n *\n * @publicApi\n */\n@Pipe({name: 'currency'})\nexport class DeprecatedCurrencyPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  transform(\n      value: any, currencyCode: string = 'USD', symbolDisplay: boolean = false,\n      digits?: string): string|null {\n    return formatNumber(\n        DeprecatedCurrencyPipe, this._locale, value, NumberFormatStyle.Currency, digits,\n        currencyCode, symbolDisplay);\n  }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 {DeprecatedDatePipe} from './date_pipe';\nimport {DeprecatedCurrencyPipe, DeprecatedDecimalPipe, DeprecatedPercentPipe} from './number_pipe';\n\nexport {\n  DeprecatedCurrencyPipe,\n  DeprecatedDatePipe,\n  DeprecatedDecimalPipe,\n  DeprecatedPercentPipe,\n};\n\n\n/**\n * A collection of deprecated i18n pipes that require intl api\n *\n * @deprecated from v5\n */\nexport const COMMON_DEPRECATED_I18N_PIPES: Provider[] =\n    [DeprecatedDecimalPipe, DeprecatedPercentPipe, DeprecatedCurrencyPipe, DeprecatedDatePipe];\n","/**\n * @license\n * Copyright Google Inc. 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, Injectable, OnDestroy, Pipe, PipeTransform, WrappedValue, ÉµisObservable, ÉµisPromise, ÉµlooseIdentical} from '@angular/core';\nimport {Observable, SubscriptionLike} from 'rxjs';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\ninterface SubscriptionStrategy {\n  createSubscription(async: Observable<any>|Promise<any>, updateLatestValue: any): SubscriptionLike\n      |Promise<any>;\n  dispose(subscription: SubscriptionLike|Promise<any>): void;\n  onDestroy(subscription: SubscriptionLike|Promise<any>): void;\n}\n\nclass ObservableStrategy implements SubscriptionStrategy {\n  createSubscription(async: Observable<any>, updateLatestValue: any): SubscriptionLike {\n    return async.subscribe({next: updateLatestValue, error: (e: any) => { throw e; }});\n  }\n\n  dispose(subscription: SubscriptionLike): void { subscription.unsubscribe(); }\n\n  onDestroy(subscription: SubscriptionLike): void { subscription.unsubscribe(); }\n}\n\nclass PromiseStrategy implements SubscriptionStrategy {\n  createSubscription(async: Promise<any>, updateLatestValue: (v: any) => any): Promise<any> {\n    return async.then(updateLatestValue, e => { throw e; });\n  }\n\n  dispose(subscription: Promise<any>): void {}\n\n  onDestroy(subscription: Promise<any>): void {}\n}\n\nconst _promiseStrategy = new PromiseStrategy();\nconst _observableStrategy = new ObservableStrategy();\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@Injectable()\n@Pipe({name: 'async', pure: false})\nexport class AsyncPipe implements OnDestroy, PipeTransform {\n  private _latestValue: any = null;\n  private _latestReturnedValue: any = null;\n\n  private _subscription: SubscriptionLike|Promise<any>|null = null;\n  private _obj: Observable<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  transform<T>(obj: null): null;\n  transform<T>(obj: undefined): undefined;\n  transform<T>(obj: Observable<T>|null|undefined): T|null;\n  transform<T>(obj: Promise<T>|null|undefined): T|null;\n  transform(obj: Observable<any>|Promise<any>|null|undefined): any {\n    if (!this._obj) {\n      if (obj) {\n        this._subscribe(obj);\n      }\n      this._latestReturnedValue = this._latestValue;\n      return this._latestValue;\n    }\n\n    if (obj !== this._obj) {\n      this._dispose();\n      return this.transform(obj as any);\n    }\n\n    if (ÉµlooseIdentical(this._latestValue, this._latestReturnedValue)) {\n      return this._latestReturnedValue;\n    }\n\n    this._latestReturnedValue = this._latestValue;\n    return WrappedValue.wrap(this._latestValue);\n  }\n\n  private _subscribe(obj: Observable<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: Observable<any>|Promise<any>|EventEmitter<any>): any {\n    if (ÉµisPromise(obj)) {\n      return _promiseStrategy;\n    }\n\n    if (ÉµisObservable(obj)) {\n      return _observableStrategy;\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._latestReturnedValue = 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 Inc. 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 {Injectable, 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@Injectable()\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    if (!value) return value;\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// (http://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@Injectable()\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    if (!value) return value;\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@Injectable()\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    if (!value) return value;\n    if (typeof value !== 'string') {\n      throw invalidPipeArgumentError(UpperCasePipe, value);\n    }\n    return value.toUpperCase();\n  }\n}\n","/**\n * @license\n * Copyright Google Inc. 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, 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 * Examples are given in `en-US` locale.\n *\n * - `'short'`: equivalent to `'M/d/yy, h:mm a'` (`6/15/15, 9:03 AM`).\n * - `'medium'`: equivalent to `'MMM d, y, h:mm:ss a'` (`Jun 15, 2015, 9:03:01 AM`).\n * - `'long'`: equivalent to `'MMMM d, y, h:mm:ss a z'` (`June 15, 2015 at 9:03:01 AM\n * GMT+1`).\n * - `'full'`: equivalent to `'EEEE, MMMM d, y, h:mm:ss a zzzz'` (`Monday, June 15, 2015 at\n * 9:03:01 AM GMT+01:00`).\n * - `'shortDate'`: equivalent to `'M/d/yy'` (`6/15/15`).\n * - `'mediumDate'`: equivalent to `'MMM d, y'` (`Jun 15, 2015`).\n * - `'longDate'`: equivalent to `'MMMM d, y'` (`June 15, 2015`).\n * - `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` (`Monday, June 15, 2015`).\n * - `'shortTime'`: equivalent to `'h:mm a'` (`9:03 AM`).\n * - `'mediumTime'`: equivalent to `'h:mm:ss a'` (`9:03:01 AM`).\n * - `'longTime'`: equivalent to `'h:mm:ss a z'` (`9:03:01 AM GMT+1`).\n * - `'fullTime'`: equivalent to `'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 *  | 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 * Note that timezone correction is not applied to an ISO string that has no time component, such as \"2016-09-19\"\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@Injectable()\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. Default is\n   * the local system timezone of the end-user's machine.\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: any, format = 'mediumDate', timezone?: string, 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 Inc. 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 {Injectable, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\nimport {NgLocalization, getPluralCategory} from '../i18n/localization';\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@Injectable()\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, pluralMap: {[count: string]: string}, locale?: string): 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 Inc. 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 {Injectable, 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@Injectable()\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 Inc. 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 {Injectable, 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@Injectable()\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 { return JSON.stringify(value, null, 2); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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 {Injectable, 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 keyvalue\n * pipe.\n *\n * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}\n *\n * @publicApi\n */\n@Injectable()\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  transform<K, V>(input: null, compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number): null;\n  transform<V>(\n      input: {[key: string]: V}|Map<string, V>,\n      compareFn?: (a: KeyValue<string, V>, b: KeyValue<string, V>) => number):\n      Array<KeyValue<string, V>>;\n  transform<V>(\n      input: {[key: number]: V}|Map<number, V>,\n      compareFn?: (a: KeyValue<number, V>, b: KeyValue<number, V>) => number):\n      Array<KeyValue<number, V>>;\n  transform<K, V>(input: Map<K, V>, compareFn?: (a: KeyValue<K, V>, b: KeyValue<K, V>) => number):\n      Array<KeyValue<K, V>>;\n  transform<K, V>(\n      input: null|{[key: string]: V, [key: number]: V}|Map<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 Inc. 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, Pipe, PipeTransform} from '@angular/core';\nimport {formatCurrency, formatNumber, formatPercent} from '../i18n/format_number';\nimport {getCurrencySymbol} from '../i18n/locale_data_api';\nimport {invalidPipeArgumentError} from './invalid_pipe_argument_error';\n\n/**\n * @ngModule CommonModule\n * @description\n *\n * Transforms a number into a string,\n * formatted according to locale rules that determine group sizing and\n * separator, decimal-point character, and other locale-specific\n * configurations.\n *\n * If no parameters are specified, the function rounds off to the nearest value using this\n * [rounding method](https://en.wikibooks.org/wiki/Arithmetic/Rounding).\n * The behavior differs from that of the JavaScript ```Math.round()``` function.\n * In the following case for example, the pipe rounds down where\n * ```Math.round()``` rounds up:\n *\n * ```html\n * -2.5 | number:'1.0-0'\n * > -3\n * Math.round(-2.5)\n * > -2\n * ```\n *\n * @see `formatNumber()`\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 * ### Example\n *\n * <code-example path=\"common/pipes/ts/number_pipe.ts\" region='NumberPipe'></code-example>\n *\n * @publicApi\n */\n@Injectable()\n@Pipe({name: 'number'})\nexport class DecimalPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\n\n  /**\n   * @param value The number to be formatted.\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 `3`.\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: any, digitsInfo?: string, locale?: string): string|null {\n    if (isEmpty(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@Injectable()\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: any, digitsInfo?: string, locale?: string): string|null {\n    if (isEmpty(value)) return null;\n\n    locale = locale || this._locale;\n\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 * @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@Injectable()\n@Pipe({name: 'currency'})\nexport class CurrencyPipe implements PipeTransform {\n  constructor(@Inject(LOCALE_ID) private _locale: string) {}\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.\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: any, currencyCode?: string,\n      display: 'code'|'symbol'|'symbol-narrow'|string|boolean = 'symbol', digitsInfo?: string,\n      locale?: string): string|null {\n    if (isEmpty(value)) return null;\n\n    locale = locale || this._locale;\n\n    if (typeof display === 'boolean') {\n      if (<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 || 'USD';\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 isEmpty(value: any): boolean {\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 Inc. 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 {Injectable, 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@Injectable()\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: string, start: number, end?: number): string;\n  transform(value: null, start: number, end?: number): null;\n  transform(value: undefined, start: number, end?: number): undefined;\n  transform(value: any, start: number, end?: number): any {\n    if (value == null) return value;\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 { return typeof obj === 'string' || Array.isArray(obj); }\n}\n","/**\n * @license\n * Copyright Google Inc. 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  KeyValue,\n  KeyValuePipe,\n  I18nPluralPipe,\n  I18nSelectPipe,\n  JsonPipe,\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 Inc. 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 {DEPRECATED_PLURAL_FN, NgLocaleLocalization, NgLocalization, getPluralCase} from './i18n/localization';\nimport {COMMON_DEPRECATED_I18N_PIPES} from './pipes/deprecated/index';\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/**\n * A module that contains the deprecated i18n pipes.\n *\n * @deprecated from v5\n * @publicApi\n */\n@NgModule({\n  declarations: [COMMON_DEPRECATED_I18N_PIPES],\n  exports: [COMMON_DEPRECATED_I18N_PIPES],\n  providers: [{provide: DEPRECATED_PLURAL_FN, useValue: getPluralCase}],\n})\nexport class DeprecatedI18NPipesModule {\n}\n","/**\n * @license\n * Copyright Google Inc. 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 into a Web Worker).\n *\n * @publicApi\n */\nexport const DOCUMENT = new InjectionToken<Document>('DocumentToken');\n","/**\n * @license\n * Copyright Google Inc. 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 Inc. 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('8.1.1');\n","/**\n * @license\n * Copyright Google Inc. 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 {ErrorHandler, ÉµÉµ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 ngInjectableDef = ÉµÉµdefineInjectable({\n    token: ViewportScroller,\n    providedIn: 'root',\n    factory: () => new BrowserViewportScroller(ÉµÉµinject(DOCUMENT), window, ÉµÉµinject(ErrorHandler))\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: any, private window: any, private errorHandler: ErrorHandler) {}\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.supportScrollRestoration()) {\n      return [this.window.scrollX, this.window.scrollY];\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.supportScrollRestoration()) {\n      this.window.scrollTo(position[0], position[1]);\n    }\n  }\n\n  /**\n   * Scrolls to an anchor element.\n   * @param anchor The ID of the anchor element.\n   */\n  scrollToAnchor(anchor: string): void {\n    if (this.supportScrollRestoration()) {\n      // Escape anything passed to `querySelector` as it can throw errors and stop the application\n      // from working if invalid values are passed.\n      if (this.window.CSS && this.window.CSS.escape) {\n        anchor = this.window.CSS.escape(anchor);\n      } else {\n        anchor = anchor.replace(/(\\\"|\\'\\ |:|\\.|\\[|\\]|,|=)/g, '\\\\$1');\n      }\n      try {\n        const elSelectedById = this.document.querySelector(`#${anchor}`);\n        if (elSelectedById) {\n          this.scrollToElement(elSelectedById);\n          return;\n        }\n        const elSelectedByName = this.document.querySelector(`[name='${anchor}']`);\n        if (elSelectedByName) {\n          this.scrollToElement(elSelectedByName);\n          return;\n        }\n      } catch (e) {\n        this.errorHandler.handleError(e);\n      }\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  private scrollToElement(el: any): 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   * 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      return !!this.window && !!this.window.scrollTo;\n    } catch {\n      return false;\n    }\n  }\n}\n\n\n/**\n * Provides an empty implementation of the viewport scroller. This will\n * live in @angular/common as it will be used by both platform-server and platform-webworker.\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] { return [0, 0]; }\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 Inc. 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 './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, getLocaleCurrencyName, getLocaleCurrencySymbol} from './i18n/locale_data_api';\nexport {parseCookieValue as ÉµparseCookieValue} from './cookie';\nexport {CommonModule, DeprecatedI18NPipesModule} from './common_module';\nexport {NgClass, NgClassBase, NgForOf, NgForOfContext, NgIf, NgIfContext, NgPlural, NgPluralCase, NgStyle, NgStyleBase, 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 {DeprecatedDatePipe, DeprecatedCurrencyPipe, DeprecatedDecimalPipe, DeprecatedPercentPipe} from './pipes/deprecated/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\nexport {NgClassImplProvider__POST_R3__ as ÉµNgClassImplProvider__POST_R3__, NgClassR2Impl as ÉµNgClassR2Impl, NgClassImpl as ÉµNgClassImpl} from './directives/ng_class_impl';\nexport {NgStyleImplProvider__POST_R3__ as ÉµNgStyleImplProvider__POST_R3__, NgStyleR2Impl as ÉµNgStyleR2Impl, NgStyleImpl as ÉµNgStyleImpl} from './directives/ng_style_impl';\nexport {ngStyleDirectiveDef__POST_R3__ as ÉµngStyleDirectiveDef__POST_R3__} from './directives/ng_style';\nexport {ngClassDirectiveDef__POST_R3__ as ÉµngClassDirectiveDef__POST_R3__} from './directives/ng_class';\n","/**\n * @license\n * Copyright Google Inc. 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';\nexport {registerLocaleData as ÉµregisterLocaleData} from './src/i18n/locale_data';\n\n// This file only reexports content of the `src` folder. Keep it that way.\n","/**\n * @license\n * Copyright Google Inc. 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_c} from './src/directives/index';\nexport {NgClassImplProvider as Éµangular_packages_common_common_h,NgClassImplProvider__PRE_R3__ as Éµangular_packages_common_common_g,NgClassR3Impl as Éµangular_packages_common_common_f} from './src/directives/ng_class_impl';\nexport {NgStyleImplProvider as Éµangular_packages_common_common_k,NgStyleImplProvider__PRE_R3__ as Éµangular_packages_common_common_j,NgStyleR3Impl as Éµangular_packages_common_common_i} from './src/directives/ng_style_impl';\nexport {DEPRECATED_PLURAL_FN as Éµangular_packages_common_common_a,getPluralCase as Éµangular_packages_common_common_b} from './src/i18n/localization';\nexport {COMMON_DEPRECATED_I18N_PIPES as Éµangular_packages_common_common_e} from './src/pipes/deprecated/index';\nexport {COMMON_PIPES as Éµangular_packages_common_common_d} from './src/pipes/index';"],"names":["tslib_1.__extends","tslib_1.__param","findLocaleData","LocaleDataIndex","LOCALE_DATA","tslib_1.__values","isListLikeIterable","stringify","tslib_1.__decorate","ɵ0","DATE_FORMATS_SPLIT","DATE_FORMATS","timeZoneGetter","isDate","formatNumber"],"mappings":"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"}