/**
 * @license Angular v11.2.14
 * (c) 2010-2021 Google LLC. https://angular.io/
 * License: MIT
 */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core")):"function"==typeof define&&define.amd?define("@angular/common",["exports","@angular/core"],t):t(((e=e||self).ng=e.ng||{},e.ng.common={}),e.ng.core)}(this,(function(e,t){"use strict";
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var r=null;function n(){return r}var u=function u(){},o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
    ***************************************************************************** */function i(e,t){function r(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function a(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function s(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,u,o=r.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(e){u={error:e}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(u)throw u.error}}return i}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var c,l=new t.InjectionToken("DocumentToken");function f(){return t.ɵɵinject(h)}(c=function c(){}).ɵprov=t.ɵɵdefineInjectable({factory:f,token:c,providedIn:"platform"}),c.decorators=[{type:t.Injectable,args:[{providedIn:"platform",useFactory:f}]}];var p,D=new t.InjectionToken("Location Initialized"),h=function(e){function t(t){var r=e.call(this)||this;return r._doc=t,r._init(),r}return i(t,e),t.prototype._init=function(){this.location=n().getLocation(),this._history=n().getHistory()},t.prototype.getBaseHrefFromDOM=function(){return n().getBaseHref(this._doc)},t.prototype.onPopState=function(e){n().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",e,!1)},t.prototype.onHashChange=function(e){n().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",e,!1)},Object.defineProperty(t.prototype,"href",{get:function(){return this.location.href},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"protocol",{get:function(){return this.location.protocol},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hostname",{get:function(){return this.location.hostname},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"port",{get:function(){return this.location.port},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"pathname",{get:function(){return this.location.pathname},set:function(e){this.location.pathname=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"search",{get:function(){return this.location.search},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hash",{get:function(){return this.location.hash},enumerable:!1,configurable:!0}),t.prototype.pushState=function(e,t,r){d()?this._history.pushState(e,t,r):this.location.hash=r},t.prototype.replaceState=function(e,t,r){d()?this._history.replaceState(e,t,r):this.location.hash=r},t.prototype.forward=function(){this._history.forward()},t.prototype.back=function(){this._history.back()},t.prototype.getState=function(){return this._history.state},t}(c);function d(){return!!window.history.pushState}function y(){return new h(t.ɵɵinject(l))}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function g(e,t){if(0==e.length)return t;if(0==t.length)return e;var r=0;return e.endsWith("/")&&r++,t.startsWith("/")&&r++,2==r?e+t.substring(1):1==r?e+t:e+"/"+t}function m(e){var t=e.match(/#|\?|$/),r=t&&t.index||e.length;return e.slice(0,r-("/"===e[r-1]?1:0))+e.slice(r)}function C(e){return e&&"?"!==e[0]?"?"+e:e}function F(e){var r=t.ɵɵinject(l).location;return new E(t.ɵɵinject(c),r&&r.origin||"")}h.ɵprov=t.ɵɵdefineInjectable({factory:y,token:h,providedIn:"platform"}),h.decorators=[{type:t.Injectable,args:[{providedIn:"platform",useFactory:y}]}],h.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[l]}]}]},(p=function p(){}).ɵprov=t.ɵɵdefineInjectable({factory:F,token:p,providedIn:"root"}),p.decorators=[{type:t.Injectable,args:[{providedIn:"root",useFactory:F}]}];var v=new t.InjectionToken("appBaseHref"),E=function(e){function t(t,r){var n=e.call(this)||this;if(n._platformLocation=t,null==r&&(r=n._platformLocation.getBaseHrefFromDOM()),null==r)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return n._baseHref=r,n}return i(t,e),t.prototype.onPopState=function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.prepareExternalUrl=function(e){return g(this._baseHref,e)},t.prototype.path=function(e){void 0===e&&(e=!1);var t=this._platformLocation.pathname+C(this._platformLocation.search),r=this._platformLocation.hash;return r&&e?""+t+r:t},t.prototype.pushState=function(e,t,r,n){var u=this.prepareExternalUrl(r+C(n));this._platformLocation.pushState(e,t,u)},t.prototype.replaceState=function(e,t,r,n){var u=this.prepareExternalUrl(r+C(n));this._platformLocation.replaceState(e,t,u)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(p);E.decorators=[{type:t.Injectable}],E.ctorParameters=function(){return[{type:c},{type:String,decorators:[{type:t.Optional},{type:t.Inject,args:[v]}]}]};var b=function(e){function t(t,r){var n=e.call(this)||this;return n._platformLocation=t,n._baseHref="",null!=r&&(n._baseHref=r),n}return i(t,e),t.prototype.onPopState=function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.path=function(e){void 0===e&&(e=!1);var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t},t.prototype.prepareExternalUrl=function(e){var t=g(this._baseHref,e);return t.length>0?"#"+t:t},t.prototype.pushState=function(e,t,r,n){var u=this.prepareExternalUrl(r+C(n));0==u.length&&(u=this._platformLocation.pathname),this._platformLocation.pushState(e,t,u)},t.prototype.replaceState=function(e,t,r,n){var u=this.prepareExternalUrl(r+C(n));0==u.length&&(u=this._platformLocation.pathname),this._platformLocation.replaceState(e,t,u)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(p);b.decorators=[{type:t.Injectable}],b.ctorParameters=function(){return[{type:c},{type:String,decorators:[{type:t.Optional},{type:t.Inject,args:[v]}]}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var _=function(){function e(e,r){var n=this;this._subject=new t.EventEmitter,this._urlChangeListeners=[],this._platformStrategy=e;var u=this._platformStrategy.getBaseHref();this._platformLocation=r,this._baseHref=m(S(u)),this._platformStrategy.onPopState((function(e){n._subject.emit({url:n.path(!0),pop:!0,state:e.state,type:e.type})}))}return e.prototype.path=function(e){return void 0===e&&(e=!1),this.normalize(this._platformStrategy.path(e))},e.prototype.getState=function(){return this._platformLocation.getState()},e.prototype.isCurrentPathEqualTo=function(e,t){return void 0===t&&(t=""),this.path()==this.normalize(e+C(t))},e.prototype.normalize=function(t){return e.stripTrailingSlash(function r(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,S(t)))},e.prototype.prepareExternalUrl=function(e){return e&&"/"!==e[0]&&(e="/"+e),this._platformStrategy.prepareExternalUrl(e)},e.prototype.go=function(e,t,r){void 0===t&&(t=""),void 0===r&&(r=null),this._platformStrategy.pushState(r,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+C(t)),r)},e.prototype.replaceState=function(e,t,r){void 0===t&&(t=""),void 0===r&&(r=null),this._platformStrategy.replaceState(r,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+C(t)),r)},e.prototype.forward=function(){this._platformStrategy.forward()},e.prototype.back=function(){this._platformStrategy.back()},e.prototype.onUrlChange=function(e){var t=this;this._urlChangeListeners.push(e),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe((function(e){t._notifyUrlChangeListeners(e.url,e.state)})))},e.prototype._notifyUrlChangeListeners=function(e,t){void 0===e&&(e=""),this._urlChangeListeners.forEach((function(r){return r(e,t)}))},e.prototype.subscribe=function(e,t,r){return this._subject.subscribe({next:e,error:t,complete:r})},e}();function A(){return new _(t.ɵɵinject(p),t.ɵɵinject(c))}function S(e){return e.replace(/\/index.html$/,"")}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */_.normalizeQueryParams=C,_.joinWithSlash=g,_.stripTrailingSlash=m,_.ɵprov=t.ɵɵdefineInjectable({factory:A,token:_,providedIn:"root"}),_.decorators=[{type:t.Injectable,args:[{providedIn:"root",useFactory:A}]}],_.ctorParameters=function(){return[{type:p},{type:c}]};var w,B,L,P,O,I,k,R={ADP:[void 0,void 0,0],AFN:[void 0,void 0,0],ALL:[void 0,void 0,0],AMD:[void 0,void 0,2],AOA:[void 0,"Kz"],ARS:[void 0,"$"],AUD:["A$","$"],BAM:[void 0,"KM"],BBD:[void 0,"$"],BDT:[void 0,"৳"],BHD:[void 0,void 0,3],BIF:[void 0,void 0,0],BMD:[void 0,"$"],BND:[void 0,"$"],BOB:[void 0,"Bs"],BRL:["R$"],BSD:[void 0,"$"],BWP:[void 0,"P"],BYN:[void 0,"р.",2],BYR:[void 0,void 0,0],BZD:[void 0,"$"],CAD:["CA$","$",2],CHF:[void 0,void 0,2],CLF:[void 0,void 0,4],CLP:[void 0,"$",0],CNY:["CN¥","¥"],COP:[void 0,"$",2],CRC:[void 0,"₡",2],CUC:[void 0,"$"],CUP:[void 0,"$"],CZK:[void 0,"Kč",2],DJF:[void 0,void 0,0],DKK:[void 0,"kr",2],DOP:[void 0,"$"],EGP:[void 0,"E£"],ESP:[void 0,"₧",0],EUR:["€"],FJD:[void 0,"$"],FKP:[void 0,"£"],GBP:["£"],GEL:[void 0,"₾"],GIP:[void 0,"£"],GNF:[void 0,"FG",0],GTQ:[void 0,"Q"],GYD:[void 0,"$",2],HKD:["HK$","$"],HNL:[void 0,"L"],HRK:[void 0,"kn"],HUF:[void 0,"Ft",2],IDR:[void 0,"Rp",2],ILS:["₪"],INR:["₹"],IQD:[void 0,void 0,0],IRR:[void 0,void 0,0],ISK:[void 0,"kr",0],ITL:[void 0,void 0,0],JMD:[void 0,"$"],JOD:[void 0,void 0,3],JPY:["¥",void 0,0],KHR:[void 0,"៛"],KMF:[void 0,"CF",0],KPW:[void 0,"₩",0],KRW:["₩",void 0,0],KWD:[void 0,void 0,3],KYD:[void 0,"$"],KZT:[void 0,"₸"],LAK:[void 0,"₭",0],LBP:[void 0,"L£",0],LKR:[void 0,"Rs"],LRD:[void 0,"$"],LTL:[void 0,"Lt"],LUF:[void 0,void 0,0],LVL:[void 0,"Ls"],LYD:[void 0,void 0,3],MGA:[void 0,"Ar",0],MGF:[void 0,void 0,0],MMK:[void 0,"K",0],MNT:[void 0,"₮",2],MRO:[void 0,void 0,0],MUR:[void 0,"Rs",2],MXN:["MX$","$"],MYR:[void 0,"RM"],NAD:[void 0,"$"],NGN:[void 0,"₦"],NIO:[void 0,"C$"],NOK:[void 0,"kr",2],NPR:[void 0,"Rs"],NZD:["NZ$","$"],OMR:[void 0,void 0,3],PHP:[void 0,"₱"],PKR:[void 0,"Rs",2],PLN:[void 0,"zł"],PYG:[void 0,"₲",0],RON:[void 0,"lei"],RSD:[void 0,void 0,0],RUB:[void 0,"₽"],RUR:[void 0,"р."],RWF:[void 0,"RF",0],SBD:[void 0,"$"],SEK:[void 0,"kr",2],SGD:[void 0,"$"],SHP:[void 0,"£"],SLL:[void 0,void 0,0],SOS:[void 0,void 0,0],SRD:[void 0,"$"],SSP:[void 0,"£"],STD:[void 0,void 0,0],STN:[void 0,"Db"],SYP:[void 0,"£",0],THB:[void 0,"฿"],TMM:[void 0,void 0,0],TND:[void 0,void 0,3],TOP:[void 0,"T$"],TRL:[void 0,void 0,0],TRY:[void 0,"₺"],TTD:[void 0,"$"],TWD:["NT$","$",2],TZS:[void 0,void 0,2],UAH:[void 0,"₴"],UGX:[void 0,void 0,0],USD:["$"],UYI:[void 0,void 0,0],UYU:[void 0,"$"],UYW:[void 0,void 0,4],UZS:[void 0,void 0,2],VEF:[void 0,"Bs",2],VND:["₫",void 0,0],VUV:[void 0,void 0,0],XAF:["FCFA",void 0,0],XCD:["EC$","$"],XOF:["CFA",void 0,0],XPF:["CFPF",void 0,0],XXX:["¤"],YER:[void 0,void 0,0],ZAR:[void 0,"R"],ZMK:[void 0,void 0,0],ZMW:[void 0,"ZK"],ZWD:[void 0,void 0,0]};function T(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.LocaleId]}function x(e,r,n){var u=t.ɵfindLocaleData(e),o=K([u[t.ɵLocaleDataIndex.DayPeriodsFormat],u[t.ɵLocaleDataIndex.DayPeriodsStandalone]],r);return K(o,n)}function N(e,r,n){var u=t.ɵfindLocaleData(e),o=K([u[t.ɵLocaleDataIndex.DaysFormat],u[t.ɵLocaleDataIndex.DaysStandalone]],r);return K(o,n)}function M(e,r,n){var u=t.ɵfindLocaleData(e),o=K([u[t.ɵLocaleDataIndex.MonthsFormat],u[t.ɵLocaleDataIndex.MonthsStandalone]],r);return K(o,n)}function V(e,r){return K(t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.Eras],r)}function j(e,r){return K(t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.DateFormat],r)}function W(e,r){return K(t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.TimeFormat],r)}function H(e,r){return K(t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.DateTimeFormat],r)}function U(r,n){var u=t.ɵfindLocaleData(r),o=u[t.ɵLocaleDataIndex.NumberSymbols][n];if(void 0===o){if(n===e.NumberSymbol.CurrencyDecimal)return u[t.ɵLocaleDataIndex.NumberSymbols][e.NumberSymbol.Decimal];if(n===e.NumberSymbol.CurrencyGroup)return u[t.ɵLocaleDataIndex.NumberSymbols][e.NumberSymbol.Group]}return o}function $(e,r){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.NumberFormats][r]}(w=e.NumberFormatStyle||(e.NumberFormatStyle={}))[w.Decimal=0]="Decimal",w[w.Percent=1]="Percent",w[w.Currency=2]="Currency",w[w.Scientific=3]="Scientific",(B=e.Plural||(e.Plural={}))[B.Zero=0]="Zero",B[B.One=1]="One",B[B.Two=2]="Two",B[B.Few=3]="Few",B[B.Many=4]="Many",B[B.Other=5]="Other",(L=e.FormStyle||(e.FormStyle={}))[L.Format=0]="Format",L[L.Standalone=1]="Standalone",(P=e.TranslationWidth||(e.TranslationWidth={}))[P.Narrow=0]="Narrow",P[P.Abbreviated=1]="Abbreviated",P[P.Wide=2]="Wide",P[P.Short=3]="Short",(O=e.FormatWidth||(e.FormatWidth={}))[O.Short=0]="Short",O[O.Medium=1]="Medium",O[O.Long=2]="Long",O[O.Full=3]="Full",(I=e.NumberSymbol||(e.NumberSymbol={}))[I.Decimal=0]="Decimal",I[I.Group=1]="Group",I[I.List=2]="List",I[I.PercentSign=3]="PercentSign",I[I.PlusSign=4]="PlusSign",I[I.MinusSign=5]="MinusSign",I[I.Exponential=6]="Exponential",I[I.SuperscriptingExponent=7]="SuperscriptingExponent",I[I.PerMille=8]="PerMille",I[I[1/0]=9]="Infinity",I[I.NaN=10]="NaN",I[I.TimeSeparator=11]="TimeSeparator",I[I.CurrencyDecimal=12]="CurrencyDecimal",I[I.CurrencyGroup=13]="CurrencyGroup",(k=e.WeekDay||(e.WeekDay={}))[k.Sunday=0]="Sunday",k[k.Monday=1]="Monday",k[k.Tuesday=2]="Tuesday",k[k.Wednesday=3]="Wednesday",k[k.Thursday=4]="Thursday",k[k.Friday=5]="Friday",k[k.Saturday=6]="Saturday";var G=t.ɵgetLocalePluralCase;function Y(e){if(!e[t.ɵLocaleDataIndex.ExtraData])throw new Error('Missing extra locale data for the locale "'+e[t.ɵLocaleDataIndex.LocaleId]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function z(e){var r=t.ɵfindLocaleData(e);return Y(r),(r[t.ɵLocaleDataIndex.ExtraData][2]||[]).map((function(e){return"string"==typeof e?X(e):[X(e[0]),X(e[1])]}))}function Z(e,r,n){var u=t.ɵfindLocaleData(e);Y(u);var o=K([u[t.ɵLocaleDataIndex.ExtraData][0],u[t.ɵLocaleDataIndex.ExtraData][1]],r)||[];return K(o,n)||[]}function K(e,t){for(var r=t;r>-1;r--)if(void 0!==e[r])return e[r];throw new Error("Locale data API: locale data undefined")}function X(e){var t=s(e.split(":"),2);return{hours:+t[0],minutes:+t[1]}}function J(e,r,n){void 0===n&&(n="en");var u=function o(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.Currencies]}(n)[e]||R[e]||[],i=u[1];return"narrow"===r&&"string"==typeof i?i:u[0]||e}function Q(e){var t,r=R[e];return r&&(t=r[2]),"number"==typeof t?t:2}var q,ee,te,re=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,ne={},ue=/((?:[^GyYMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;function oe(t,r,n,u){var o=function i(e){if(ge(e))return e;if("number"==typeof e&&!isNaN(e))return new Date(e);if("string"==typeof e){if(e=e.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(e)){var t=s(e.split("-").map((function(e){return+e})),3),r=t[1],n=t[2];return ie(t[0],(void 0===r?1:r)-1,void 0===n?1:n)}var u,o=parseFloat(e);if(!isNaN(e-o))return new Date(o);if(u=e.match(re))return function i(e){var t=new Date(0),r=0,n=0,u=e[8]?t.setUTCFullYear:t.setFullYear,o=e[8]?t.setUTCHours:t.setHours;e[9]&&(r=Number(e[9]+e[10]),n=Number(e[9]+e[11])),u.call(t,Number(e[1]),Number(e[2])-1,Number(e[3]));var i=Number(e[4]||0)-r,a=Number(e[5]||0)-n,s=Number(e[6]||0),c=Math.floor(1e3*parseFloat("0."+(e[7]||0)));return o.call(t,i,a,s,c),t}(u)}var a=new Date(e);if(!ge(a))throw new Error('Unable to convert "'+e+'" into a date');return a}(t);r=function t(r,n){var u=T(r);if(ne[u]=ne[u]||{},ne[u][n])return ne[u][n];var o="";switch(n){case"shortDate":o=j(r,e.FormatWidth.Short);break;case"mediumDate":o=j(r,e.FormatWidth.Medium);break;case"longDate":o=j(r,e.FormatWidth.Long);break;case"fullDate":o=j(r,e.FormatWidth.Full);break;case"shortTime":o=W(r,e.FormatWidth.Short);break;case"mediumTime":o=W(r,e.FormatWidth.Medium);break;case"longTime":o=W(r,e.FormatWidth.Long);break;case"fullTime":o=W(r,e.FormatWidth.Full);break;case"short":var i=t(r,"shortTime"),a=t(r,"shortDate");o=ae(H(r,e.FormatWidth.Short),[i,a]);break;case"medium":var s=t(r,"mediumTime"),c=t(r,"mediumDate");o=ae(H(r,e.FormatWidth.Medium),[s,c]);break;case"long":var l=t(r,"longTime"),f=t(r,"longDate");o=ae(H(r,e.FormatWidth.Long),[l,f]);break;case"full":var p=t(r,"fullTime"),D=t(r,"fullDate");o=ae(H(r,e.FormatWidth.Full),[p,D])}return o&&(ne[u][n]=o),o}(n,r)||r;for(var a,c=[];r;){if(!(a=ue.exec(r))){c.push(r);break}var l=(c=c.concat(a.slice(1))).pop();if(!l)break;r=l}var f=o.getTimezoneOffset();u&&(f=ye(u,f),o=function p(e,t,r){var n=r?-1:1,u=e.getTimezoneOffset();return function o(e,t){return(e=new Date(e.getTime())).setMinutes(e.getMinutes()+t),e}(e,n*(ye(t,u)-u))}(o,u,!0));var D="";return c.forEach((function(t){var r=function u(t){if(de[t])return de[t];var r;switch(t){case"G":case"GG":case"GGG":r=le(te.Eras,e.TranslationWidth.Abbreviated);break;case"GGGG":r=le(te.Eras,e.TranslationWidth.Wide);break;case"GGGGG":r=le(te.Eras,e.TranslationWidth.Narrow);break;case"y":r=ce(ee.FullYear,1,0,!1,!0);break;case"yy":r=ce(ee.FullYear,2,0,!0,!0);break;case"yyy":r=ce(ee.FullYear,3,0,!1,!0);break;case"yyyy":r=ce(ee.FullYear,4,0,!1,!0);break;case"Y":r=he(1);break;case"YY":r=he(2,!0);break;case"YYY":r=he(3);break;case"YYYY":r=he(4);break;case"M":case"L":r=ce(ee.Month,1,1);break;case"MM":case"LL":r=ce(ee.Month,2,1);break;case"MMM":r=le(te.Months,e.TranslationWidth.Abbreviated);break;case"MMMM":r=le(te.Months,e.TranslationWidth.Wide);break;case"MMMMM":r=le(te.Months,e.TranslationWidth.Narrow);break;case"LLL":r=le(te.Months,e.TranslationWidth.Abbreviated,e.FormStyle.Standalone);break;case"LLLL":r=le(te.Months,e.TranslationWidth.Wide,e.FormStyle.Standalone);break;case"LLLLL":r=le(te.Months,e.TranslationWidth.Narrow,e.FormStyle.Standalone);break;case"w":r=De(1);break;case"ww":r=De(2);break;case"W":r=De(1,!0);break;case"d":r=ce(ee.Date,1);break;case"dd":r=ce(ee.Date,2);break;case"E":case"EE":case"EEE":r=le(te.Days,e.TranslationWidth.Abbreviated);break;case"EEEE":r=le(te.Days,e.TranslationWidth.Wide);break;case"EEEEE":r=le(te.Days,e.TranslationWidth.Narrow);break;case"EEEEEE":r=le(te.Days,e.TranslationWidth.Short);break;case"a":case"aa":case"aaa":r=le(te.DayPeriods,e.TranslationWidth.Abbreviated);break;case"aaaa":r=le(te.DayPeriods,e.TranslationWidth.Wide);break;case"aaaaa":r=le(te.DayPeriods,e.TranslationWidth.Narrow);break;case"b":case"bb":case"bbb":r=le(te.DayPeriods,e.TranslationWidth.Abbreviated,e.FormStyle.Standalone,!0);break;case"bbbb":r=le(te.DayPeriods,e.TranslationWidth.Wide,e.FormStyle.Standalone,!0);break;case"bbbbb":r=le(te.DayPeriods,e.TranslationWidth.Narrow,e.FormStyle.Standalone,!0);break;case"B":case"BB":case"BBB":r=le(te.DayPeriods,e.TranslationWidth.Abbreviated,e.FormStyle.Format,!0);break;case"BBBB":r=le(te.DayPeriods,e.TranslationWidth.Wide,e.FormStyle.Format,!0);break;case"BBBBB":r=le(te.DayPeriods,e.TranslationWidth.Narrow,e.FormStyle.Format,!0);break;case"h":r=ce(ee.Hours,1,-12);break;case"hh":r=ce(ee.Hours,2,-12);break;case"H":r=ce(ee.Hours,1);break;case"HH":r=ce(ee.Hours,2);break;case"m":r=ce(ee.Minutes,1);break;case"mm":r=ce(ee.Minutes,2);break;case"s":r=ce(ee.Seconds,1);break;case"ss":r=ce(ee.Seconds,2);break;case"S":r=ce(ee.FractionalSeconds,1);break;case"SS":r=ce(ee.FractionalSeconds,2);break;case"SSS":r=ce(ee.FractionalSeconds,3);break;case"Z":case"ZZ":case"ZZZ":r=fe(q.Short);break;case"ZZZZZ":r=fe(q.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":r=fe(q.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":r=fe(q.Long);break;default:return null}return de[t]=r,r}(t);D+=r?r(o,n,f):"''"===t?"'":t.replace(/(^'|'$)/g,"").replace(/''/g,"'")})),D}function ie(e,t,r){var n=new Date(0);return n.setFullYear(e,t,r),n.setHours(0,0,0),n}function ae(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,(function(e,r){return null!=t&&r in t?t[r]:e}))),e}function se(e,t,r,n,u){void 0===r&&(r="-");var o="";(e<0||u&&e<=0)&&(u?e=1-e:(e=-e,o=r));for(var i=String(e);i.length<t;)i="0"+i;return n&&(i=i.substr(i.length-t)),o+i}function ce(t,r,n,u,o){return void 0===n&&(n=0),void 0===u&&(u=!1),void 0===o&&(o=!1),function(i,a){var s=function c(e,t){switch(e){case ee.FullYear:return t.getFullYear();case ee.Month:return t.getMonth();case ee.Date:return t.getDate();case ee.Hours:return t.getHours();case ee.Minutes:return t.getMinutes();case ee.Seconds:return t.getSeconds();case ee.FractionalSeconds:return t.getMilliseconds();case ee.Day:return t.getDay();default:throw new Error('Unknown DateType value "'+e+'".')}}(t,i);if((n>0||s>-n)&&(s+=n),t===ee.Hours)0===s&&-12===n&&(s=12);else if(t===ee.FractionalSeconds)return function l(e,t){return se(e,3).substr(0,t)}(s,r);var f=U(a,e.NumberSymbol.MinusSign);return se(s,r,f,u,o)}}function le(t,r,n,u){return void 0===n&&(n=e.FormStyle.Format),void 0===u&&(u=!1),function(e,o){return function i(e,t,r,n,u,o){switch(r){case te.Months:return M(t,u,n)[e.getMonth()];case te.Days:return N(t,u,n)[e.getDay()];case te.DayPeriods:var i=e.getHours(),a=e.getMinutes();if(o){var c=z(t),l=Z(t,u,n),f=c.findIndex((function(e){if(Array.isArray(e)){var t=s(e,2),r=t[0],n=t[1],u=i>=r.hours&&a>=r.minutes,o=i<n.hours||i===n.hours&&a<n.minutes;if(r.hours<n.hours){if(u&&o)return!0}else if(u||o)return!0}else if(e.hours===i&&e.minutes===a)return!0;return!1}));if(-1!==f)return l[f]}return x(t,u,n)[i<12?0:1];case te.Eras:return V(t,n)[e.getFullYear()<=0?0:1];default:throw new Error("unexpected translation type "+r)}}(e,o,t,r,n,u)}}function fe(t){return function(r,n,u){var o=-1*u,i=U(n,e.NumberSymbol.MinusSign),a=o>0?Math.floor(o/60):Math.ceil(o/60);switch(t){case q.Short:return(o>=0?"+":"")+se(a,2,i)+se(Math.abs(o%60),2,i);case q.ShortGMT:return"GMT"+(o>=0?"+":"")+se(a,1,i);case q.Long:return"GMT"+(o>=0?"+":"")+se(a,2,i)+":"+se(Math.abs(o%60),2,i);case q.Extended:return 0===u?"Z":(o>=0?"+":"")+se(a,2,i)+":"+se(Math.abs(o%60),2,i);default:throw new Error('Unknown zone width "'+t+'"')}}}function pe(e){return ie(e.getFullYear(),e.getMonth(),e.getDate()+(4-e.getDay()))}function De(t,r){return void 0===r&&(r=!1),function(n,u){var o;if(r){var i=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,a=n.getDate();o=1+Math.floor((a+i)/7)}else{var s=pe(n),c=function l(e){var t=ie(e,0,1).getDay();return ie(e,0,1+(t<=4?4:11)-t)}(s.getFullYear()),f=s.getTime()-c.getTime();o=1+Math.round(f/6048e5)}return se(o,t,U(u,e.NumberSymbol.MinusSign))}}function he(t,r){return void 0===r&&(r=!1),function(n,u){return se(pe(n).getFullYear(),t,U(u,e.NumberSymbol.MinusSign),r)}}!function(e){e[e.Short=0]="Short",e[e.ShortGMT=1]="ShortGMT",e[e.Long=2]="Long",e[e.Extended=3]="Extended"}(q||(q={})),function(e){e[e.FullYear=0]="FullYear",e[e.Month=1]="Month",e[e.Date=2]="Date",e[e.Hours=3]="Hours",e[e.Minutes=4]="Minutes",e[e.Seconds=5]="Seconds",e[e.FractionalSeconds=6]="FractionalSeconds",e[e.Day=7]="Day"}(ee||(ee={})),function(e){e[e.DayPeriods=0]="DayPeriods",e[e.Days=1]="Days",e[e.Months=2]="Months",e[e.Eras=3]="Eras"}(te||(te={}));var de={};function ye(e,t){e=e.replace(/:/g,"");var r=Date.parse("Jan 01, 1970 00:00:00 "+e)/6e4;return isNaN(r)?t:r}function ge(e){return e instanceof Date&&!isNaN(e.valueOf())}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var me,Ce=/^(\d+)?\.((\d+)(-(\d+))?)?$/;function Fe(t,r,n,u,o,i,a){void 0===a&&(a=!1);var s="",c=!1;if(isFinite(t)){var l=function f(e){var t,r,n,u,o,i=Math.abs(e)+"",a=0;for((r=i.indexOf("."))>-1&&(i=i.replace(".","")),(n=i.search(/e/i))>0?(r<0&&(r=n),r+=+i.slice(n+1),i=i.substring(0,n)):r<0&&(r=i.length),n=0;"0"===i.charAt(n);n++);if(n===(o=i.length))t=[0],r=1;else{for(o--;"0"===i.charAt(o);)o--;for(r-=n,t=[],u=0;n<=o;n++,u++)t[u]=Number(i.charAt(n))}return r>22&&(t=t.splice(0,21),a=r-1,r=1),{digits:t,exponent:a,integerLen:r}}(t);a&&(l=function p(e){if(0===e.digits[0])return e;var t=e.digits.length-e.integerLen;return e.exponent?e.exponent+=2:(0===t?e.digits.push(0,0):1===t&&e.digits.push(0),e.integerLen+=2),e}(l));var D=r.minInt,h=r.minFrac,d=r.maxFrac;if(i){var y=i.match(Ce);if(null===y)throw new Error(i+" is not a valid digit info");var g=y[1],m=y[3],C=y[5];null!=g&&(D=Ae(g)),null!=m&&(h=Ae(m)),null!=C?d=Ae(C):null!=m&&h>d&&(d=h)}!function F(e,t,r){if(t>r)throw new Error("The minimum number of digits after fraction ("+t+") is higher than the maximum ("+r+").");var n=e.digits,u=n.length-e.integerLen,o=Math.min(Math.max(t,u),r),i=o+e.integerLen,a=n[i];if(i>0){n.splice(Math.max(e.integerLen,i));for(var s=i;s<n.length;s++)n[s]=0}else{u=Math.max(0,u),e.integerLen=1,n.length=Math.max(1,i=o+1),n[0]=0;for(var c=1;c<i;c++)n[c]=0}if(a>=5)if(i-1<0){for(var l=0;l>i;l--)n.unshift(0),e.integerLen++;n.unshift(1),e.integerLen++}else n[i-1]++;for(;u<Math.max(0,o);u++)n.push(0);var f=0!==o,p=t+e.integerLen,D=n.reduceRight((function(e,t,r,n){return n[r]=(t+=e)<10?t:t-10,f&&(0===n[r]&&r>=p?n.pop():f=!1),t>=10?1:0}),0);D&&(n.unshift(D),e.integerLen++)}(l,h,d);var v=l.digits,E=l.integerLen,b=l.exponent,_=[];for(c=v.every((function(e){return!e}));E<D;E++)v.unshift(0);for(;E<0;E++)v.unshift(0);E>0?_=v.splice(E,v.length):(_=v,v=[0]);var A=[];for(v.length>=r.lgSize&&A.unshift(v.splice(-r.lgSize,v.length).join(""));v.length>r.gSize;)A.unshift(v.splice(-r.gSize,v.length).join(""));v.length&&A.unshift(v.join("")),s=A.join(U(n,u)),_.length&&(s+=U(n,o)+_.join("")),b&&(s+=U(n,e.NumberSymbol.Exponential)+"+"+b)}else s=U(n,e.NumberSymbol.Infinity);return t<0&&!c?r.negPre+s+r.negSuf:r.posPre+s+r.posSuf}function ve(t,r,n,u,o){var i=_e($(r,e.NumberFormatStyle.Currency),U(r,e.NumberSymbol.MinusSign));return i.minFrac=Q(u),i.maxFrac=i.minFrac,Fe(t,i,r,e.NumberSymbol.CurrencyGroup,e.NumberSymbol.CurrencyDecimal,o).replace("¤",n).replace("¤","").trim()}function Ee(t,r,n){return Fe(t,_e($(r,e.NumberFormatStyle.Percent),U(r,e.NumberSymbol.MinusSign)),r,e.NumberSymbol.Group,e.NumberSymbol.Decimal,n,!0).replace(new RegExp("%","g"),U(r,e.NumberSymbol.PercentSign))}function be(t,r,n){return Fe(t,_e($(r,e.NumberFormatStyle.Decimal),U(r,e.NumberSymbol.MinusSign)),r,e.NumberSymbol.Group,e.NumberSymbol.Decimal,n)}function _e(e,t){void 0===t&&(t="-");var r={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},n=e.split(";"),u=n[0],o=n[1],i=-1!==u.indexOf(".")?u.split("."):[u.substring(0,u.lastIndexOf("0")+1),u.substring(u.lastIndexOf("0")+1)],a=i[0],s=i[1]||"";r.posPre=a.substr(0,a.indexOf("#"));for(var c=0;c<s.length;c++){var l=s.charAt(c);"0"===l?r.minFrac=r.maxFrac=c+1:"#"===l?r.maxFrac=c+1:r.posSuf+=l}var f=a.split(",");if(r.gSize=f[1]?f[1].length:0,r.lgSize=f[2]||f[1]?(f[2]||f[1]).length:0,o){var p=u.length-r.posPre.length-r.posSuf.length,D=o.indexOf("#");r.negPre=o.substr(0,D).replace(/'/g,""),r.negSuf=o.substr(D+p).replace(/'/g,"")}else r.negPre=t+r.posPre,r.negSuf=r.posSuf;return r}function Ae(e){var t=parseInt(e);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+e);return t}function Se(e,t,r,n){var u="="+e;if(t.indexOf(u)>-1)return u;if(u=r.getPluralCategory(e,n),t.indexOf(u)>-1)return u;if(t.indexOf("other")>-1)return"other";throw new Error('No plural message found for value "'+e+'"')}var we=function(t){function r(e){var r=t.call(this)||this;return r.locale=e,r}return i(r,t),r.prototype.getPluralCategory=function(t,r){switch(G(r||this.locale)(t)){case e.Plural.Zero:return"zero";case e.Plural.One:return"one";case e.Plural.Two:return"two";case e.Plural.Few:return"few";case e.Plural.Many:return"many";default:return"other"}},r}(me=function me(){});we.decorators=[{type:t.Injectable}],we.ctorParameters=function(){return[{type:String,decorators:[{type:t.Inject,args:[t.LOCALE_ID]}]}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Be=function(){function e(e,t,r,n){this._iterableDiffers=e,this._keyValueDiffers=t,this._ngEl=r,this._renderer=n,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}return Object.defineProperty(e.prototype,"klass",{set:function(e){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof e?e.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"ngClass",{set:function(e){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof e?e.split(/\s+/):e,this._rawClass&&(t.ɵisListLikeIterable(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())},enumerable:!1,configurable:!0}),e.prototype.ngDoCheck=function(){if(this._iterableDiffer){var e=this._iterableDiffer.diff(this._rawClass);e&&this._applyIterableChanges(e)}else if(this._keyValueDiffer){var t=this._keyValueDiffer.diff(this._rawClass);t&&this._applyKeyValueChanges(t)}},e.prototype._applyKeyValueChanges=function(e){var t=this;e.forEachAddedItem((function(e){return t._toggleClass(e.key,e.currentValue)})),e.forEachChangedItem((function(e){return t._toggleClass(e.key,e.currentValue)})),e.forEachRemovedItem((function(e){e.previousValue&&t._toggleClass(e.key,!1)}))},e.prototype._applyIterableChanges=function(e){var r=this;e.forEachAddedItem((function(e){if("string"!=typeof e.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got "+t.ɵstringify(e.item));r._toggleClass(e.item,!0)})),e.forEachRemovedItem((function(e){return r._toggleClass(e.item,!1)}))},e.prototype._applyClasses=function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach((function(e){return t._toggleClass(e,!0)})):Object.keys(e).forEach((function(r){return t._toggleClass(r,!!e[r])})))},e.prototype._removeClasses=function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach((function(e){return t._toggleClass(e,!1)})):Object.keys(e).forEach((function(e){return t._toggleClass(e,!1)})))},e.prototype._toggleClass=function(e,t){var r=this;(e=e.trim())&&e.split(/\s+/g).forEach((function(e){t?r._renderer.addClass(r._ngEl.nativeElement,e):r._renderer.removeClass(r._ngEl.nativeElement,e)}))},e}();Be.decorators=[{type:t.Directive,args:[{selector:"[ngClass]"}]}],Be.ctorParameters=function(){return[{type:t.IterableDiffers},{type:t.KeyValueDiffers},{type:t.ElementRef},{type:t.Renderer2}]},Be.propDecorators={klass:[{type:t.Input,args:["class"]}],ngClass:[{type:t.Input,args:["ngClass"]}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Le=function(){function e(e){this._viewContainerRef=e,this._componentRef=null,this._moduleRef=null}return e.prototype.ngOnChanges=function(e){if(this._viewContainerRef.clear(),this._componentRef=null,this.ngComponentOutlet){var r=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;if(e.ngComponentOutletNgModuleFactory)if(this._moduleRef&&this._moduleRef.destroy(),this.ngComponentOutletNgModuleFactory){var n=r.get(t.NgModuleRef);this._moduleRef=this.ngComponentOutletNgModuleFactory.create(n.injector)}else this._moduleRef=null;var u=(this._moduleRef?this._moduleRef.componentFactoryResolver:r.get(t.ComponentFactoryResolver)).resolveComponentFactory(this.ngComponentOutlet);this._componentRef=this._viewContainerRef.createComponent(u,this._viewContainerRef.length,r,this.ngComponentOutletContent)}},e.prototype.ngOnDestroy=function(){this._moduleRef&&this._moduleRef.destroy()},e}();Le.decorators=[{type:t.Directive,args:[{selector:"[ngComponentOutlet]"}]}],Le.ctorParameters=function(){return[{type:t.ViewContainerRef}]},Le.propDecorators={ngComponentOutlet:[{type:t.Input}],ngComponentOutletInjector:[{type:t.Input}],ngComponentOutletContent:[{type:t.Input}],ngComponentOutletNgModuleFactory:[{type:t.Input}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Pe=function(){function e(e,t,r,n){this.$implicit=e,this.ngForOf=t,this.index=r,this.count=n}return Object.defineProperty(e.prototype,"first",{get:function(){return 0===this.index},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"last",{get:function(){return this.index===this.count-1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"even",{get:function(){return this.index%2==0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"odd",{get:function(){return!this.even},enumerable:!1,configurable:!0}),e}(),Oe=function(){function e(e,t,r){this._viewContainer=e,this._template=t,this._differs=r,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}return Object.defineProperty(e.prototype,"ngForOf",{set:function(e){this._ngForOf=e,this._ngForOfDirty=!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"ngForTrackBy",{get:function(){return this._trackByFn},set:function(e){this._trackByFn=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"ngForTemplate",{set:function(e){e&&(this._template=e)},enumerable:!1,configurable:!0}),e.prototype.ngDoCheck=function(){if(this._ngForOfDirty){this._ngForOfDirty=!1;var e=this._ngForOf;if(!this._differ&&e)try{this._differ=this._differs.find(e).create(this.ngForTrackBy)}catch(t){throw new Error("Cannot find a differ supporting object '"+e+"' of type '"+function t(e){return e.name||typeof e}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */(e)+"'. NgFor only supports binding to Iterables such as Arrays.")}}if(this._differ){var r=this._differ.diff(this._ngForOf);r&&this._applyChanges(r)}},e.prototype._applyChanges=function(e){var t=this,r=[];e.forEachOperation((function(e,n,u){if(null==e.previousIndex){var o=t._viewContainer.createEmbeddedView(t._template,new Pe(null,t._ngForOf,-1,-1),null===u?void 0:u),i=new Ie(e,o);r.push(i)}else null==u?t._viewContainer.remove(null===n?void 0:n):null!==n&&(o=t._viewContainer.get(n),t._viewContainer.move(o,u),i=new Ie(e,o),r.push(i))}));for(var n=0;n<r.length;n++)this._perViewChange(r[n].view,r[n].record);n=0;for(var u=this._viewContainer.length;n<u;n++){var o=this._viewContainer.get(n);o.context.index=n,o.context.count=u,o.context.ngForOf=this._ngForOf}e.forEachIdentityChange((function(e){t._viewContainer.get(e.currentIndex).context.$implicit=e.item}))},e.prototype._perViewChange=function(e,t){e.context.$implicit=t.item},e.ngTemplateContextGuard=function(e,t){return!0},e}();Oe.decorators=[{type:t.Directive,args:[{selector:"[ngFor][ngForOf]"}]}],Oe.ctorParameters=function(){return[{type:t.ViewContainerRef},{type:t.TemplateRef},{type:t.IterableDiffers}]},Oe.propDecorators={ngForOf:[{type:t.Input}],ngForTrackBy:[{type:t.Input}],ngForTemplate:[{type:t.Input}]};var Ie=function Ie(e,t){this.record=e,this.view=t},ke=function(){function e(e,t){this._viewContainer=e,this._context=new Re,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=t}return Object.defineProperty(e.prototype,"ngIf",{set:function(e){this._context.$implicit=this._context.ngIf=e,this._updateView()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"ngIfThen",{set:function(e){Te("ngIfThen",e),this._thenTemplateRef=e,this._thenViewRef=null,this._updateView()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"ngIfElse",{set:function(e){Te("ngIfElse",e),this._elseTemplateRef=e,this._elseViewRef=null,this._updateView()},enumerable:!1,configurable:!0}),e.prototype._updateView=function(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))},e.ngTemplateContextGuard=function(e,t){return!0},e}();ke.decorators=[{type:t.Directive,args:[{selector:"[ngIf]"}]}],ke.ctorParameters=function(){return[{type:t.ViewContainerRef},{type:t.TemplateRef}]},ke.propDecorators={ngIf:[{type:t.Input}],ngIfThen:[{type:t.Input}],ngIfElse:[{type:t.Input}]};var Re=function Re(){this.$implicit=null,this.ngIf=null};function Te(e,r){if(r&&!r.createEmbeddedView)throw new Error(e+" must be a TemplateRef, but received '"+t.ɵstringify(r)+"'.")}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var xe=function(){function e(e,t){this._viewContainerRef=e,this._templateRef=t,this._created=!1}return e.prototype.create=function(){this._created=!0,this._viewContainerRef.createEmbeddedView(this._templateRef)},e.prototype.destroy=function(){this._created=!1,this._viewContainerRef.clear()},e.prototype.enforceState=function(e){e&&!this._created?this.create():!e&&this._created&&this.destroy()},e}(),Ne=function(){function e(){this._defaultUsed=!1,this._caseCount=0,this._lastCaseCheckIndex=0,this._lastCasesMatched=!1}return Object.defineProperty(e.prototype,"ngSwitch",{set:function(e){this._ngSwitch=e,0===this._caseCount&&this._updateDefaultCases(!0)},enumerable:!1,configurable:!0}),e.prototype._addCase=function(){return this._caseCount++},e.prototype._addDefault=function(e){this._defaultViews||(this._defaultViews=[]),this._defaultViews.push(e)},e.prototype._matchCase=function(e){var t=e==this._ngSwitch;return this._lastCasesMatched=this._lastCasesMatched||t,this._lastCaseCheckIndex++,this._lastCaseCheckIndex===this._caseCount&&(this._updateDefaultCases(!this._lastCasesMatched),this._lastCaseCheckIndex=0,this._lastCasesMatched=!1),t},e.prototype._updateDefaultCases=function(e){if(this._defaultViews&&e!==this._defaultUsed){this._defaultUsed=e;for(var t=0;t<this._defaultViews.length;t++)this._defaultViews[t].enforceState(e)}},e}();Ne.decorators=[{type:t.Directive,args:[{selector:"[ngSwitch]"}]}],Ne.propDecorators={ngSwitch:[{type:t.Input}]};var Me,Ve=function(){function e(e,t,r){this.ngSwitch=r,r._addCase(),this._view=new xe(e,t)}return e.prototype.ngDoCheck=function(){this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase))},e}();Ve.decorators=[{type:t.Directive,args:[{selector:"[ngSwitchCase]"}]}],Ve.ctorParameters=function(){return[{type:t.ViewContainerRef},{type:t.TemplateRef},{type:Ne,decorators:[{type:t.Optional},{type:t.Host}]}]},Ve.propDecorators={ngSwitchCase:[{type:t.Input}]},(Me=function Me(e,t,r){r._addDefault(new xe(e,t))}).decorators=[{type:t.Directive,args:[{selector:"[ngSwitchDefault]"}]}],Me.ctorParameters=function(){return[{type:t.ViewContainerRef},{type:t.TemplateRef},{type:Ne,decorators:[{type:t.Optional},{type:t.Host}]}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var je,We=function(){function e(e){this._localization=e,this._caseViews={}}return Object.defineProperty(e.prototype,"ngPlural",{set:function(e){this._switchValue=e,this._updateView()},enumerable:!1,configurable:!0}),e.prototype.addCase=function(e,t){this._caseViews[e]=t},e.prototype._updateView=function(){this._clearViews();var e=Object.keys(this._caseViews),t=Se(this._switchValue,e,this._localization);this._activateView(this._caseViews[t])},e.prototype._clearViews=function(){this._activeView&&this._activeView.destroy()},e.prototype._activateView=function(e){e&&(this._activeView=e,this._activeView.create())},e}();We.decorators=[{type:t.Directive,args:[{selector:"[ngPlural]"}]}],We.ctorParameters=function(){return[{type:me}]},We.propDecorators={ngPlural:[{type:t.Input}]},(je=function je(e,t,r,n){this.value=e;var u=!isNaN(Number(e));n.addCase(u?"="+e:e,new xe(r,t))}).decorators=[{type:t.Directive,args:[{selector:"[ngPluralCase]"}]}],je.ctorParameters=function(){return[{type:String,decorators:[{type:t.Attribute,args:["ngPluralCase"]}]},{type:t.TemplateRef},{type:t.ViewContainerRef},{type:We,decorators:[{type:t.Host}]}]};var He=function(){function e(e,t,r){this._ngEl=e,this._differs=t,this._renderer=r,this._ngStyle=null,this._differ=null}return Object.defineProperty(e.prototype,"ngStyle",{set:function(e){this._ngStyle=e,!this._differ&&e&&(this._differ=this._differs.find(e).create())},enumerable:!1,configurable:!0}),e.prototype.ngDoCheck=function(){if(this._differ){var e=this._differ.diff(this._ngStyle);e&&this._applyChanges(e)}},e.prototype._setStyle=function(e,t){var r=s(e.split("."),2),n=r[0],u=r[1];null!=(t=null!=t&&u?""+t+u:t)?this._renderer.setStyle(this._ngEl.nativeElement,n,t):this._renderer.removeStyle(this._ngEl.nativeElement,n)},e.prototype._applyChanges=function(e){var t=this;e.forEachRemovedItem((function(e){return t._setStyle(e.key,null)})),e.forEachAddedItem((function(e){return t._setStyle(e.key,e.currentValue)})),e.forEachChangedItem((function(e){return t._setStyle(e.key,e.currentValue)}))},e}();He.decorators=[{type:t.Directive,args:[{selector:"[ngStyle]"}]}],He.ctorParameters=function(){return[{type:t.ElementRef},{type:t.KeyValueDiffers},{type:t.Renderer2}]},He.propDecorators={ngStyle:[{type:t.Input,args:["ngStyle"]}]};var Ue=function(){function e(e){this._viewContainerRef=e,this._viewRef=null,this.ngTemplateOutletContext=null,this.ngTemplateOutlet=null}return e.prototype.ngOnChanges=function(e){if(this._shouldRecreateView(e)){var t=this._viewContainerRef;this._viewRef&&t.remove(t.indexOf(this._viewRef)),this._viewRef=this.ngTemplateOutlet?t.createEmbeddedView(this.ngTemplateOutlet,this.ngTemplateOutletContext):null}else this._viewRef&&this.ngTemplateOutletContext&&this._updateExistingContext(this.ngTemplateOutletContext)},e.prototype._shouldRecreateView=function(e){var t=e.ngTemplateOutletContext;return!!e.ngTemplateOutlet||t&&this._hasContextShapeChanged(t)},e.prototype._hasContextShapeChanged=function(e){var t,r,n=Object.keys(e.previousValue||{}),u=Object.keys(e.currentValue||{});if(n.length===u.length){try{for(var o=a(u),i=o.next();!i.done;i=o.next())if(-1===n.indexOf(i.value))return!0}catch(e){t={error:e}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return!1}return!0},e.prototype._updateExistingContext=function(e){var t,r;try{for(var n=a(Object.keys(e)),u=n.next();!u.done;u=n.next()){var o=u.value;this._viewRef.context[o]=this.ngTemplateOutletContext[o]}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e}();Ue.decorators=[{type:t.Directive,args:[{selector:"[ngTemplateOutlet]"}]}],Ue.ctorParameters=function(){return[{type:t.ViewContainerRef}]},Ue.propDecorators={ngTemplateOutletContext:[{type:t.Input}],ngTemplateOutlet:[{type:t.Input}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var $e=[Be,Le,Oe,ke,Ue,He,Ne,Ve,Me,We,je];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */function Ge(e,r){return Error("InvalidPipeArgument: '"+r+"' for pipe '"+t.ɵstringify(e)+"'")}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */var Ye=function(){function e(){}return e.prototype.createSubscription=function(e,t){return e.subscribe({next:t,error:function(e){throw e}})},e.prototype.dispose=function(e){e.unsubscribe()},e.prototype.onDestroy=function(e){e.unsubscribe()},e}(),ze=new(function(){function e(){}return e.prototype.createSubscription=function(e,t){return e.then(t,(function(e){throw e}))},e.prototype.dispose=function(e){},e.prototype.onDestroy=function(e){},e}()),Ze=new Ye,Ke=function(){function e(e){this._ref=e,this._latestValue=null,this._subscription=null,this._obj=null,this._strategy=null}return e.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},e.prototype.transform=function(e){return this._obj?e!==this._obj?(this._dispose(),this.transform(e)):this._latestValue:(e&&this._subscribe(e),this._latestValue)},e.prototype._subscribe=function(e){var t=this;this._obj=e,this._strategy=this._selectStrategy(e),this._subscription=this._strategy.createSubscription(e,(function(r){return t._updateLatestValue(e,r)}))},e.prototype._selectStrategy=function(r){if(t.ɵisPromise(r))return ze;if(t.ɵisSubscribable(r))return Ze;throw Ge(e,r)},e.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null},e.prototype._updateLatestValue=function(e,t){e===this._obj&&(this._latestValue=t,this._ref.markForCheck())},e}();Ke.decorators=[{type:t.Pipe,args:[{name:"async",pure:!1}]}],Ke.ctorParameters=function(){return[{type:t.ChangeDetectorRef}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Xe=function(){function e(){}return e.prototype.transform=function(t){if(null==t)return null;if("string"!=typeof t)throw Ge(e,t);return t.toLowerCase()},e}();Xe.decorators=[{type:t.Pipe,args:[{name:"lowercase"}]}];var Je=/(?:[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,Qe=function(){function e(){}return e.prototype.transform=function(t){if(null==t)return null;if("string"!=typeof t)throw Ge(e,t);return t.replace(Je,(function(e){return e[0].toUpperCase()+e.substr(1).toLowerCase()}))},e}();Qe.decorators=[{type:t.Pipe,args:[{name:"titlecase"}]}];var qe=function(){function e(){}return e.prototype.transform=function(t){if(null==t)return null;if("string"!=typeof t)throw Ge(e,t);return t.toUpperCase()},e}();qe.decorators=[{type:t.Pipe,args:[{name:"uppercase"}]}];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var et=function(){function e(e){this.locale=e}return e.prototype.transform=function(t,r,n,u){if(void 0===r&&(r="mediumDate"),null==t||""===t||t!=t)return null;try{return oe(t,r,u||this.locale,n)}catch(t){throw Ge(e,t.message)}},e}();et.decorators=[{type:t.Pipe,args:[{name:"date",pure:!0}]}],et.ctorParameters=function(){return[{type:String,decorators:[{type:t.Inject,args:[t.LOCALE_ID]}]}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var tt=/#/g,rt=function(){function e(e){this._localization=e}return e.prototype.transform=function(t,r,n){if(null==t)return"";if("object"!=typeof r||null===r)throw Ge(e,r);return r[Se(t,Object.keys(r),this._localization,n)].replace(tt,t.toString())},e}();rt.decorators=[{type:t.Pipe,args:[{name:"i18nPlural",pure:!0}]}],rt.ctorParameters=function(){return[{type:me}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var nt=function(){function e(){}return e.prototype.transform=function(t,r){if(null==t)return"";if("object"!=typeof r||"string"!=typeof t)throw Ge(e,r);return r.hasOwnProperty(t)?r[t]:r.hasOwnProperty("other")?r.other:""},e}();nt.decorators=[{type:t.Pipe,args:[{name:"i18nSelect",pure:!0}]}];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var ut=function(){function e(){}return e.prototype.transform=function(e){return JSON.stringify(e,null,2)},e}();ut.decorators=[{type:t.Pipe,args:[{name:"json",pure:!1}]}];var ot=function(){function e(e){this.differs=e,this.keyValues=[]}return e.prototype.transform=function(e,t){var r=this;if(void 0===t&&(t=it),!e||!(e instanceof Map)&&"object"!=typeof e)return null;this.differ||(this.differ=this.differs.find(e).create());var n=this.differ.diff(e);return n&&(this.keyValues=[],n.forEachItem((function(e){r.keyValues.push(
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function t(e,r){return{key:e,value:r}}(e.key,e.currentValue))})),this.keyValues.sort(t)),this.keyValues},e}();function it(e,t){var r=e.key,n=t.key;if(r===n)return 0;if(void 0===r)return 1;if(void 0===n)return-1;if(null===r)return 1;if(null===n)return-1;if("string"==typeof r&&"string"==typeof n)return r<n?-1:1;if("number"==typeof r&&"number"==typeof n)return r-n;if("boolean"==typeof r&&"boolean"==typeof n)return r<n?-1:1;var u=String(r),o=String(n);return u==o?0:u<o?-1:1}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */ot.decorators=[{type:t.Pipe,args:[{name:"keyvalue",pure:!1}]}],ot.ctorParameters=function(){return[{type:t.KeyValueDiffers}]};var at=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,r,n){if(!lt(t))return null;n=n||this._locale;try{return be(ft(t),n,r)}catch(t){throw Ge(e,t.message)}},e}();at.decorators=[{type:t.Pipe,args:[{name:"number"}]}],at.ctorParameters=function(){return[{type:String,decorators:[{type:t.Inject,args:[t.LOCALE_ID]}]}]};var st=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,r,n){if(!lt(t))return null;n=n||this._locale;try{return Ee(ft(t),n,r)}catch(t){throw Ge(e,t.message)}},e}();st.decorators=[{type:t.Pipe,args:[{name:"percent"}]}],st.ctorParameters=function(){return[{type:String,decorators:[{type:t.Inject,args:[t.LOCALE_ID]}]}]};var ct=function(){function e(e,t){void 0===t&&(t="USD"),this._locale=e,this._defaultCurrencyCode=t}return e.prototype.transform=function(t,r,n,u,o){if(void 0===n&&(n="symbol"),!lt(t))return null;o=o||this._locale,"boolean"==typeof n&&(n=n?"symbol":"code");var i=r||this._defaultCurrencyCode;"code"!==n&&(i="symbol"===n||"symbol-narrow"===n?J(i,"symbol"===n?"wide":"narrow",o):n);try{return ve(ft(t),o,i,r,u)}catch(t){throw Ge(e,t.message)}},e}();function lt(e){return!(null==e||""===e||e!=e)}function ft(e){if("string"==typeof e&&!isNaN(Number(e)-parseFloat(e)))return Number(e);if("number"!=typeof e)throw new Error(e+" is not a number");return e}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */ct.decorators=[{type:t.Pipe,args:[{name:"currency"}]}],ct.ctorParameters=function(){return[{type:String,decorators:[{type:t.Inject,args:[t.LOCALE_ID]}]},{type:String,decorators:[{type:t.Inject,args:[t.DEFAULT_CURRENCY_CODE]}]}]};var pt=function(){function e(){}return e.prototype.transform=function(t,r,n){if(null==t)return null;if(!this.supports(t))throw Ge(e,t);return t.slice(r,n)},e.prototype.supports=function(e){return"string"==typeof e||Array.isArray(e)},e}();pt.decorators=[{type:t.Pipe,args:[{name:"slice",pure:!1}]}];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var Dt,ht=[Ke,qe,Xe,ut,pt,at,st,Qe,ct,et,rt,nt,ot];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */(Dt=function Dt(){}).decorators=[{type:t.NgModule,args:[{declarations:[$e,ht],exports:[$e,ht],providers:[{provide:me,useClass:we}]}]}];
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var dt,yt=new t.Version("11.2.14");
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */(dt=function dt(){}).ɵprov=t.ɵɵdefineInjectable({token:dt,providedIn:"root",factory:function(){return new gt(t.ɵɵinject(l),window)}});var gt=function(){function e(e,t){this.document=e,this.window=t,this.offset=function(){return[0,0]}}return e.prototype.setOffset=function(e){this.offset=Array.isArray(e)?function(){return e}:e},e.prototype.getScrollPosition=function(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]},e.prototype.scrollToPosition=function(e){this.supportsScrolling()&&this.window.scrollTo(e[0],e[1])},e.prototype.scrollToAnchor=function(e){if(this.supportsScrolling()){var t=function r(e,t){var r=e.getElementById(t)||e.getElementsByName(t)[0];if(r)return r;if("function"==typeof e.createTreeWalker&&e.body&&(e.body.createShadowRoot||e.body.attachShadow))for(var n=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT),u=n.currentNode;u;){var o=u.shadowRoot;if(o){var i=o.getElementById(t)||o.querySelector('[name="'+t+'"]');if(i)return i}u=n.nextNode()}return null}(this.document,e);t&&(this.scrollToElement(t),this.attemptFocus(t))}},e.prototype.setHistoryScrollRestoration=function(e){if(this.supportScrollRestoration()){var t=this.window.history;t&&t.scrollRestoration&&(t.scrollRestoration=e)}},e.prototype.scrollToElement=function(e){var t=e.getBoundingClientRect(),r=t.left+this.window.pageXOffset,n=t.top+this.window.pageYOffset,u=this.offset();this.window.scrollTo(r-u[0],n-u[1])},e.prototype.attemptFocus=function(e){return e.focus(),this.document.activeElement===e},e.prototype.supportScrollRestoration=function(){try{if(!this.supportsScrolling())return!1;var e=mt(this.window.history)||mt(Object.getPrototypeOf(this.window.history));return!(!e||!e.writable&&!e.set)}catch(e){return!1}},e.prototype.supportsScrolling=function(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch(e){return!1}},e}();function mt(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}var Ct=function(){function e(){}return e.prototype.setOffset=function(e){},e.prototype.getScrollPosition=function(){return[0,0]},e.prototype.scrollToPosition=function(e){},e.prototype.scrollToAnchor=function(e){},e.prototype.setHistoryScrollRestoration=function(e){},e}();
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */e.APP_BASE_HREF=v,e.AsyncPipe=Ke,e.CommonModule=Dt,e.CurrencyPipe=ct,e.DOCUMENT=l,e.DatePipe=et,e.DecimalPipe=at,e.HashLocationStrategy=b,e.I18nPluralPipe=rt,e.I18nSelectPipe=nt,e.JsonPipe=ut,e.KeyValuePipe=ot,e.LOCATION_INITIALIZED=D,e.Location=_,e.LocationStrategy=p,e.LowerCasePipe=Xe,e.NgClass=Be,e.NgComponentOutlet=Le,e.NgForOf=Oe,e.NgForOfContext=Pe,e.NgIf=ke,e.NgIfContext=Re,e.NgLocaleLocalization=we,e.NgLocalization=me,e.NgPlural=We,e.NgPluralCase=je,e.NgStyle=He,e.NgSwitch=Ne,e.NgSwitchCase=Ve,e.NgSwitchDefault=Me,e.NgTemplateOutlet=Ue,e.PathLocationStrategy=E,e.PercentPipe=st,e.PlatformLocation=c,e.SlicePipe=pt,e.TitleCasePipe=Qe,e.UpperCasePipe=qe,e.VERSION=yt,e.ViewportScroller=dt,e.formatCurrency=ve,e.formatDate=oe,e.formatNumber=be,e.formatPercent=Ee,e.getCurrencySymbol=J,e.getLocaleCurrencyCode=function Ft(e){return t.ɵgetLocaleCurrencyCode(e)},e.getLocaleCurrencyName=function vt(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.CurrencyName]||null},e.getLocaleCurrencySymbol=function Et(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.CurrencySymbol]||null},e.getLocaleDateFormat=j,e.getLocaleDateTimeFormat=H,e.getLocaleDayNames=N,e.getLocaleDayPeriods=x,e.getLocaleDirection=function bt(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.Directionality]},e.getLocaleEraNames=V,e.getLocaleExtraDayPeriodRules=z,e.getLocaleExtraDayPeriods=Z,e.getLocaleFirstDayOfWeek=function _t(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.FirstDayOfWeek]},e.getLocaleId=T,e.getLocaleMonthNames=M,e.getLocaleNumberFormat=$,e.getLocaleNumberSymbol=U,e.getLocalePluralCase=G,e.getLocaleTimeFormat=W,e.getLocaleWeekEndRange=function At(e){return t.ɵfindLocaleData(e)[t.ɵLocaleDataIndex.WeekendRange]},e.getNumberOfCurrencyDigits=Q,e.isPlatformBrowser=function St(e){return"browser"===e},e.isPlatformServer=function wt(e){return"server"===e},e.isPlatformWorkerApp=function Bt(e){return"browserWorkerApp"===e},e.isPlatformWorkerUi=function Lt(e){return"browserWorkerUi"===e},e.registerLocaleData=
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
function Pt(e,r,n){return t.ɵregisterLocaleData(e,r,n)}
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */,e.ɵBrowserPlatformLocation=h,e.ɵDomAdapter=u,e.ɵNullViewportScroller=Ct,e.ɵPLATFORM_BROWSER_ID="browser",e.ɵPLATFORM_SERVER_ID="server",e.ɵPLATFORM_WORKER_APP_ID="browserWorkerApp",e.ɵPLATFORM_WORKER_UI_ID="browserWorkerUi",e.ɵangular_packages_common_common_a=f,e.ɵangular_packages_common_common_b=y,e.ɵangular_packages_common_common_c=A,e.ɵangular_packages_common_common_d=F,e.ɵangular_packages_common_common_e=$e,e.ɵangular_packages_common_common_f=ht,e.ɵgetDOM=n,e.ɵparseCookieValue=function Ot(e,t){var r,n;t=encodeURIComponent(t);try{for(var u=a(e.split(";")),o=u.next();!o.done;o=u.next()){var i=o.value,c=i.indexOf("="),l=s(-1==c?[i,""]:[i.slice(0,c),i.slice(c+1)],2),f=l[1];if(l[0].trim()===t)return decodeURIComponent(f)}}catch(e){r={error:e}}finally{try{o&&!o.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}return null},e.ɵsetRootDomAdapter=function It(e){r||(r=e)},Object.defineProperty(e,"__esModule",{value:!0})}));