/**
 * @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):"function"==typeof define&&define.amd?define("@angular/compiler",["exports"],t):t(((e=e||self).ng=e.ng||{},e.ng.compiler={}))}(this,(function(e){"use strict";
/*! *****************************************************************************
    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.
    ***************************************************************************** */var t,n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function i(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function o(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function s(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(o(arguments[t]));return e}function a(e){if(":"!=e[0])return[null,e];var t=e.indexOf(":",1);if(-1==t)throw new Error('Unsupported format "'+e+'" expecting ":namespace:name"');return[e.slice(1,t),e.slice(t+1)]}function u(e){return"ng-container"===a(e)[1]}function p(e){return"ng-content"===a(e)[1]}function l(e){return"ng-template"===a(e)[1]}function c(e){return null===e?null:a(e)[0]}function h(e,t){return e?":"+e+":"+t:t}(
/**
     * @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
     */
t=e.TagContentType||(e.TagContentType={}))[t.RAW_TEXT=0]="RAW_TEXT",t[t.ESCAPABLE_RAW_TEXT=1]="ESCAPABLE_RAW_TEXT",t[t.PARSABLE_DATA=2]="PARSABLE_DATA";var f,d,v={Aacute:"Á",aacute:"á",Acirc:"Â",acirc:"â",acute:"´",AElig:"Æ",aelig:"æ",Agrave:"À",agrave:"à",alefsym:"ℵ",Alpha:"Α",alpha:"α",amp:"&",and:"∧",ang:"∠",apos:"'",Aring:"Å",aring:"å",asymp:"≈",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",bdquo:"„",Beta:"Β",beta:"β",brvbar:"¦",bull:"•",cap:"∩",Ccedil:"Ç",ccedil:"ç",cedil:"¸",cent:"¢",Chi:"Χ",chi:"χ",circ:"ˆ",clubs:"♣",cong:"≅",copy:"©",crarr:"↵",cup:"∪",curren:"¤",dagger:"†",Dagger:"‡",darr:"↓",dArr:"⇓",deg:"°",Delta:"Δ",delta:"δ",diams:"♦",divide:"÷",Eacute:"É",eacute:"é",Ecirc:"Ê",ecirc:"ê",Egrave:"È",egrave:"è",empty:"∅",emsp:" ",ensp:" ",Epsilon:"Ε",epsilon:"ε",equiv:"≡",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",exist:"∃",fnof:"ƒ",forall:"∀",frac12:"½",frac14:"¼",frac34:"¾",frasl:"⁄",Gamma:"Γ",gamma:"γ",ge:"≥",gt:">",harr:"↔",hArr:"⇔",hearts:"♥",hellip:"…",Iacute:"Í",iacute:"í",Icirc:"Î",icirc:"î",iexcl:"¡",Igrave:"Ì",igrave:"ì",image:"ℑ",infin:"∞",int:"∫",Iota:"Ι",iota:"ι",iquest:"¿",isin:"∈",Iuml:"Ï",iuml:"ï",Kappa:"Κ",kappa:"κ",Lambda:"Λ",lambda:"λ",lang:"⟨",laquo:"«",larr:"←",lArr:"⇐",lceil:"⌈",ldquo:"“",le:"≤",lfloor:"⌊",lowast:"∗",loz:"◊",lrm:"‎",lsaquo:"‹",lsquo:"‘",lt:"<",macr:"¯",mdash:"—",micro:"µ",middot:"·",minus:"−",Mu:"Μ",mu:"μ",nabla:"∇",nbsp:" ",ndash:"–",ne:"≠",ni:"∋",not:"¬",notin:"∉",nsub:"⊄",Ntilde:"Ñ",ntilde:"ñ",Nu:"Ν",nu:"ν",Oacute:"Ó",oacute:"ó",Ocirc:"Ô",ocirc:"ô",OElig:"Œ",oelig:"œ",Ograve:"Ò",ograve:"ò",oline:"‾",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",oplus:"⊕",or:"∨",ordf:"ª",ordm:"º",Oslash:"Ø",oslash:"ø",Otilde:"Õ",otilde:"õ",otimes:"⊗",Ouml:"Ö",ouml:"ö",para:"¶",permil:"‰",perp:"⊥",Phi:"Φ",phi:"φ",Pi:"Π",pi:"π",piv:"ϖ",plusmn:"±",pound:"£",prime:"′",Prime:"″",prod:"∏",prop:"∝",Psi:"Ψ",psi:"ψ",quot:'"',radic:"√",rang:"⟩",raquo:"»",rarr:"→",rArr:"⇒",rceil:"⌉",rdquo:"”",real:"ℜ",reg:"®",rfloor:"⌋",Rho:"Ρ",rho:"ρ",rlm:"‏",rsaquo:"›",rsquo:"’",sbquo:"‚",Scaron:"Š",scaron:"š",sdot:"⋅",sect:"§",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sim:"∼",spades:"♠",sub:"⊂",sube:"⊆",sum:"∑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supe:"⊇",szlig:"ß",Tau:"Τ",tau:"τ",there4:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thinsp:" ",THORN:"Þ",thorn:"þ",tilde:"˜",times:"×",trade:"™",Uacute:"Ú",uacute:"ú",uarr:"↑",uArr:"⇑",Ucirc:"Û",ucirc:"û",Ugrave:"Ù",ugrave:"ù",uml:"¨",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",Uuml:"Ü",uuml:"ü",weierp:"℘",Xi:"Ξ",xi:"ξ",Yacute:"Ý",yacute:"ý",yen:"¥",yuml:"ÿ",Yuml:"Ÿ",Zeta:"Ζ",zeta:"ζ",zwj:"‍",zwnj:"‌",ngsp:""},m=function(){function t(t){var n=this,r=void 0===t?{}:t,i=r.closedByChildren,o=r.implicitNamespacePrefix,s=r.contentType,a=void 0===s?e.TagContentType.PARSABLE_DATA:s,u=r.closedByParent,p=void 0!==u&&u,l=r.isVoid,c=void 0!==l&&l,h=r.ignoreFirstLf,f=void 0!==h&&h,d=r.preventNamespaceInheritance,v=void 0!==d&&d;this.closedByChildren={},this.closedByParent=!1,this.canSelfClose=!1,i&&i.length>0&&i.forEach((function(e){return n.closedByChildren[e]=!0})),this.isVoid=c,this.closedByParent=p||c,this.implicitNamespacePrefix=o||null,this.contentType=a,this.ignoreFirstLf=f,this.preventNamespaceInheritance=v}return t.prototype.isClosedByChild=function(e){return this.isVoid||e.toLowerCase()in this.closedByChildren},t.prototype.getContentType=function(e){if("object"==typeof this.contentType){var t=null==e?void 0:this.contentType[e];return null!=t?t:this.contentType.default}return this.contentType},t}();function y(t){var n,r;return d||(f=new m,d={base:new m({isVoid:!0}),meta:new m({isVoid:!0}),area:new m({isVoid:!0}),embed:new m({isVoid:!0}),link:new m({isVoid:!0}),img:new m({isVoid:!0}),input:new m({isVoid:!0}),param:new m({isVoid:!0}),hr:new m({isVoid:!0}),br:new m({isVoid:!0}),source:new m({isVoid:!0}),track:new m({isVoid:!0}),wbr:new m({isVoid:!0}),p:new m({closedByChildren:["address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","ol","p","pre","section","table","ul"],closedByParent:!0}),thead:new m({closedByChildren:["tbody","tfoot"]}),tbody:new m({closedByChildren:["tbody","tfoot"],closedByParent:!0}),tfoot:new m({closedByChildren:["tbody"],closedByParent:!0}),tr:new m({closedByChildren:["tr"],closedByParent:!0}),td:new m({closedByChildren:["td","th"],closedByParent:!0}),th:new m({closedByChildren:["td","th"],closedByParent:!0}),col:new m({isVoid:!0}),svg:new m({implicitNamespacePrefix:"svg"}),foreignObject:new m({implicitNamespacePrefix:"svg",preventNamespaceInheritance:!0}),math:new m({implicitNamespacePrefix:"math"}),li:new m({closedByChildren:["li"],closedByParent:!0}),dt:new m({closedByChildren:["dt","dd"]}),dd:new m({closedByChildren:["dt","dd"],closedByParent:!0}),rb:new m({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rt:new m({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rtc:new m({closedByChildren:["rb","rtc","rp"],closedByParent:!0}),rp:new m({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),optgroup:new m({closedByChildren:["optgroup"],closedByParent:!0}),option:new m({closedByChildren:["option","optgroup"],closedByParent:!0}),pre:new m({ignoreFirstLf:!0}),listing:new m({ignoreFirstLf:!0}),style:new m({contentType:e.TagContentType.RAW_TEXT}),script:new m({contentType:e.TagContentType.RAW_TEXT}),title:new m({contentType:{default:e.TagContentType.ESCAPABLE_RAW_TEXT,svg:e.TagContentType.PARSABLE_DATA}}),textarea:new m({contentType:e.TagContentType.ESCAPABLE_RAW_TEXT,ignoreFirstLf:!0})}),null!==(r=null!==(n=d[t])&&void 0!==n?n:d[t.toLowerCase()])&&void 0!==r?r:f}
/**
     * @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 g,E,_=new RegExp("(\\:not\\()|(([\\.\\#]?)[-\\w]+)|(?:\\[([-.\\w*]+)(?:=([\"']?)([^\\]\"']*)\\5)?\\])|(\\))|(\\s*,\\s*)","g"),S=function(){function e(){this.element=null,this.classNames=[],this.attrs=[],this.notSelectors=[]}return e.parse=function(t){var n,r=[],i=function(e,t){t.notSelectors.length>0&&!t.element&&0==t.classNames.length&&0==t.attrs.length&&(t.element="*"),e.push(t)},o=new e,s=o,a=!1;for(_.lastIndex=0;n=_.exec(t);){if(n[1]){if(a)throw new Error("Nesting :not in a selector is not allowed");a=!0,s=new e,o.notSelectors.push(s)}var u=n[2];if(u){var p=n[3];"#"===p?s.addAttribute("id",u.substr(1)):"."===p?s.addClassName(u.substr(1)):s.setElement(u)}var l=n[4];if(l&&s.addAttribute(l,n[6]),n[7]&&(a=!1,s=o),n[8]){if(a)throw new Error("Multiple selectors in :not are not supported");i(r,o),o=s=new e}}return i(r,o),r},e.prototype.isElementSelector=function(){return this.hasElementSelector()&&0==this.classNames.length&&0==this.attrs.length&&0===this.notSelectors.length},e.prototype.hasElementSelector=function(){return!!this.element},e.prototype.setElement=function(e){void 0===e&&(e=null),this.element=e},e.prototype.getMatchingElementTemplate=function(){for(var e=this.element||"div",t=this.classNames.length>0?' class="'+this.classNames.join(" ")+'"':"",n="",r=0;r<this.attrs.length;r+=2)n+=" "+this.attrs[r]+(""!==this.attrs[r+1]?'="'+this.attrs[r+1]+'"':"");return y(e).isVoid?"<"+e+t+n+"/>":"<"+e+t+n+"></"+e+">"},e.prototype.getAttrs=function(){var e=[];return this.classNames.length>0&&e.push("class",this.classNames.join(" ")),e.concat(this.attrs)},e.prototype.addAttribute=function(e,t){void 0===t&&(t=""),this.attrs.push(e,t&&t.toLowerCase()||"")},e.prototype.addClassName=function(e){this.classNames.push(e.toLowerCase())},e.prototype.toString=function(){var e=this.element||"";if(this.classNames&&this.classNames.forEach((function(t){return e+="."+t})),this.attrs)for(var t=0;t<this.attrs.length;t+=2){var n=this.attrs[t+1];e+="["+this.attrs[t]+(n?"="+n:"")+"]"}return this.notSelectors.forEach((function(t){return e+=":not("+t+")"})),e},e}(),x=function(){function e(){this._elementMap=new Map,this._elementPartialMap=new Map,this._classMap=new Map,this._classPartialMap=new Map,this._attrValueMap=new Map,this._attrValuePartialMap=new Map,this._listContexts=[]}return e.createNotMatcher=function(t){var n=new e;return n.addSelectables(t,null),n},e.prototype.addSelectables=function(e,t){var n=null;e.length>1&&(n=new w(e),this._listContexts.push(n));for(var r=0;r<e.length;r++)this._addSelectable(e[r],t,n)},e.prototype._addSelectable=function(e,t,n){var r=this,i=e.element,o=e.classNames,s=e.attrs,a=new C(e,t,n);if(i&&(0===s.length&&0===o.length?this._addTerminal(r._elementMap,i,a):r=this._addPartial(r._elementPartialMap,i)),o)for(var u=0;u<o.length;u++){var p=o[u];0===s.length&&u===o.length-1?this._addTerminal(r._classMap,p,a):r=this._addPartial(r._classPartialMap,p)}if(s)for(u=0;u<s.length;u+=2){var l=s[u],c=s[u+1];if(u===s.length-2){var h=r._attrValueMap,f=h.get(l);f||(f=new Map,h.set(l,f)),this._addTerminal(f,c,a)}else{var d=r._attrValuePartialMap,v=d.get(l);v||(v=new Map,d.set(l,v)),r=this._addPartial(v,c)}}},e.prototype._addTerminal=function(e,t,n){var r=e.get(t);r||e.set(t,r=[]),r.push(n)},e.prototype._addPartial=function(t,n){var r=t.get(n);return r||(r=new e,t.set(n,r)),r},e.prototype.match=function(e,t){for(var n=!1,r=e.element,i=e.classNames,o=e.attrs,s=0;s<this._listContexts.length;s++)this._listContexts[s].alreadyMatched=!1;if(n=this._matchTerminal(this._elementMap,r,e,t)||n,n=this._matchPartial(this._elementPartialMap,r,e,t)||n,i)for(s=0;s<i.length;s++){var a=i[s];n=this._matchTerminal(this._classMap,a,e,t)||n,n=this._matchPartial(this._classPartialMap,a,e,t)||n}if(o)for(s=0;s<o.length;s+=2){var u=o[s],p=o[s+1],l=this._attrValueMap.get(u);p&&(n=this._matchTerminal(l,"",e,t)||n),n=this._matchTerminal(l,p,e,t)||n;var c=this._attrValuePartialMap.get(u);p&&(n=this._matchPartial(c,"",e,t)||n),n=this._matchPartial(c,p,e,t)||n}return n},e.prototype._matchTerminal=function(e,t,n,r){if(!e||"string"!=typeof t)return!1;var i=e.get(t)||[],o=e.get("*");if(o&&(i=i.concat(o)),0===i.length)return!1;for(var s=!1,a=0;a<i.length;a++)s=i[a].finalize(n,r)||s;return s},e.prototype._matchPartial=function(e,t,n,r){if(!e||"string"!=typeof t)return!1;var i=e.get(t);return!!i&&i.match(n,r)},e}(),w=function w(e){this.selectors=e,this.alreadyMatched=!1},C=function(){function e(e,t,n){this.selector=e,this.cbContext=t,this.listContext=n,this.notSelectors=e.notSelectors}return e.prototype.finalize=function(e,t){var n=!0;return!(this.notSelectors.length>0)||this.listContext&&this.listContext.alreadyMatched||(n=!x.createNotMatcher(this.notSelectors).match(e,null)),!n||!t||this.listContext&&this.listContext.alreadyMatched||(this.listContext&&(this.listContext.alreadyMatched=!0),t(this.selector,this.cbContext)),n},e}(),b=$("Inject",(function(e){return{token:e}})),T=$("InjectionToken",(function(e){return{_desc:e,"ɵprov":void 0}})),M=$("Attribute",(function(e){return{attributeName:e}})),P=$("ContentChildren",(function(e,t){return void 0===t&&(t={}),Object.assign({selector:e,first:!1,isViewQuery:!1,descendants:!1,emitDistinctChangesOnly:!1},t)})),N=$("ContentChild",(function(e,t){return void 0===t&&(t={}),Object.assign({selector:e,first:!0,isViewQuery:!1,descendants:!0},t)})),A=$("ViewChildren",(function(e,t){return void 0===t&&(t={}),Object.assign({selector:e,first:!1,isViewQuery:!0,descendants:!0,emitDistinctChangesOnly:!1},t)})),I=$("ViewChild",(function(e,t){return Object.assign({selector:e,first:!0,isViewQuery:!0,descendants:!0},t)})),k=$("Directive",(function(e){return void 0===e&&(e={}),e}));!function(e){e[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom"}(g||(g={})),function(e){e[e.OnPush=0]="OnPush",e[e.Default=1]="Default"}(E||(E={}));var O,R,D=$("Component",(function(e){return void 0===e&&(e={}),Object.assign({changeDetection:E.Default},e)})),F=$("Pipe",(function(e){return Object.assign({pure:!0},e)})),L=$("Input",(function(e){return{bindingPropertyName:e}})),B=$("Output",(function(e){return{bindingPropertyName:e}})),V=$("HostBinding",(function(e){return{hostPropertyName:e}})),j=$("HostListener",(function(e,t){return{eventName:e,args:t}})),U=$("NgModule",(function(e){return e})),H=$("Injectable",(function(e){return void 0===e&&(e={}),e})),q={name:"custom-elements"},W={name:"no-errors-schema"},z=$("Optional"),K=$("Self"),Q=$("SkipSelf"),X=$("Host"),G=Function;function $(e,t){function n(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var i=t?t.apply(void 0,s(n)):{};return Object.assign({ngMetadataName:e},i)}return n.isTypeOf=function(t){return t&&t.ngMetadataName===e},n.ngMetadataName=e,n}function Y(e){var t=function n(e){var t=e.classNames&&e.classNames.length?s([8],e.classNames):[];return s([e.element&&"*"!==e.element?e.element:""],e.attrs,t)}(e),r=e.notSelectors&&e.notSelectors.length?e.notSelectors.map((function(e){return function t(e){var t=e.classNames&&e.classNames.length?s([8],e.classNames):[];return e.element?s([5,e.element],e.attrs,t):e.attrs.length?s([3],e.attrs,t):e.classNames&&e.classNames.length?s([9],e.classNames):[]}(e)})):[];return t.concat.apply(t,s(r))}function J(e){return e?S.parse(e).map(Y):[]}!function(e){e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL"}(O||(O={})),function(e){e[e.Error=0]="Error",e[e.Warning=1]="Warning",e[e.Ignore=2]="Ignore"}(R||(R={}));var Z,ee=Object.freeze({__proto__:null,createInject:b,createInjectionToken:T,createAttribute:M,emitDistinctChangesOnlyDefaultValue:!1,createContentChildren:P,createContentChild:N,createViewChildren:A,createViewChild:I,createDirective:k,get ViewEncapsulation(){return g},get ChangeDetectionStrategy(){return E},createComponent:D,createPipe:F,createInput:L,createOutput:B,createHostBinding:V,createHostListener:j,createNgModule:U,createInjectable:H,CUSTOM_ELEMENTS_SCHEMA:q,NO_ERRORS_SCHEMA:W,createOptional:z,createSelf:K,createSkipSelf:Q,createHost:X,Type:G,get SecurityContext(){return O},get MissingTranslationStrategy(){return R},parseSelectorToR3Selector:J});
/**
     * @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(e){e[e.Const=0]="Const"}(Z||(Z={}));var te,ne=function(){function e(e){void 0===e&&(e=[]),this.modifiers=e}return e.prototype.hasModifier=function(e){return-1!==this.modifiers.indexOf(e)},e}();(te=e.BuiltinTypeName||(e.BuiltinTypeName={}))[te.Dynamic=0]="Dynamic",te[te.Bool=1]="Bool",te[te.String=2]="String",te[te.Int=3]="Int",te[te.Number=4]="Number",te[te.Function=5]="Function",te[te.Inferred=6]="Inferred",te[te.None=7]="None";var re,ie,oe=function(e){function t(t,n){var r=e.call(this,n)||this;return r.name=t,r}return r(t,e),t.prototype.visitType=function(e,t){return e.visitBuiltinType(this,t)},t}(ne),se=function(e){function t(t,n,r){void 0===r&&(r=null);var i=e.call(this,n)||this;return i.value=t,i.typeParams=r,i}return r(t,e),t.prototype.visitType=function(e,t){return e.visitExpressionType(this,t)},t}(ne),ae=function(e){function t(t,n){var r=e.call(this,n)||this;return r.of=t,r}return r(t,e),t.prototype.visitType=function(e,t){return e.visitArrayType(this,t)},t}(ne),ue=function(e){function t(t,n){var r=e.call(this,n)||this;return r.valueType=t||null,r}return r(t,e),t.prototype.visitType=function(e,t){return e.visitMapType(this,t)},t}(ne),pe=new oe(e.BuiltinTypeName.Dynamic),le=new oe(e.BuiltinTypeName.Inferred),ce=new oe(e.BuiltinTypeName.Bool),he=(new oe(e.BuiltinTypeName.Int),new oe(e.BuiltinTypeName.Number)),fe=new oe(e.BuiltinTypeName.String),de=(new oe(e.BuiltinTypeName.Function),new oe(e.BuiltinTypeName.None));function ve(e,t){return null==e||null==t?e==t:e.isEquivalent(t)}function me(e,t,n){var r=e.length;if(r!==t.length)return!1;for(var i=0;i<r;i++)if(!n(e[i],t[i]))return!1;return!0}function ye(e,t){return me(e,t,(function(e,t){return e.isEquivalent(t)}))}(re=e.UnaryOperator||(e.UnaryOperator={}))[re.Minus=0]="Minus",re[re.Plus=1]="Plus",(ie=e.BinaryOperator||(e.BinaryOperator={}))[ie.Equals=0]="Equals",ie[ie.NotEquals=1]="NotEquals",ie[ie.Identical=2]="Identical",ie[ie.NotIdentical=3]="NotIdentical",ie[ie.Minus=4]="Minus",ie[ie.Plus=5]="Plus",ie[ie.Divide=6]="Divide",ie[ie.Multiply=7]="Multiply",ie[ie.Modulo=8]="Modulo",ie[ie.And=9]="And",ie[ie.Or=10]="Or",ie[ie.BitwiseAnd=11]="BitwiseAnd",ie[ie.Lower=12]="Lower",ie[ie.LowerEquals=13]="LowerEquals",ie[ie.Bigger=14]="Bigger",ie[ie.BiggerEquals=15]="BiggerEquals";var ge,Ee=function(){function t(e,t){this.type=e||null,this.sourceSpan=t||null}return t.prototype.prop=function(e,t){return new Ze(this,e,null,t)},t.prototype.key=function(e,t,n){return new et(this,e,t,n)},t.prototype.callMethod=function(e,t,n){return new Pe(this,e,t,null,n)},t.prototype.callFn=function(e,t,n){return new Ne(this,e,null,t,n)},t.prototype.instantiate=function(e,t,n){return new Ie(this,e,t,n)},t.prototype.conditional=function(e,t,n){return void 0===t&&(t=null),new ze(this,e,t,null,n)},t.prototype.equals=function(t,n){return new Je(e.BinaryOperator.Equals,this,t,null,n)},t.prototype.notEquals=function(t,n){return new Je(e.BinaryOperator.NotEquals,this,t,null,n)},t.prototype.identical=function(t,n){return new Je(e.BinaryOperator.Identical,this,t,null,n)},t.prototype.notIdentical=function(t,n){return new Je(e.BinaryOperator.NotIdentical,this,t,null,n)},t.prototype.minus=function(t,n){return new Je(e.BinaryOperator.Minus,this,t,null,n)},t.prototype.plus=function(t,n){return new Je(e.BinaryOperator.Plus,this,t,null,n)},t.prototype.divide=function(t,n){return new Je(e.BinaryOperator.Divide,this,t,null,n)},t.prototype.multiply=function(t,n){return new Je(e.BinaryOperator.Multiply,this,t,null,n)},t.prototype.modulo=function(t,n){return new Je(e.BinaryOperator.Modulo,this,t,null,n)},t.prototype.and=function(t,n){return new Je(e.BinaryOperator.And,this,t,null,n)},t.prototype.bitwiseAnd=function(t,n,r){return void 0===r&&(r=!0),new Je(e.BinaryOperator.BitwiseAnd,this,t,null,n,r)},t.prototype.or=function(t,n){return new Je(e.BinaryOperator.Or,this,t,null,n)},t.prototype.lower=function(t,n){return new Je(e.BinaryOperator.Lower,this,t,null,n)},t.prototype.lowerEquals=function(t,n){return new Je(e.BinaryOperator.LowerEquals,this,t,null,n)},t.prototype.bigger=function(t,n){return new Je(e.BinaryOperator.Bigger,this,t,null,n)},t.prototype.biggerEquals=function(t,n){return new Je(e.BinaryOperator.BiggerEquals,this,t,null,n)},t.prototype.isBlank=function(e){return this.equals(st,e)},t.prototype.cast=function(e,t){return new Xe(this,e,t)},t.prototype.toStmt=function(){return new ht(this,null)},t}();(ge=e.BuiltinVar||(e.BuiltinVar={}))[ge.This=0]="This",ge[ge.Super=1]="Super",ge[ge.CatchError=2]="CatchError",ge[ge.CatchStack=3]="CatchStack";var _e,Se=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return"string"==typeof t?(i.name=t,i.builtin=null):(i.name=null,i.builtin=t),i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.name===e.name&&this.builtin===e.builtin},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitReadVarExpr(this,t)},t.prototype.set=function(e){if(!this.name)throw new Error("Built in variable "+this.builtin+" can not be assigned to.");return new Ce(this.name,e,null,this.sourceSpan)},t}(Ee),xe=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.expr=t,i}return r(t,e),t.prototype.visitExpression=function(e,t){return e.visitTypeofExpr(this,t)},t.prototype.isEquivalent=function(e){return e instanceof t&&e.expr.isEquivalent(this.expr)},t.prototype.isConstant=function(){return this.expr.isConstant()},t}(Ee),we=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.node=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.node===e.node},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitWrappedNodeExpr(this,t)},t}(Ee),Ce=function(t){function n(e,n,r,i){var o=t.call(this,r||n.type,i)||this;return o.name=e,o.value=n,o}return r(n,t),n.prototype.isEquivalent=function(e){return e instanceof n&&this.name===e.name&&this.value.isEquivalent(e.value)},n.prototype.isConstant=function(){return!1},n.prototype.visitExpression=function(e,t){return e.visitWriteVarExpr(this,t)},n.prototype.toDeclStmt=function(e,t){return new lt(this.name,this.value,e,t,this.sourceSpan)},n.prototype.toConstDecl=function(){return this.toDeclStmt(le,[e.StmtModifier.Final])},n}(Ee),be=function(e){function t(t,n,r,i,o){var s=e.call(this,i||r.type,o)||this;return s.receiver=t,s.index=n,s.value=r,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.receiver.isEquivalent(e.receiver)&&this.index.isEquivalent(e.index)&&this.value.isEquivalent(e.value)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitWriteKeyExpr(this,t)},t}(Ee),Te=function(e){function t(t,n,r,i,o){var s=e.call(this,i||r.type,o)||this;return s.receiver=t,s.name=n,s.value=r,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name&&this.value.isEquivalent(e.value)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitWritePropExpr(this,t)},t}(Ee);(_e=e.BuiltinMethod||(e.BuiltinMethod={}))[_e.ConcatArray=0]="ConcatArray",_e[_e.SubscribeObservable=1]="SubscribeObservable",_e[_e.Bind=2]="Bind";var Me,Pe=function(e){function t(t,n,r,i,o){var s=e.call(this,i,o)||this;return s.receiver=t,s.args=r,"string"==typeof n?(s.name=n,s.builtin=null):(s.name=null,s.builtin=n),s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name&&this.builtin===e.builtin&&ye(this.args,e.args)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitInvokeMethodExpr(this,t)},t}(Ee),Ne=function(e){function t(t,n,r,i,o){void 0===o&&(o=!1);var s=e.call(this,r,i)||this;return s.fn=t,s.args=n,s.pure=o,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.fn.isEquivalent(e.fn)&&ye(this.args,e.args)&&this.pure===e.pure},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitInvokeFunctionExpr(this,t)},t}(Ee),Ae=function(e){function t(t,n,r,i){var o=e.call(this,r,i)||this;return o.tag=t,o.template=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.tag.isEquivalent(e.tag)&&me(this.template.elements,e.template.elements,(function(e,t){return e.text===t.text}))&&ye(this.template.expressions,e.template.expressions)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitTaggedTemplateExpr(this,t)},t}(Ee),Ie=function(e){function t(t,n,r,i){var o=e.call(this,r,i)||this;return o.classExpr=t,o.args=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.classExpr.isEquivalent(e.classExpr)&&ye(this.args,e.args)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitInstantiateExpr(this,t)},t}(Ee),ke=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.value=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.value===e.value},t.prototype.isConstant=function(){return!0},t.prototype.visitExpression=function(e,t){return e.visitLiteralExpr(this,t)},t}(Ee),Oe=function Oe(e,t){this.elements=e,this.expressions=t},Re=function Re(e,t,n){var r;this.text=e,this.sourceSpan=t,this.rawText=null!==(r=null!=n?n:null==t?void 0:t.toString())&&void 0!==r?r:je(Be(e))},De=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t}(Me=function Me(e,t){this.text=e,this.sourceSpan=t}),Fe=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t}(Me),Le=function(e){function t(t,n,r,i,o){var s=e.call(this,fe,o)||this;return s.metaBlock=t,s.messageParts=n,s.placeHolderNames=r,s.expressions=i,s}return r(t,e),t.prototype.isEquivalent=function(e){return!1},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitLocalizedString(this,t)},t.prototype.serializeI18nHead=function(){var e=this.metaBlock.description||"";return this.metaBlock.meaning&&(e=this.metaBlock.meaning+"|"+e),this.metaBlock.customId&&(e=e+"@@"+this.metaBlock.customId),this.metaBlock.legacyIds&&this.metaBlock.legacyIds.forEach((function(t){e=e+"␟"+t})),Ue(e,this.messageParts[0].text,this.getMessagePartSourceSpan(0))},t.prototype.getMessagePartSourceSpan=function(e){var t,n;return null!==(n=null===(t=this.messageParts[e])||void 0===t?void 0:t.sourceSpan)&&void 0!==n?n:this.sourceSpan},t.prototype.getPlaceholderSourceSpan=function(e){var t,n,r,i;return null!==(i=null!==(n=null===(t=this.placeHolderNames[e])||void 0===t?void 0:t.sourceSpan)&&void 0!==n?n:null===(r=this.expressions[e])||void 0===r?void 0:r.sourceSpan)&&void 0!==i?i:this.sourceSpan},t.prototype.serializeI18nTemplatePart=function(e){return Ue(this.placeHolderNames[e-1].text,this.messageParts[e].text,this.getMessagePartSourceSpan(e))},t}(Ee),Be=function(e){return e.replace(/\\/g,"\\\\")},Ve=function(e){return e.replace(/:/g,"\\:")},je=function(e){return e.replace(/`/g,"\\`").replace(/\${/g,"$\\{")};function Ue(e,t,n){return""===e?{cooked:t,raw:je((r=Be(t),r.replace(/^:/,"\\:"))),range:n}:{cooked:":"+e+":"+t,raw:je(":"+Ve(Be(e))+":"+Be(t)),range:n};var r}var He,qe=function(e){function t(t,n,r,i){void 0===r&&(r=null);var o=e.call(this,n,i)||this;return o.value=t,o.typeParams=r,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.value.name===e.value.name&&this.value.moduleName===e.value.moduleName&&this.value.runtime===e.value.runtime},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitExternalExpr(this,t)},t}(Ee),We=function We(e,t,n){this.moduleName=e,this.name=t,this.runtime=n},ze=function(e){function t(t,n,r,i,o){void 0===r&&(r=null);var s=e.call(this,i||n.type,o)||this;return s.condition=t,s.falseCase=r,s.trueCase=n,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.condition.isEquivalent(e.condition)&&this.trueCase.isEquivalent(e.trueCase)&&ve(this.falseCase,e.falseCase)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitConditionalExpr(this,t)},t}(Ee),Ke=function(e){function t(t,n){var r=e.call(this,ce,n)||this;return r.condition=t,r}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.condition.isEquivalent(e.condition)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitNotExpr(this,t)},t}(Ee),Qe=function(e){function t(t,n){var r=e.call(this,t.type,n)||this;return r.condition=t,r}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.condition.isEquivalent(e.condition)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitAssertNotNullExpr(this,t)},t}(Ee),Xe=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.value=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.value.isEquivalent(e.value)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitCastExpr(this,t)},t}(Ee),Ge=function(){function e(e,t){void 0===t&&(t=null),this.name=e,this.type=t}return e.prototype.isEquivalent=function(e){return this.name===e.name},e}(),$e=function(e){function t(t,n,r,i,o){var s=e.call(this,r,i)||this;return s.params=t,s.statements=n,s.name=o,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.params,e.params)&&ye(this.statements,e.statements)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitFunctionExpr(this,t)},t.prototype.toDeclStmt=function(e,t){return new ct(e,this.params,this.statements,this.type,t,this.sourceSpan)},t}(Ee),Ye=function(e){function t(t,n,r,i,o){void 0===o&&(o=!0);var s=e.call(this,r||he,i)||this;return s.operator=t,s.expr=n,s.parens=o,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.operator===e.operator&&this.expr.isEquivalent(e.expr)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitUnaryOperatorExpr(this,t)},t}(Ee),Je=function(e){function t(t,n,r,i,o,s){void 0===s&&(s=!0);var a=e.call(this,i||n.type,o)||this;return a.operator=t,a.rhs=r,a.parens=s,a.lhs=n,a}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.operator===e.operator&&this.lhs.isEquivalent(e.lhs)&&this.rhs.isEquivalent(e.rhs)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitBinaryOperatorExpr(this,t)},t}(Ee),Ze=function(e){function t(t,n,r,i){var o=e.call(this,r,i)||this;return o.receiver=t,o.name=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitReadPropExpr(this,t)},t.prototype.set=function(e){return new Te(this.receiver,this.name,e,null,this.sourceSpan)},t}(Ee),et=function(e){function t(t,n,r,i){var o=e.call(this,r,i)||this;return o.receiver=t,o.index=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.receiver.isEquivalent(e.receiver)&&this.index.isEquivalent(e.index)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitReadKeyExpr(this,t)},t.prototype.set=function(e){return new be(this.receiver,this.index,e,null,this.sourceSpan)},t}(Ee),tt=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.entries=t,i}return r(t,e),t.prototype.isConstant=function(){return this.entries.every((function(e){return e.isConstant()}))},t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.entries,e.entries)},t.prototype.visitExpression=function(e,t){return e.visitLiteralArrayExpr(this,t)},t}(Ee),nt=function(){function e(e,t,n){this.key=e,this.value=t,this.quoted=n}return e.prototype.isEquivalent=function(e){return this.key===e.key&&this.value.isEquivalent(e.value)},e}(),rt=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.entries=t,i.valueType=null,n&&(i.valueType=n.valueType),i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.entries,e.entries)},t.prototype.isConstant=function(){return this.entries.every((function(e){return e.value.isConstant()}))},t.prototype.visitExpression=function(e,t){return e.visitLiteralMapExpr(this,t)},t}(Ee),it=function(e){function t(t,n){var r=e.call(this,t[t.length-1].type,n)||this;return r.parts=t,r}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.parts,e.parts)},t.prototype.isConstant=function(){return!1},t.prototype.visitExpression=function(e,t){return e.visitCommaExpr(this,t)},t}(Ee),ot=(new Se(e.BuiltinVar.This,null,null),new Se(e.BuiltinVar.Super,null,null),new Se(e.BuiltinVar.CatchError,null,null),new Se(e.BuiltinVar.CatchStack,null,null),new ke(null,null,null)),st=new ke(null,le,null);(He=e.StmtModifier||(e.StmtModifier={}))[He.Final=0]="Final",He[He.Private=1]="Private",He[He.Exported=2]="Exported",He[He.Static=3]="Static";var at=function(){function e(e,t,n){this.text=e,this.multiline=t,this.trailingNewline=n}return e.prototype.toString=function(){return this.multiline?" "+this.text+" ":this.text},e}(),ut=function(e){function t(t){var n=e.call(this,"",!0,!0)||this;return n.tags=t,n}return r(t,e),t.prototype.toString=function(){return function e(t){var n,r;if(0===t.length)return"";if(1===t.length&&t[0].tagName&&!t[0].text)return"*"+qt(t[0])+" ";var o="*\n";try{for(var s=i(t),a=s.next();!a.done;a=s.next())o+=" *",o+=qt(a.value).replace(/\n/g,"\n * "),o+="\n"}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}return o+" "}(this.tags)},t}(at),pt=function(){function e(e,t,n){void 0===e&&(e=[]),void 0===t&&(t=null),this.modifiers=e,this.sourceSpan=t,this.leadingComments=n}return e.prototype.hasModifier=function(e){return-1!==this.modifiers.indexOf(e)},e.prototype.addLeadingComment=function(e){var t;this.leadingComments=null!==(t=this.leadingComments)&&void 0!==t?t:[],this.leadingComments.push(e)},e}(),lt=function(e){function t(t,n,r,i,o,s){var a=e.call(this,i,o,s)||this;return a.name=t,a.value=n,a.type=r||n&&n.type||null,a}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.name===e.name&&(this.value?!!e.value&&this.value.isEquivalent(e.value):!e.value)},t.prototype.visitStatement=function(e,t){return e.visitDeclareVarStmt(this,t)},t}(pt),ct=function(e){function t(t,n,r,i,o,s,a){var u=e.call(this,o,s,a)||this;return u.name=t,u.params=n,u.statements=r,u.type=i||null,u}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.params,e.params)&&ye(this.statements,e.statements)},t.prototype.visitStatement=function(e,t){return e.visitDeclareFunctionStmt(this,t)},t}(pt),ht=function(e){function t(t,n,r){var i=e.call(this,[],n,r)||this;return i.expr=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.expr.isEquivalent(e.expr)},t.prototype.visitStatement=function(e,t){return e.visitExpressionStmt(this,t)},t}(pt),ft=function(e){function t(t,n,r){void 0===n&&(n=null);var i=e.call(this,[],n,r)||this;return i.value=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.value.isEquivalent(e.value)},t.prototype.visitStatement=function(e,t){return e.visitReturnStmt(this,t)},t}(pt),dt=function(){function e(e,t){void 0===e&&(e=null),void 0===t&&(t=[]),this.type=e,this.modifiers=t}return e.prototype.hasModifier=function(e){return-1!==this.modifiers.indexOf(e)},e}(),vt=function(e){function t(t,n,r,i){var o=e.call(this,n,r)||this;return o.name=t,o.initializer=i,o}return r(t,e),t.prototype.isEquivalent=function(e){return this.name===e.name},t}(dt),mt=function(e){function t(t,n,r,i,o){var s=e.call(this,i,o)||this;return s.name=t,s.params=n,s.body=r,s}return r(t,e),t.prototype.isEquivalent=function(e){return this.name===e.name&&ye(this.body,e.body)},t}(dt),yt=function(e){function t(t,n,r,i){var o=e.call(this,r,i)||this;return o.name=t,o.body=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return this.name===e.name&&ye(this.body,e.body)},t}(dt),gt=function(e){function t(t,n,r,i,o,s,a,u,p){var l=e.call(this,a,u,p)||this;return l.name=t,l.parent=n,l.fields=r,l.getters=i,l.constructorMethod=o,l.methods=s,l}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.name===e.name&&ve(this.parent,e.parent)&&ye(this.fields,e.fields)&&ye(this.getters,e.getters)&&this.constructorMethod.isEquivalent(e.constructorMethod)&&ye(this.methods,e.methods)},t.prototype.visitStatement=function(e,t){return e.visitDeclareClassStmt(this,t)},t}(pt),Et=function(e){function t(t,n,r,i,o){void 0===r&&(r=[]);var s=e.call(this,[],i,o)||this;return s.condition=t,s.trueCase=n,s.falseCase=r,s}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&this.condition.isEquivalent(e.condition)&&ye(this.trueCase,e.trueCase)&&ye(this.falseCase,e.falseCase)},t.prototype.visitStatement=function(e,t){return e.visitIfStmt(this,t)},t}(pt),_t=function(e){function t(t,n,r,i){void 0===r&&(r=null);var o=e.call(this,[],r,i)||this;return o.bodyStmts=t,o.catchStmts=n,o}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof t&&ye(this.bodyStmts,e.bodyStmts)&&ye(this.catchStmts,e.catchStmts)},t.prototype.visitStatement=function(e,t){return e.visitTryCatchStmt(this,t)},t}(pt),St=function(e){function t(t,n,r){void 0===n&&(n=null);var i=e.call(this,[],n,r)||this;return i.error=t,i}return r(t,e),t.prototype.isEquivalent=function(e){return e instanceof _t&&this.error.isEquivalent(e.error)},t.prototype.visitStatement=function(e,t){return e.visitThrowStmt(this,t)},t}(pt),xt=function(){function e(){}return e.prototype.transformExpr=function(e,t){return e},e.prototype.transformStmt=function(e,t){return e},e.prototype.visitReadVarExpr=function(e,t){return this.transformExpr(e,t)},e.prototype.visitWrappedNodeExpr=function(e,t){return this.transformExpr(e,t)},e.prototype.visitTypeofExpr=function(e,t){return this.transformExpr(new xe(e.expr.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitWriteVarExpr=function(e,t){return this.transformExpr(new Ce(e.name,e.value.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitWriteKeyExpr=function(e,t){return this.transformExpr(new be(e.receiver.visitExpression(this,t),e.index.visitExpression(this,t),e.value.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitWritePropExpr=function(e,t){return this.transformExpr(new Te(e.receiver.visitExpression(this,t),e.name,e.value.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitInvokeMethodExpr=function(e,t){var n=e.builtin||e.name;return this.transformExpr(new Pe(e.receiver.visitExpression(this,t),n,this.visitAllExpressions(e.args,t),e.type,e.sourceSpan),t)},e.prototype.visitInvokeFunctionExpr=function(e,t){return this.transformExpr(new Ne(e.fn.visitExpression(this,t),this.visitAllExpressions(e.args,t),e.type,e.sourceSpan),t)},e.prototype.visitTaggedTemplateExpr=function(e,t){var n=this;return this.transformExpr(new Ae(e.tag.visitExpression(this,t),new Oe(e.template.elements,e.template.expressions.map((function(e){return e.visitExpression(n,t)}))),e.type,e.sourceSpan),t)},e.prototype.visitInstantiateExpr=function(e,t){return this.transformExpr(new Ie(e.classExpr.visitExpression(this,t),this.visitAllExpressions(e.args,t),e.type,e.sourceSpan),t)},e.prototype.visitLiteralExpr=function(e,t){return this.transformExpr(e,t)},e.prototype.visitLocalizedString=function(e,t){return this.transformExpr(new Le(e.metaBlock,e.messageParts,e.placeHolderNames,this.visitAllExpressions(e.expressions,t),e.sourceSpan),t)},e.prototype.visitExternalExpr=function(e,t){return this.transformExpr(e,t)},e.prototype.visitConditionalExpr=function(e,t){return this.transformExpr(new ze(e.condition.visitExpression(this,t),e.trueCase.visitExpression(this,t),e.falseCase.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitNotExpr=function(e,t){return this.transformExpr(new Ke(e.condition.visitExpression(this,t),e.sourceSpan),t)},e.prototype.visitAssertNotNullExpr=function(e,t){return this.transformExpr(new Qe(e.condition.visitExpression(this,t),e.sourceSpan),t)},e.prototype.visitCastExpr=function(e,t){return this.transformExpr(new Xe(e.value.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitFunctionExpr=function(e,t){return this.transformExpr(new $e(e.params,this.visitAllStatements(e.statements,t),e.type,e.sourceSpan),t)},e.prototype.visitUnaryOperatorExpr=function(e,t){return this.transformExpr(new Ye(e.operator,e.expr.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitBinaryOperatorExpr=function(e,t){return this.transformExpr(new Je(e.operator,e.lhs.visitExpression(this,t),e.rhs.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitReadPropExpr=function(e,t){return this.transformExpr(new Ze(e.receiver.visitExpression(this,t),e.name,e.type,e.sourceSpan),t)},e.prototype.visitReadKeyExpr=function(e,t){return this.transformExpr(new et(e.receiver.visitExpression(this,t),e.index.visitExpression(this,t),e.type,e.sourceSpan),t)},e.prototype.visitLiteralArrayExpr=function(e,t){return this.transformExpr(new tt(this.visitAllExpressions(e.entries,t),e.type,e.sourceSpan),t)},e.prototype.visitLiteralMapExpr=function(e,t){var n=this,r=e.entries.map((function(e){return new nt(e.key,e.value.visitExpression(n,t),e.quoted)})),i=new ue(e.valueType);return this.transformExpr(new rt(r,i,e.sourceSpan),t)},e.prototype.visitCommaExpr=function(e,t){return this.transformExpr(new it(this.visitAllExpressions(e.parts,t),e.sourceSpan),t)},e.prototype.visitAllExpressions=function(e,t){var n=this;return e.map((function(e){return e.visitExpression(n,t)}))},e.prototype.visitDeclareVarStmt=function(e,t){var n=e.value&&e.value.visitExpression(this,t);return this.transformStmt(new lt(e.name,n,e.type,e.modifiers,e.sourceSpan,e.leadingComments),t)},e.prototype.visitDeclareFunctionStmt=function(e,t){return this.transformStmt(new ct(e.name,e.params,this.visitAllStatements(e.statements,t),e.type,e.modifiers,e.sourceSpan,e.leadingComments),t)},e.prototype.visitExpressionStmt=function(e,t){return this.transformStmt(new ht(e.expr.visitExpression(this,t),e.sourceSpan,e.leadingComments),t)},e.prototype.visitReturnStmt=function(e,t){return this.transformStmt(new ft(e.value.visitExpression(this,t),e.sourceSpan,e.leadingComments),t)},e.prototype.visitDeclareClassStmt=function(e,t){var n=this,r=e.parent.visitExpression(this,t),i=e.getters.map((function(e){return new yt(e.name,n.visitAllStatements(e.body,t),e.type,e.modifiers)})),o=e.constructorMethod&&new mt(e.constructorMethod.name,e.constructorMethod.params,this.visitAllStatements(e.constructorMethod.body,t),e.constructorMethod.type,e.constructorMethod.modifiers),s=e.methods.map((function(e){return new mt(e.name,e.params,n.visitAllStatements(e.body,t),e.type,e.modifiers)}));return this.transformStmt(new gt(e.name,r,e.fields,i,o,s,e.modifiers,e.sourceSpan),t)},e.prototype.visitIfStmt=function(e,t){return this.transformStmt(new Et(e.condition.visitExpression(this,t),this.visitAllStatements(e.trueCase,t),this.visitAllStatements(e.falseCase,t),e.sourceSpan,e.leadingComments),t)},e.prototype.visitTryCatchStmt=function(e,t){return this.transformStmt(new _t(this.visitAllStatements(e.bodyStmts,t),this.visitAllStatements(e.catchStmts,t),e.sourceSpan,e.leadingComments),t)},e.prototype.visitThrowStmt=function(e,t){return this.transformStmt(new St(e.error.visitExpression(this,t),e.sourceSpan,e.leadingComments),t)},e.prototype.visitAllStatements=function(e,t){var n=this;return e.map((function(e){return e.visitStatement(n,t)}))},e}(),wt=function(){function e(){}return e.prototype.visitType=function(e,t){return e},e.prototype.visitExpression=function(e,t){return e.type&&e.type.visitType(this,t),e},e.prototype.visitBuiltinType=function(e,t){return this.visitType(e,t)},e.prototype.visitExpressionType=function(e,t){var n=this;return e.value.visitExpression(this,t),null!==e.typeParams&&e.typeParams.forEach((function(e){return n.visitType(e,t)})),this.visitType(e,t)},e.prototype.visitArrayType=function(e,t){return this.visitType(e,t)},e.prototype.visitMapType=function(e,t){return this.visitType(e,t)},e.prototype.visitWrappedNodeExpr=function(e,t){return e},e.prototype.visitTypeofExpr=function(e,t){return this.visitExpression(e,t)},e.prototype.visitReadVarExpr=function(e,t){return this.visitExpression(e,t)},e.prototype.visitWriteVarExpr=function(e,t){return e.value.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitWriteKeyExpr=function(e,t){return e.receiver.visitExpression(this,t),e.index.visitExpression(this,t),e.value.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitWritePropExpr=function(e,t){return e.receiver.visitExpression(this,t),e.value.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitInvokeMethodExpr=function(e,t){return e.receiver.visitExpression(this,t),this.visitAllExpressions(e.args,t),this.visitExpression(e,t)},e.prototype.visitInvokeFunctionExpr=function(e,t){return e.fn.visitExpression(this,t),this.visitAllExpressions(e.args,t),this.visitExpression(e,t)},e.prototype.visitTaggedTemplateExpr=function(e,t){return e.tag.visitExpression(this,t),this.visitAllExpressions(e.template.expressions,t),this.visitExpression(e,t)},e.prototype.visitInstantiateExpr=function(e,t){return e.classExpr.visitExpression(this,t),this.visitAllExpressions(e.args,t),this.visitExpression(e,t)},e.prototype.visitLiteralExpr=function(e,t){return this.visitExpression(e,t)},e.prototype.visitLocalizedString=function(e,t){return this.visitExpression(e,t)},e.prototype.visitExternalExpr=function(e,t){var n=this;return e.typeParams&&e.typeParams.forEach((function(e){return e.visitType(n,t)})),this.visitExpression(e,t)},e.prototype.visitConditionalExpr=function(e,t){return e.condition.visitExpression(this,t),e.trueCase.visitExpression(this,t),e.falseCase.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitNotExpr=function(e,t){return e.condition.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitAssertNotNullExpr=function(e,t){return e.condition.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitCastExpr=function(e,t){return e.value.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitFunctionExpr=function(e,t){return this.visitAllStatements(e.statements,t),this.visitExpression(e,t)},e.prototype.visitUnaryOperatorExpr=function(e,t){return e.expr.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitBinaryOperatorExpr=function(e,t){return e.lhs.visitExpression(this,t),e.rhs.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitReadPropExpr=function(e,t){return e.receiver.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitReadKeyExpr=function(e,t){return e.receiver.visitExpression(this,t),e.index.visitExpression(this,t),this.visitExpression(e,t)},e.prototype.visitLiteralArrayExpr=function(e,t){return this.visitAllExpressions(e.entries,t),this.visitExpression(e,t)},e.prototype.visitLiteralMapExpr=function(e,t){var n=this;return e.entries.forEach((function(e){return e.value.visitExpression(n,t)})),this.visitExpression(e,t)},e.prototype.visitCommaExpr=function(e,t){return this.visitAllExpressions(e.parts,t),this.visitExpression(e,t)},e.prototype.visitAllExpressions=function(e,t){var n=this;e.forEach((function(e){return e.visitExpression(n,t)}))},e.prototype.visitDeclareVarStmt=function(e,t){return e.value&&e.value.visitExpression(this,t),e.type&&e.type.visitType(this,t),e},e.prototype.visitDeclareFunctionStmt=function(e,t){return this.visitAllStatements(e.statements,t),e.type&&e.type.visitType(this,t),e},e.prototype.visitExpressionStmt=function(e,t){return e.expr.visitExpression(this,t),e},e.prototype.visitReturnStmt=function(e,t){return e.value.visitExpression(this,t),e},e.prototype.visitDeclareClassStmt=function(e,t){var n=this;return e.parent.visitExpression(this,t),e.getters.forEach((function(e){return n.visitAllStatements(e.body,t)})),e.constructorMethod&&this.visitAllStatements(e.constructorMethod.body,t),e.methods.forEach((function(e){return n.visitAllStatements(e.body,t)})),e},e.prototype.visitIfStmt=function(e,t){return e.condition.visitExpression(this,t),this.visitAllStatements(e.trueCase,t),this.visitAllStatements(e.falseCase,t),e},e.prototype.visitTryCatchStmt=function(e,t){return this.visitAllStatements(e.bodyStmts,t),this.visitAllStatements(e.catchStmts,t),e},e.prototype.visitThrowStmt=function(e,t){return e.error.visitExpression(this,t),e},e.prototype.visitAllStatements=function(e,t){var n=this;e.forEach((function(e){return e.visitStatement(n,t)}))},e}();function Ct(e){var t=new bt;return t.visitAllStatements(e,null),t.varNames}var bt=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.varNames=new Set,t}return r(t,e),t.prototype.visitDeclareFunctionStmt=function(e,t){return e},t.prototype.visitDeclareClassStmt=function(e,t){return e},t.prototype.visitReadVarExpr=function(e,t){return e.name&&this.varNames.add(e.name),null},t}(wt),Tt=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.externalReferences=[],t}return r(t,e),t.prototype.visitExternalExpr=function(t,n){return this.externalReferences.push(t.value),e.prototype.visitExternalExpr.call(this,t,n)},t}(wt);function Mt(e,t){if(!t)return e;var n=new Nt(t);return e.visitStatement(n,null)}function Pt(e,t){if(!t)return e;var n=new Nt(t);return e.visitExpression(n,null)}var Nt=function(e){function t(t){var n=e.call(this)||this;return n.sourceSpan=t,n}return r(t,e),t.prototype._clone=function(e){var t,n,r=Object.create(e.constructor.prototype);try{for(var o=i(Object.keys(e)),s=o.next();!s.done;s=o.next()){var a=s.value;r[a]=e[a]}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r},t.prototype.transformExpr=function(e,t){return e.sourceSpan||((e=this._clone(e)).sourceSpan=this.sourceSpan),e},t.prototype.transformStmt=function(e,t){return e.sourceSpan||((e=this._clone(e)).sourceSpan=this.sourceSpan),e},t}(xt);function At(e){return void 0===e&&(e=[]),new ut(e)}function It(e,t,n){return new Se(e,t,n)}function kt(e,t,n){return void 0===t&&(t=null),new qe(e,null,t,n)}function Ot(e,t,n){return null!=e?Rt(kt(e,t,null),n):null}function Rt(e,t,n){return new se(e,t,n)}function Dt(e){return new xe(e)}function Ft(e,t,n){return new tt(e,t,n)}function Lt(e,t){return void 0===t&&(t=null),new rt(e.map((function(e){return new nt(e.key,e.value,e.quoted)})),t,null)}function Bt(e,t,n,r,i){return new $e(e,t,n,r,i)}function Vt(e,t,n,r,i){return new Et(e,t,n,r,i)}function jt(e,t,n,r){return new Ae(e,t,n,r)}function Ut(e,t,n){return new ke(e,t,n)}function Ht(e){return e instanceof ke&&null===e.value}function qt(e){var t="";if(e.tagName&&(t+=" @"+e.tagName),e.text){if(e.text.match(/\/\*|\*\//))throw new Error('JSDoc text cannot contain "/*" and "*/"');t+=" "+e.text.replace(/@/g,"\\@")}return t}var Wt=It("<unknown>"),zt={},Kt=function(e){function t(t){var n=e.call(this,t.type)||this;return n.resolved=t,n.original=t,n}return r(t,e),t.prototype.visitExpression=function(e,t){return t===zt?this.original.visitExpression(e,t):this.resolved.visitExpression(e,t)},t.prototype.isEquivalent=function(e){return e instanceof t&&this.resolved.isEquivalent(e.resolved)},t.prototype.isConstant=function(){return!0},t.prototype.fixup=function(e){this.resolved=e,this.shared=!0},t}(Ee),Qt=function(){function t(e){void 0===e&&(e=!1),this.isClosureCompilerEnabled=e,this.statements=[],this.literals=new Map,this.literalFactories=new Map,this.injectorDefinitions=new Map,this.directiveDefinitions=new Map,this.componentDefinitions=new Map,this.pipeDefinitions=new Map,this.nextNameIndex=0}return t.prototype.getConstLiteral=function(t,n){if(t instanceof ke&&!Yt(t)||t instanceof Kt)return t;var r=this.keyOf(t),i=this.literals.get(r),o=!1;if(i||(i=new Kt(t),this.literals.set(r,i),o=!0),!o&&!i.shared||o&&n){var s=this.freshName(),a=void 0,u=void 0;this.isClosureCompilerEnabled&&Yt(t)?(a=It(s).set(new $e([],[new ft(t)])),u=It(s).callFn([])):(a=It(s).set(t),u=It(s)),this.statements.push(a.toDeclStmt(le,[e.StmtModifier.Final])),i.fixup(u)}return i},t.prototype.getDefinition=function(t,n,r,i){void 0===i&&(i=!1);var o=this.definitionsOf(n),s=o.get(t),a=!1;if(!s){var u=this.propertyNameOf(n);s=new Kt(r.importExpr(t).prop(u)),o.set(t,s),a=!0}if(!a&&!s.shared||a&&i){var p=this.freshName();this.statements.push(It(p).set(s.resolved).toDeclStmt(le,[e.StmtModifier.Final])),s.fixup(It(p))}return s},t.prototype.getLiteralFactory=function(e){if(e instanceof tt){var t=e.entries.map((function(e){return e.isConstant()?e:Wt})),n=this.keyOf(Ft(t));return this._getLiteralFactory(n,e.entries,(function(e){return Ft(e)}))}var r=Lt(e.entries.map((function(e){return{key:e.key,value:e.value.isConstant()?e.value:Wt,quoted:e.quoted}})));return n=this.keyOf(r),this._getLiteralFactory(n,e.entries.map((function(e){return e.value})),(function(t){return Lt(t.map((function(t,n){return{key:e.entries[n].key,value:t,quoted:e.entries[n].quoted}})))}))},t.prototype._getLiteralFactory=function(t,n,r){var i=this,o=this.literalFactories.get(t),s=n.filter((function(e){return!e.isConstant()}));if(!o){var a=n.map((function(e,t){return e.isConstant()?i.getConstLiteral(e,!0):It("a"+t)})),u=Bt(a.filter($t).map((function(e){return new Ge(e.name,pe)})),[new ft(r(a))],le),p=this.freshName();this.statements.push(It(p).set(u).toDeclStmt(le,[e.StmtModifier.Final])),o=It(p),this.literalFactories.set(t,o)}return{literalFactory:o,literalFactoryArguments:s}},t.prototype.uniqueName=function(e){return""+e+this.nextNameIndex++},t.prototype.definitionsOf=function(e){switch(e){case 2:return this.componentDefinitions;case 1:return this.directiveDefinitions;case 0:return this.injectorDefinitions;case 3:return this.pipeDefinitions}},t.prototype.propertyNameOf=function(e){switch(e){case 2:return"ɵcmp";case 1:return"ɵdir";case 0:return"ɵinj";case 3:return"ɵpipe"}},t.prototype.freshName=function(){return this.uniqueName("_c")},t.prototype.keyOf=function(e){return e.visitExpression(new Xt,zt)},t}(),Xt=function(){function e(){this.visitWrappedNodeExpr=Gt,this.visitWriteVarExpr=Gt,this.visitWriteKeyExpr=Gt,this.visitWritePropExpr=Gt,this.visitInvokeMethodExpr=Gt,this.visitInvokeFunctionExpr=Gt,this.visitTaggedTemplateExpr=Gt,this.visitInstantiateExpr=Gt,this.visitConditionalExpr=Gt,this.visitNotExpr=Gt,this.visitAssertNotNullExpr=Gt,this.visitCastExpr=Gt,this.visitFunctionExpr=Gt,this.visitUnaryOperatorExpr=Gt,this.visitBinaryOperatorExpr=Gt,this.visitReadPropExpr=Gt,this.visitReadKeyExpr=Gt,this.visitCommaExpr=Gt,this.visitLocalizedString=Gt}return e.prototype.visitLiteralExpr=function(e){return""+("string"==typeof e.value?'"'+e.value+'"':e.value)},e.prototype.visitLiteralArrayExpr=function(e,t){var n=this;return"["+e.entries.map((function(e){return e.visitExpression(n,t)})).join(",")+"]"},e.prototype.visitLiteralMapExpr=function(e,t){var n=this;return"{"+e.entries.map((function(e){return function(e){var t=e.quoted?'"':"";return""+t+e.key+t}(e)+":"+e.value.visitExpression(n,t)})).join(",")},e.prototype.visitExternalExpr=function(e){return e.value.moduleName?"EX:"+e.value.moduleName+":"+e.value.name:"EX:"+e.value.runtime.name},e.prototype.visitReadVarExpr=function(e){return"VAR:"+e.name},e.prototype.visitTypeofExpr=function(e,t){return"TYPEOF:"+e.expr.visitExpression(this,t)},e}();function Gt(e){throw new Error("Invalid state: Visitor "+this.constructor.name+" doesn't handle "+e.constructor.name)}function $t(e){return e instanceof Se}function Yt(e){return e instanceof ke&&"string"==typeof e.value&&e.value.length>=50}
/**
     * @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 Jt,Zt="@angular/core";function en(e){return{identifier:{reference:e}}}function tn(e,t){return en(e.resolveExternalReference(t))}
/**
     * @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
     */(Jt=function Jt(){}).ANALYZE_FOR_ENTRY_COMPONENTS={name:"ANALYZE_FOR_ENTRY_COMPONENTS",moduleName:Zt},Jt.ElementRef={name:"ElementRef",moduleName:Zt},Jt.NgModuleRef={name:"NgModuleRef",moduleName:Zt},Jt.ViewContainerRef={name:"ViewContainerRef",moduleName:Zt},Jt.ChangeDetectorRef={name:"ChangeDetectorRef",moduleName:Zt},Jt.QueryList={name:"QueryList",moduleName:Zt},Jt.TemplateRef={name:"TemplateRef",moduleName:Zt},Jt.Renderer2={name:"Renderer2",moduleName:Zt},Jt.CodegenComponentFactoryResolver={name:"ɵCodegenComponentFactoryResolver",moduleName:Zt},Jt.ComponentFactoryResolver={name:"ComponentFactoryResolver",moduleName:Zt},Jt.ComponentFactory={name:"ComponentFactory",moduleName:Zt},Jt.ComponentRef={name:"ComponentRef",moduleName:Zt},Jt.NgModuleFactory={name:"NgModuleFactory",moduleName:Zt},Jt.createModuleFactory={name:"ɵcmf",moduleName:Zt},Jt.moduleDef={name:"ɵmod",moduleName:Zt},Jt.moduleProviderDef={name:"ɵmpd",moduleName:Zt},Jt.RegisterModuleFactoryFn={name:"ɵregisterModuleFactory",moduleName:Zt},Jt.inject={name:"ɵɵinject",moduleName:Zt},Jt.directiveInject={name:"ɵɵdirectiveInject",moduleName:Zt},Jt.INJECTOR={name:"INJECTOR",moduleName:Zt},Jt.Injector={name:"Injector",moduleName:Zt},Jt.ɵɵdefineInjectable={name:"ɵɵdefineInjectable",moduleName:Zt},Jt.InjectableDef={name:"ɵɵInjectableDef",moduleName:Zt},Jt.ViewEncapsulation={name:"ViewEncapsulation",moduleName:Zt},Jt.ChangeDetectionStrategy={name:"ChangeDetectionStrategy",moduleName:Zt},Jt.SecurityContext={name:"SecurityContext",moduleName:Zt},Jt.LOCALE_ID={name:"LOCALE_ID",moduleName:Zt},Jt.TRANSLATIONS_FORMAT={name:"TRANSLATIONS_FORMAT",moduleName:Zt},Jt.inlineInterpolate={name:"ɵinlineInterpolate",moduleName:Zt},Jt.interpolate={name:"ɵinterpolate",moduleName:Zt},Jt.EMPTY_ARRAY={name:"ɵEMPTY_ARRAY",moduleName:Zt},Jt.EMPTY_MAP={name:"ɵEMPTY_MAP",moduleName:Zt},Jt.Renderer={name:"Renderer",moduleName:Zt},Jt.viewDef={name:"ɵvid",moduleName:Zt},Jt.elementDef={name:"ɵeld",moduleName:Zt},Jt.anchorDef={name:"ɵand",moduleName:Zt},Jt.textDef={name:"ɵted",moduleName:Zt},Jt.directiveDef={name:"ɵdid",moduleName:Zt},Jt.providerDef={name:"ɵprd",moduleName:Zt},Jt.queryDef={name:"ɵqud",moduleName:Zt},Jt.pureArrayDef={name:"ɵpad",moduleName:Zt},Jt.pureObjectDef={name:"ɵpod",moduleName:Zt},Jt.purePipeDef={name:"ɵppd",moduleName:Zt},Jt.pipeDef={name:"ɵpid",moduleName:Zt},Jt.nodeValue={name:"ɵnov",moduleName:Zt},Jt.ngContentDef={name:"ɵncd",moduleName:Zt},Jt.unwrapValue={name:"ɵunv",moduleName:Zt},Jt.createRendererType2={name:"ɵcrt",moduleName:Zt},Jt.RendererType2={name:"RendererType2",moduleName:Zt},Jt.ViewDefinition={name:"ɵViewDefinition",moduleName:Zt},Jt.createComponentFactory={name:"ɵccf",moduleName:Zt},Jt.setClassMetadata={name:"ɵsetClassMetadata",moduleName:Zt};var nn=function(){function e(e,t,n){this.filePath=e,this.name=t,this.members=n}return e.prototype.assertNoMembers=function(){if(this.members.length)throw new Error("Illegal state: symbol without members expected, but got "+JSON.stringify(this)+".")},e}(),rn=function(){function e(){this.cache=new Map}return e.prototype.get=function(e,t,n){var r='"'+e+'".'+t+((n=n||[]).length?"."+n.join("."):""),i=this.cache.get(r);return i||(i=new nn(e,t,n),this.cache.set(r,i)),i},e}(),on=/-+([a-z0-9])/g;function sn(e,t){return an(e,":",t)}function an(e,t,n){var r=e.indexOf(t);return-1==r?n:[e.slice(0,r).trim(),e.slice(r+1).trim()]}function un(e,t,n){return Array.isArray(e)?t.visitArray(e,n):function r(e){return"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===En}(e)?t.visitStringMap(e,n):null==e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e?t.visitPrimitive(e,n):t.visitOther(e,n)}function pn(e){return null!=e}function ln(e){return void 0===e?null:e}var cn=function(){function e(){}return e.prototype.visitArray=function(e,t){var n=this;return e.map((function(e){return un(e,n,t)}))},e.prototype.visitStringMap=function(e,t){var n=this,r={};return Object.keys(e).forEach((function(i){r[i]=un(e[i],n,t)})),r},e.prototype.visitPrimitive=function(e,t){return e},e.prototype.visitOther=function(e,t){return e},e}(),hn=function(e){if(wn(e))throw new Error("Illegal state: value cannot be a promise");return e},fn=function(e,t){return wn(e)?e.then(t):t(e)},dn=function(e){return e.some(wn)?Promise.all(e):e};function vn(e){throw new Error("Internal Error: "+e)}function mn(e,t){var n=Error(e);return n[yn]=!0,t&&(n[gn]=t),n}var yn="ngSyntaxError",gn="ngParseErrors",En=Object.getPrototypeOf({});function _n(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=55296&&r<=56319&&e.length>n+1){var i=e.charCodeAt(n+1);i>=56320&&i<=57343&&(n++,r=(r-55296<<10)+i-56320+65536)}r<=127?t.push(r):r<=2047?t.push(r>>6&31|192,63&r|128):r<=65535?t.push(r>>12|224,r>>6&63|128,63&r|128):r<=2097151&&t.push(r>>18&7|240,r>>12&63|128,r>>6&63|128,63&r|128)}return t}function Sn(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(Sn).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return""+e.overriddenName;if(e.name)return""+e.name;if(!e.toString)return"object";var t=e.toString();if(null==t)return""+t;var n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function xn(e){return"function"==typeof e&&e.hasOwnProperty("__forward_ref__")?e():e}function wn(e){return!!e&&"function"==typeof e.then}var Cn=function Cn(e){this.full=e;var t=e.split(".");this.major=t[0],this.minor=t[1],this.patch=t.slice(2).join(".")},bn="undefined"!=typeof window&&window,Tn="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,Mn="undefined"!=typeof global&&global||bn||Tn;function Pn(e,t){for(var n=[],r=0;r<e;r++)n.push(t);return 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
     */
var Nn=/^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))|(\@[-\w]+)$/;function An(e){return e.replace(/\W/g,"_")}var In,kn=0;function On(e){if(!e||!e.reference)return null;var t=e.reference;if(t instanceof nn)return t.name;if(t.__anonymousType)return t.__anonymousType;var n=Sn(t);return n.indexOf("(")>=0?(n="anonymous_"+kn++,t.__anonymousType=n):n=An(n),n}function Rn(e){var t=e.reference;return t instanceof nn?t.filePath:"./"+Sn(t)}function Dn(e,t){return"View_"+On({reference:e})+"_"+t}function Fn(e){return"RenderType_"+On({reference:e})}function Ln(e){return"HostView_"+On({reference:e})}function Bn(e){return On({reference:e})+"NgFactory"}function Vn(e){return null!=e.value?An(e.value):On(e.identifier)}function jn(e){return null!=e.identifier?e.identifier.reference:e.value}(In=e.CompileSummaryKind||(e.CompileSummaryKind={}))[In.Pipe=0]="Pipe",In[In.Directive=1]="Directive",In[In.NgModule=2]="NgModule",In[In.Injectable=3]="Injectable";var Un=function Un(e){var t=void 0===e?{}:e,n=t.styles,r=t.styleUrls;this.moduleUrl=t.moduleUrl||null,this.styles=Xn(n),this.styleUrls=Xn(r)},Hn=function(){function e(e){var t=e.template,n=e.templateUrl,r=e.htmlAst,i=e.styles,o=e.styleUrls,s=e.externalStylesheets,a=e.animations,u=e.ngContentSelectors,p=e.interpolation,l=e.isInline,c=e.preserveWhitespaces;if(this.encapsulation=e.encapsulation,this.template=t,this.templateUrl=n,this.htmlAst=r,this.styles=Xn(i),this.styleUrls=Xn(o),this.externalStylesheets=Xn(s),this.animations=a?$n(a):[],this.ngContentSelectors=u||[],p&&2!=p.length)throw new Error("'interpolation' should have a start and an end symbol.");this.interpolation=p,this.isInline=l,this.preserveWhitespaces=c}return e.prototype.toSummary=function(){return{ngContentSelectors:this.ngContentSelectors,encapsulation:this.encapsulation,styles:this.styles,animations:this.animations}},e}(),qn=function(){function t(e){var t=e.type,n=e.isComponent,r=e.selector,i=e.exportAs,o=e.changeDetection,s=e.inputs,a=e.outputs,u=e.hostListeners,p=e.hostProperties,l=e.hostAttributes,c=e.providers,h=e.viewProviders,f=e.queries,d=e.guards,v=e.viewQueries,m=e.entryComponents,y=e.template,g=e.componentViewType,E=e.rendererType,_=e.componentFactory;this.isHost=!!e.isHost,this.type=t,this.isComponent=n,this.selector=r,this.exportAs=i,this.changeDetection=o,this.inputs=s,this.outputs=a,this.hostListeners=u,this.hostProperties=p,this.hostAttributes=l,this.providers=Xn(c),this.viewProviders=Xn(h),this.queries=Xn(f),this.guards=d,this.viewQueries=Xn(v),this.entryComponents=Xn(m),this.template=y,this.componentViewType=g,this.rendererType=E,this.componentFactory=_}return t.create=function(e){var n=e.isHost,r=e.type,i=e.isComponent,o=e.selector,s=e.exportAs,a=e.changeDetection,u=e.inputs,p=e.outputs,l=e.host,c=e.providers,h=e.viewProviders,f=e.queries,d=e.guards,v=e.viewQueries,m=e.entryComponents,y=e.template,g=e.componentViewType,E=e.rendererType,_=e.componentFactory,S={},x={},w={};null!=l&&Object.keys(l).forEach((function(e){var t=l[e],n=e.match(Nn);null===n?w[e]=t:null!=n[1]?x[n[1]]=t:null!=n[2]&&(S[n[2]]=t)}));var C={};null!=u&&u.forEach((function(e){var t=sn(e,[e,e]);C[t[0]]=t[1]}));var b={};return null!=p&&p.forEach((function(e){var t=sn(e,[e,e]);b[t[0]]=t[1]})),new t({isHost:n,type:r,isComponent:!!i,selector:o,exportAs:s,changeDetection:a,inputs:C,outputs:b,hostListeners:S,hostProperties:x,hostAttributes:w,providers:c,viewProviders:h,queries:f,guards:d,viewQueries:v,entryComponents:m,template:y,componentViewType:g,rendererType:E,componentFactory:_})},t.prototype.toSummary=function(){return{summaryKind:e.CompileSummaryKind.Directive,type:this.type,isComponent:this.isComponent,selector:this.selector,exportAs:this.exportAs,inputs:this.inputs,outputs:this.outputs,hostListeners:this.hostListeners,hostProperties:this.hostProperties,hostAttributes:this.hostAttributes,providers:this.providers,viewProviders:this.viewProviders,queries:this.queries,guards:this.guards,viewQueries:this.viewQueries,entryComponents:this.entryComponents,changeDetection:this.changeDetection,template:this.template&&this.template.toSummary(),componentViewType:this.componentViewType,rendererType:this.rendererType,componentFactory:this.componentFactory}},t}(),Wn=function(){function t(e){var t=e.name,n=e.pure;this.type=e.type,this.name=t,this.pure=!!n}return t.prototype.toSummary=function(){return{summaryKind:e.CompileSummaryKind.Pipe,type:this.type,name:this.name,pure:this.pure}},t}(),zn=function zn(){},Kn=function(){function t(e){var t=e.providers,n=e.declaredDirectives,r=e.exportedDirectives,i=e.declaredPipes,o=e.exportedPipes,s=e.entryComponents,a=e.bootstrapComponents,u=e.importedModules,p=e.exportedModules,l=e.schemas,c=e.transitiveModule,h=e.id;this.type=e.type||null,this.declaredDirectives=Xn(n),this.exportedDirectives=Xn(r),this.declaredPipes=Xn(i),this.exportedPipes=Xn(o),this.providers=Xn(t),this.entryComponents=Xn(s),this.bootstrapComponents=Xn(a),this.importedModules=Xn(u),this.exportedModules=Xn(p),this.schemas=Xn(l),this.id=h||null,this.transitiveModule=c||null}return t.prototype.toSummary=function(){var t=this.transitiveModule;return{summaryKind:e.CompileSummaryKind.NgModule,type:this.type,entryComponents:t.entryComponents,providers:t.providers,modules:t.modules,exportedDirectives:t.exportedDirectives,exportedPipes:t.exportedPipes}},t}(),Qn=function(){function e(){this.directivesSet=new Set,this.directives=[],this.exportedDirectivesSet=new Set,this.exportedDirectives=[],this.pipesSet=new Set,this.pipes=[],this.exportedPipesSet=new Set,this.exportedPipes=[],this.modulesSet=new Set,this.modules=[],this.entryComponentsSet=new Set,this.entryComponents=[],this.providers=[]}return e.prototype.addProvider=function(e,t){this.providers.push({provider:e,module:t})},e.prototype.addDirective=function(e){this.directivesSet.has(e.reference)||(this.directivesSet.add(e.reference),this.directives.push(e))},e.prototype.addExportedDirective=function(e){this.exportedDirectivesSet.has(e.reference)||(this.exportedDirectivesSet.add(e.reference),this.exportedDirectives.push(e))},e.prototype.addPipe=function(e){this.pipesSet.has(e.reference)||(this.pipesSet.add(e.reference),this.pipes.push(e))},e.prototype.addExportedPipe=function(e){this.exportedPipesSet.has(e.reference)||(this.exportedPipesSet.add(e.reference),this.exportedPipes.push(e))},e.prototype.addModule=function(e){this.modulesSet.has(e.reference)||(this.modulesSet.add(e.reference),this.modules.push(e))},e.prototype.addEntryComponent=function(e){this.entryComponentsSet.has(e.componentType)||(this.entryComponentsSet.add(e.componentType),this.entryComponents.push(e))},e}();function Xn(e){return e||[]}var Gn=function Gn(e,t){var n=t.useClass,r=t.useValue,i=t.useExisting,o=t.useFactory,s=t.deps,a=t.multi;this.token=e,this.useClass=n||null,this.useValue=r,this.useExisting=i,this.useFactory=o||null,this.dependencies=s||null,this.multi=!!a};function $n(e){return e.reduce((function(e,t){var n=Array.isArray(t)?$n(t):t;return e.concat(n)}),[])}function Yn(e){return e.replace(/(\w+:\/\/[\w:-]+)?(\/+)?/,"ng:///")}function Jn(e,t,n){var r;return r=n.isInline?t.type.reference instanceof nn?t.type.reference.filePath+"."+t.type.reference.name+".html":On(e)+"/"+On(t.type)+".html":n.templateUrl,t.type.reference instanceof nn?r:Yn(r)}function Zn(e,t){var n=e.moduleUrl.split(/\/\\/g);return Yn("css/"+t+n[n.length-1]+".ngstyle.js")}function er(e){return Yn(On(e.type)+"/module.ngfactory.js")}function tr(e,t){return Yn(On(e)+"/"+On(t.type)+".ngfactory.js")}
/**
     * @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 nr="@angular/core",rr=function Jt(){};rr.NEW_METHOD="factory",rr.TRANSFORM_METHOD="transform",rr.PATCH_DEPS="patchedDeps",rr.core={name:null,moduleName:nr},rr.namespaceHTML={name:"ɵɵnamespaceHTML",moduleName:nr},rr.namespaceMathML={name:"ɵɵnamespaceMathML",moduleName:nr},rr.namespaceSVG={name:"ɵɵnamespaceSVG",moduleName:nr},rr.element={name:"ɵɵelement",moduleName:nr},rr.elementStart={name:"ɵɵelementStart",moduleName:nr},rr.elementEnd={name:"ɵɵelementEnd",moduleName:nr},rr.advance={name:"ɵɵadvance",moduleName:nr},rr.syntheticHostProperty={name:"ɵɵsyntheticHostProperty",moduleName:nr},rr.syntheticHostListener={name:"ɵɵsyntheticHostListener",moduleName:nr},rr.attribute={name:"ɵɵattribute",moduleName:nr},rr.attributeInterpolate1={name:"ɵɵattributeInterpolate1",moduleName:nr},rr.attributeInterpolate2={name:"ɵɵattributeInterpolate2",moduleName:nr},rr.attributeInterpolate3={name:"ɵɵattributeInterpolate3",moduleName:nr},rr.attributeInterpolate4={name:"ɵɵattributeInterpolate4",moduleName:nr},rr.attributeInterpolate5={name:"ɵɵattributeInterpolate5",moduleName:nr},rr.attributeInterpolate6={name:"ɵɵattributeInterpolate6",moduleName:nr},rr.attributeInterpolate7={name:"ɵɵattributeInterpolate7",moduleName:nr},rr.attributeInterpolate8={name:"ɵɵattributeInterpolate8",moduleName:nr},rr.attributeInterpolateV={name:"ɵɵattributeInterpolateV",moduleName:nr},rr.classProp={name:"ɵɵclassProp",moduleName:nr},rr.elementContainerStart={name:"ɵɵelementContainerStart",moduleName:nr},rr.elementContainerEnd={name:"ɵɵelementContainerEnd",moduleName:nr},rr.elementContainer={name:"ɵɵelementContainer",moduleName:nr},rr.styleMap={name:"ɵɵstyleMap",moduleName:nr},rr.styleMapInterpolate1={name:"ɵɵstyleMapInterpolate1",moduleName:nr},rr.styleMapInterpolate2={name:"ɵɵstyleMapInterpolate2",moduleName:nr},rr.styleMapInterpolate3={name:"ɵɵstyleMapInterpolate3",moduleName:nr},rr.styleMapInterpolate4={name:"ɵɵstyleMapInterpolate4",moduleName:nr},rr.styleMapInterpolate5={name:"ɵɵstyleMapInterpolate5",moduleName:nr},rr.styleMapInterpolate6={name:"ɵɵstyleMapInterpolate6",moduleName:nr},rr.styleMapInterpolate7={name:"ɵɵstyleMapInterpolate7",moduleName:nr},rr.styleMapInterpolate8={name:"ɵɵstyleMapInterpolate8",moduleName:nr},rr.styleMapInterpolateV={name:"ɵɵstyleMapInterpolateV",moduleName:nr},rr.classMap={name:"ɵɵclassMap",moduleName:nr},rr.classMapInterpolate1={name:"ɵɵclassMapInterpolate1",moduleName:nr},rr.classMapInterpolate2={name:"ɵɵclassMapInterpolate2",moduleName:nr},rr.classMapInterpolate3={name:"ɵɵclassMapInterpolate3",moduleName:nr},rr.classMapInterpolate4={name:"ɵɵclassMapInterpolate4",moduleName:nr},rr.classMapInterpolate5={name:"ɵɵclassMapInterpolate5",moduleName:nr},rr.classMapInterpolate6={name:"ɵɵclassMapInterpolate6",moduleName:nr},rr.classMapInterpolate7={name:"ɵɵclassMapInterpolate7",moduleName:nr},rr.classMapInterpolate8={name:"ɵɵclassMapInterpolate8",moduleName:nr},rr.classMapInterpolateV={name:"ɵɵclassMapInterpolateV",moduleName:nr},rr.styleProp={name:"ɵɵstyleProp",moduleName:nr},rr.stylePropInterpolate1={name:"ɵɵstylePropInterpolate1",moduleName:nr},rr.stylePropInterpolate2={name:"ɵɵstylePropInterpolate2",moduleName:nr},rr.stylePropInterpolate3={name:"ɵɵstylePropInterpolate3",moduleName:nr},rr.stylePropInterpolate4={name:"ɵɵstylePropInterpolate4",moduleName:nr},rr.stylePropInterpolate5={name:"ɵɵstylePropInterpolate5",moduleName:nr},rr.stylePropInterpolate6={name:"ɵɵstylePropInterpolate6",moduleName:nr},rr.stylePropInterpolate7={name:"ɵɵstylePropInterpolate7",moduleName:nr},rr.stylePropInterpolate8={name:"ɵɵstylePropInterpolate8",moduleName:nr},rr.stylePropInterpolateV={name:"ɵɵstylePropInterpolateV",moduleName:nr},rr.nextContext={name:"ɵɵnextContext",moduleName:nr},rr.templateCreate={name:"ɵɵtemplate",moduleName:nr},rr.text={name:"ɵɵtext",moduleName:nr},rr.enableBindings={name:"ɵɵenableBindings",moduleName:nr},rr.disableBindings={name:"ɵɵdisableBindings",moduleName:nr},rr.getCurrentView={name:"ɵɵgetCurrentView",moduleName:nr},rr.textInterpolate={name:"ɵɵtextInterpolate",moduleName:nr},rr.textInterpolate1={name:"ɵɵtextInterpolate1",moduleName:nr},rr.textInterpolate2={name:"ɵɵtextInterpolate2",moduleName:nr},rr.textInterpolate3={name:"ɵɵtextInterpolate3",moduleName:nr},rr.textInterpolate4={name:"ɵɵtextInterpolate4",moduleName:nr},rr.textInterpolate5={name:"ɵɵtextInterpolate5",moduleName:nr},rr.textInterpolate6={name:"ɵɵtextInterpolate6",moduleName:nr},rr.textInterpolate7={name:"ɵɵtextInterpolate7",moduleName:nr},rr.textInterpolate8={name:"ɵɵtextInterpolate8",moduleName:nr},rr.textInterpolateV={name:"ɵɵtextInterpolateV",moduleName:nr},rr.restoreView={name:"ɵɵrestoreView",moduleName:nr},rr.pureFunction0={name:"ɵɵpureFunction0",moduleName:nr},rr.pureFunction1={name:"ɵɵpureFunction1",moduleName:nr},rr.pureFunction2={name:"ɵɵpureFunction2",moduleName:nr},rr.pureFunction3={name:"ɵɵpureFunction3",moduleName:nr},rr.pureFunction4={name:"ɵɵpureFunction4",moduleName:nr},rr.pureFunction5={name:"ɵɵpureFunction5",moduleName:nr},rr.pureFunction6={name:"ɵɵpureFunction6",moduleName:nr},rr.pureFunction7={name:"ɵɵpureFunction7",moduleName:nr},rr.pureFunction8={name:"ɵɵpureFunction8",moduleName:nr},rr.pureFunctionV={name:"ɵɵpureFunctionV",moduleName:nr},rr.pipeBind1={name:"ɵɵpipeBind1",moduleName:nr},rr.pipeBind2={name:"ɵɵpipeBind2",moduleName:nr},rr.pipeBind3={name:"ɵɵpipeBind3",moduleName:nr},rr.pipeBind4={name:"ɵɵpipeBind4",moduleName:nr},rr.pipeBindV={name:"ɵɵpipeBindV",moduleName:nr},rr.hostProperty={name:"ɵɵhostProperty",moduleName:nr},rr.property={name:"ɵɵproperty",moduleName:nr},rr.propertyInterpolate={name:"ɵɵpropertyInterpolate",moduleName:nr},rr.propertyInterpolate1={name:"ɵɵpropertyInterpolate1",moduleName:nr},rr.propertyInterpolate2={name:"ɵɵpropertyInterpolate2",moduleName:nr},rr.propertyInterpolate3={name:"ɵɵpropertyInterpolate3",moduleName:nr},rr.propertyInterpolate4={name:"ɵɵpropertyInterpolate4",moduleName:nr},rr.propertyInterpolate5={name:"ɵɵpropertyInterpolate5",moduleName:nr},rr.propertyInterpolate6={name:"ɵɵpropertyInterpolate6",moduleName:nr},rr.propertyInterpolate7={name:"ɵɵpropertyInterpolate7",moduleName:nr},rr.propertyInterpolate8={name:"ɵɵpropertyInterpolate8",moduleName:nr},rr.propertyInterpolateV={name:"ɵɵpropertyInterpolateV",moduleName:nr},rr.i18n={name:"ɵɵi18n",moduleName:nr},rr.i18nAttributes={name:"ɵɵi18nAttributes",moduleName:nr},rr.i18nExp={name:"ɵɵi18nExp",moduleName:nr},rr.i18nStart={name:"ɵɵi18nStart",moduleName:nr},rr.i18nEnd={name:"ɵɵi18nEnd",moduleName:nr},rr.i18nApply={name:"ɵɵi18nApply",moduleName:nr},rr.i18nPostprocess={name:"ɵɵi18nPostprocess",moduleName:nr},rr.pipe={name:"ɵɵpipe",moduleName:nr},rr.projection={name:"ɵɵprojection",moduleName:nr},rr.projectionDef={name:"ɵɵprojectionDef",moduleName:nr},rr.reference={name:"ɵɵreference",moduleName:nr},rr.inject={name:"ɵɵinject",moduleName:nr},rr.injectAttribute={name:"ɵɵinjectAttribute",moduleName:nr},rr.injectPipeChangeDetectorRef={name:"ɵɵinjectPipeChangeDetectorRef",moduleName:nr},rr.directiveInject={name:"ɵɵdirectiveInject",moduleName:nr},rr.invalidFactory={name:"ɵɵinvalidFactory",moduleName:nr},rr.invalidFactoryDep={name:"ɵɵinvalidFactoryDep",moduleName:nr},rr.templateRefExtractor={name:"ɵɵtemplateRefExtractor",moduleName:nr},rr.forwardRef={name:"forwardRef",moduleName:nr},rr.resolveForwardRef={name:"resolveForwardRef",moduleName:nr},rr.resolveWindow={name:"ɵɵresolveWindow",moduleName:nr},rr.resolveDocument={name:"ɵɵresolveDocument",moduleName:nr},rr.resolveBody={name:"ɵɵresolveBody",moduleName:nr},rr.defineComponent={name:"ɵɵdefineComponent",moduleName:nr},rr.declareComponent={name:"ɵɵngDeclareComponent",moduleName:nr},rr.setComponentScope={name:"ɵɵsetComponentScope",moduleName:nr},rr.ChangeDetectionStrategy={name:"ChangeDetectionStrategy",moduleName:nr},rr.ViewEncapsulation={name:"ViewEncapsulation",moduleName:nr},rr.ComponentDefWithMeta={name:"ɵɵComponentDefWithMeta",moduleName:nr},rr.FactoryDef={name:"ɵɵFactoryDef",moduleName:nr},rr.defineDirective={name:"ɵɵdefineDirective",moduleName:nr},rr.declareDirective={name:"ɵɵngDeclareDirective",moduleName:nr},rr.DirectiveDefWithMeta={name:"ɵɵDirectiveDefWithMeta",moduleName:nr},rr.InjectorDef={name:"ɵɵInjectorDef",moduleName:nr},rr.defineInjector={name:"ɵɵdefineInjector",moduleName:nr},rr.NgModuleDefWithMeta={name:"ɵɵNgModuleDefWithMeta",moduleName:nr},rr.ModuleWithProviders={name:"ModuleWithProviders",moduleName:nr},rr.defineNgModule={name:"ɵɵdefineNgModule",moduleName:nr},rr.setNgModuleScope={name:"ɵɵsetNgModuleScope",moduleName:nr},rr.PipeDefWithMeta={name:"ɵɵPipeDefWithMeta",moduleName:nr},rr.definePipe={name:"ɵɵdefinePipe",moduleName:nr},rr.declarePipe={name:"ɵɵngDeclarePipe",moduleName:nr},rr.queryRefresh={name:"ɵɵqueryRefresh",moduleName:nr},rr.viewQuery={name:"ɵɵviewQuery",moduleName:nr},rr.loadQuery={name:"ɵɵloadQuery",moduleName:nr},rr.contentQuery={name:"ɵɵcontentQuery",moduleName:nr},rr.NgOnChangesFeature={name:"ɵɵNgOnChangesFeature",moduleName:nr},rr.InheritDefinitionFeature={name:"ɵɵInheritDefinitionFeature",moduleName:nr},rr.CopyDefinitionFeature={name:"ɵɵCopyDefinitionFeature",moduleName:nr},rr.ProvidersFeature={name:"ɵɵProvidersFeature",moduleName:nr},rr.listener={name:"ɵɵlistener",moduleName:nr},rr.getInheritedFactory={name:"ɵɵgetInheritedFactory",moduleName:nr},rr.sanitizeHtml={name:"ɵɵsanitizeHtml",moduleName:nr},rr.sanitizeStyle={name:"ɵɵsanitizeStyle",moduleName:nr},rr.sanitizeResourceUrl={name:"ɵɵsanitizeResourceUrl",moduleName:nr},rr.sanitizeScript={name:"ɵɵsanitizeScript",moduleName:nr},rr.sanitizeUrl={name:"ɵɵsanitizeUrl",moduleName:nr},rr.sanitizeUrlOrResourceUrl={name:"ɵɵsanitizeUrlOrResourceUrl",moduleName:nr},rr.trustConstantHtml={name:"ɵɵtrustConstantHtml",moduleName:nr},rr.trustConstantResourceUrl={name:"ɵɵtrustConstantResourceUrl",moduleName:nr};
/**
     * @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 ir=function(){function e(e){void 0===e&&(e=null),this.file=e,this.sourcesContent=new Map,this.lines=[],this.lastCol0=0,this.hasMappings=!1}return e.prototype.addSource=function(e,t){return void 0===t&&(t=null),this.sourcesContent.has(e)||this.sourcesContent.set(e,t),this},e.prototype.addLine=function(){return this.lines.push([]),this.lastCol0=0,this},e.prototype.addMapping=function(e,t,n,r){if(!this.currentLine)throw new Error("A line must be added before mappings can be added");if(null!=t&&!this.sourcesContent.has(t))throw new Error('Unknown source file "'+t+'"');if(null==e)throw new Error("The column in the generated code must be provided");if(e<this.lastCol0)throw new Error("Mapping should be added in output order");if(t&&(null==n||null==r))throw new Error("The source location must be provided when a source url is provided");return this.hasMappings=!0,this.lastCol0=e,this.currentLine.push({col0:e,sourceUrl:t,sourceLine0:n,sourceCol0:r}),this},Object.defineProperty(e.prototype,"currentLine",{get:function(){return this.lines.slice(-1)[0]},enumerable:!1,configurable:!0}),e.prototype.toJSON=function(){var e=this;if(!this.hasMappings)return null;var t=new Map,n=[],r=[];Array.from(this.sourcesContent.keys()).forEach((function(i,o){t.set(i,o),n.push(i),r.push(e.sourcesContent.get(i)||null)}));var i="",o=0,s=0,a=0,u=0;return this.lines.forEach((function(e){o=0,i+=e.map((function(e){var n=or(e.col0-o);return o=e.col0,null!=e.sourceUrl&&(n+=or(t.get(e.sourceUrl)-s),s=t.get(e.sourceUrl),n+=or(e.sourceLine0-a),a=e.sourceLine0,n+=or(e.sourceCol0-u),u=e.sourceCol0),n})).join(","),i+=";"})),i=i.slice(0,-1),{file:this.file||"",version:3,sourceRoot:"",sources:n,sourcesContent:r,mappings:i}},e.prototype.toJsComment=function(){return this.hasMappings?"//# sourceMappingURL=data:application/json;base64,"+function e(t){for(var n="",r=_n(t),i=0;i<r.length;){var o=r[i++],s=i<r.length?r[i++]:null,a=i<r.length?r[i++]:null;n+=sr(o>>2),n+=sr((3&o)<<4|(null===s?0:s>>4)),n+=null===s?"=":sr((15&s)<<2|(null===a?0:a>>6)),n+=null===s||null===a?"=":sr(63&a)}return n}(JSON.stringify(this,null,0)):""},e}();function or(e){e=e<0?1+(-e<<1):e<<1;var t="";do{var n=31&e;(e>>=5)>0&&(n|=32),t+=sr(n)}while(e>0);return t}function sr(e){if(e<0||e>=64)throw new Error("Can only encode value in the range [0, 63]");return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[e]}var ar=/'|\\|\n|\r|\$/g,ur=/^[$A-Z_][0-9A-Z_$]*$/i,pr=It("error",null,null),lr=It("stack",null,null),cr=function cr(e){this.indent=e,this.partsLength=0,this.parts=[],this.srcSpans=[]},hr=function(){function e(e){this._indent=e,this._classes=[],this._preambleLineCount=0,this._lines=[new cr(e)]}return e.createRoot=function(){return new e(0)},Object.defineProperty(e.prototype,"_currentLine",{get:function(){return this._lines[this._lines.length-1]},enumerable:!1,configurable:!0}),e.prototype.println=function(e,t){void 0===t&&(t=""),this.print(e||null,t,!0)},e.prototype.lineIsEmpty=function(){return 0===this._currentLine.parts.length},e.prototype.lineLength=function(){return this._currentLine.indent*"  ".length+this._currentLine.partsLength},e.prototype.print=function(e,t,n){void 0===n&&(n=!1),t.length>0&&(this._currentLine.parts.push(t),this._currentLine.partsLength+=t.length,this._currentLine.srcSpans.push(e&&e.sourceSpan||null)),n&&this._lines.push(new cr(this._indent))},e.prototype.removeEmptyLastLine=function(){this.lineIsEmpty()&&this._lines.pop()},e.prototype.incIndent=function(){this._indent++,this.lineIsEmpty()&&(this._currentLine.indent=this._indent)},e.prototype.decIndent=function(){this._indent--,this.lineIsEmpty()&&(this._currentLine.indent=this._indent)},e.prototype.pushClass=function(e){this._classes.push(e)},e.prototype.popClass=function(){return this._classes.pop()},Object.defineProperty(e.prototype,"currentClass",{get:function(){return this._classes.length>0?this._classes[this._classes.length-1]:null},enumerable:!1,configurable:!0}),e.prototype.toSource=function(){return this.sourceLines.map((function(e){return e.parts.length>0?vr(e.indent)+e.parts.join(""):""})).join("\n")},e.prototype.toSourceMapGenerator=function(e,t){void 0===t&&(t=0);for(var n=new ir(e),r=!1,i=function(){r||(n.addSource(e," ").addMapping(0,e,0,0),r=!0)},o=0;o<t;o++)n.addLine(),i();return this.sourceLines.forEach((function(e,t){n.addLine();for(var o=e.srcSpans,s=e.parts,a=e.indent*"  ".length,u=0;u<o.length&&!o[u];)a+=s[u].length,u++;for(u<o.length&&0===t&&0===a?r=!0:i();u<o.length;){var p=o[u],l=p.start.file,c=p.start.line,h=p.start.col;for(n.addSource(l.url,l.content).addMapping(a,l.url,c,h),a+=s[u].length,u++;u<o.length&&(p===o[u]||!o[u]);)a+=s[u].length,u++}})),n},e.prototype.setPreambleLineCount=function(e){return this._preambleLineCount=e},e.prototype.spanOf=function(e,t){var n=this._lines[e-this._preambleLineCount];if(n)for(var r=t-vr(n.indent).length,i=0;i<n.parts.length;i++){var o=n.parts[i];if(o.length>r)return n.srcSpans[i];r-=o.length}return null},Object.defineProperty(e.prototype,"sourceLines",{get:function(){return this._lines.length&&0===this._lines[this._lines.length-1].parts.length?this._lines.slice(0,-1):this._lines},enumerable:!1,configurable:!0}),e}(),fr=function(){function t(e){this._escapeDollarInStrings=e}return t.prototype.printLeadingComments=function(e,t){var n,r;if(void 0!==e.leadingComments)try{for(var o=i(e.leadingComments),s=o.next();!s.done;s=o.next()){var a=s.value;a instanceof ut?t.print(e,"/*"+a.toString()+"*/",a.trailingNewline):a.multiline?t.print(e,"/* "+a.text+" */",a.trailingNewline):a.text.split("\n").forEach((function(n){t.println(e,"// "+n)}))}}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}},t.prototype.visitExpressionStmt=function(e,t){return this.printLeadingComments(e,t),e.expr.visitExpression(this,t),t.println(e,";"),null},t.prototype.visitReturnStmt=function(e,t){return this.printLeadingComments(e,t),t.print(e,"return "),e.value.visitExpression(this,t),t.println(e,";"),null},t.prototype.visitIfStmt=function(e,t){this.printLeadingComments(e,t),t.print(e,"if ("),e.condition.visitExpression(this,t),t.print(e,") {");var n=null!=e.falseCase&&e.falseCase.length>0;return e.trueCase.length<=1&&!n?(t.print(e," "),this.visitAllStatements(e.trueCase,t),t.removeEmptyLastLine(),t.print(e," ")):(t.println(),t.incIndent(),this.visitAllStatements(e.trueCase,t),t.decIndent(),n&&(t.println(e,"} else {"),t.incIndent(),this.visitAllStatements(e.falseCase,t),t.decIndent())),t.println(e,"}"),null},t.prototype.visitThrowStmt=function(e,t){return this.printLeadingComments(e,t),t.print(e,"throw "),e.error.visitExpression(this,t),t.println(e,";"),null},t.prototype.visitWriteVarExpr=function(e,t){var n=t.lineIsEmpty();return n||t.print(e,"("),t.print(e,e.name+" = "),e.value.visitExpression(this,t),n||t.print(e,")"),null},t.prototype.visitWriteKeyExpr=function(e,t){var n=t.lineIsEmpty();return n||t.print(e,"("),e.receiver.visitExpression(this,t),t.print(e,"["),e.index.visitExpression(this,t),t.print(e,"] = "),e.value.visitExpression(this,t),n||t.print(e,")"),null},t.prototype.visitWritePropExpr=function(e,t){var n=t.lineIsEmpty();return n||t.print(e,"("),e.receiver.visitExpression(this,t),t.print(e,"."+e.name+" = "),e.value.visitExpression(this,t),n||t.print(e,")"),null},t.prototype.visitInvokeMethodExpr=function(e,t){e.receiver.visitExpression(this,t);var n=e.name;return null!=e.builtin&&null==(n=this.getBuiltinMethodName(e.builtin))||(t.print(e,"."+n+"("),this.visitAllExpressions(e.args,t,","),t.print(e,")")),null},t.prototype.visitInvokeFunctionExpr=function(e,t){return e.fn.visitExpression(this,t),t.print(e,"("),this.visitAllExpressions(e.args,t,","),t.print(e,")"),null},t.prototype.visitTaggedTemplateExpr=function(e,t){e.tag.visitExpression(this,t),t.print(e,"`"+e.template.elements[0].rawText);for(var n=1;n<e.template.elements.length;n++)t.print(e,"${"),e.template.expressions[n-1].visitExpression(this,t),t.print(e,"}"+e.template.elements[n].rawText);return t.print(e,"`"),null},t.prototype.visitWrappedNodeExpr=function(e,t){throw new Error("Abstract emitter cannot visit WrappedNodeExpr.")},t.prototype.visitTypeofExpr=function(e,t){t.print(e,"typeof "),e.expr.visitExpression(this,t)},t.prototype.visitReadVarExpr=function(t,n){var r=t.name;if(null!=t.builtin)switch(t.builtin){case e.BuiltinVar.Super:r="super";break;case e.BuiltinVar.This:r="this";break;case e.BuiltinVar.CatchError:r=pr.name;break;case e.BuiltinVar.CatchStack:r=lr.name;break;default:throw new Error("Unknown builtin variable "+t.builtin)}return n.print(t,r),null},t.prototype.visitInstantiateExpr=function(e,t){return t.print(e,"new "),e.classExpr.visitExpression(this,t),t.print(e,"("),this.visitAllExpressions(e.args,t,","),t.print(e,")"),null},t.prototype.visitLiteralExpr=function(e,t){var n=e.value;return t.print(e,"string"==typeof n?dr(n,this._escapeDollarInStrings):""+n),null},t.prototype.visitLocalizedString=function(e,t){var n=e.serializeI18nHead();t.print(e,"$localize `"+n.raw);for(var r=1;r<e.messageParts.length;r++)t.print(e,"${"),e.expressions[r-1].visitExpression(this,t),t.print(e,"}"+e.serializeI18nTemplatePart(r).raw);return t.print(e,"`"),null},t.prototype.visitConditionalExpr=function(e,t){return t.print(e,"("),e.condition.visitExpression(this,t),t.print(e,"? "),e.trueCase.visitExpression(this,t),t.print(e,": "),e.falseCase.visitExpression(this,t),t.print(e,")"),null},t.prototype.visitNotExpr=function(e,t){return t.print(e,"!"),e.condition.visitExpression(this,t),null},t.prototype.visitAssertNotNullExpr=function(e,t){return e.condition.visitExpression(this,t),null},t.prototype.visitUnaryOperatorExpr=function(t,n){var r;switch(t.operator){case e.UnaryOperator.Plus:r="+";break;case e.UnaryOperator.Minus:r="-";break;default:throw new Error("Unknown operator "+t.operator)}return t.parens&&n.print(t,"("),n.print(t,r),t.expr.visitExpression(this,n),t.parens&&n.print(t,")"),null},t.prototype.visitBinaryOperatorExpr=function(t,n){var r;switch(t.operator){case e.BinaryOperator.Equals:r="==";break;case e.BinaryOperator.Identical:r="===";break;case e.BinaryOperator.NotEquals:r="!=";break;case e.BinaryOperator.NotIdentical:r="!==";break;case e.BinaryOperator.And:r="&&";break;case e.BinaryOperator.BitwiseAnd:r="&";break;case e.BinaryOperator.Or:r="||";break;case e.BinaryOperator.Plus:r="+";break;case e.BinaryOperator.Minus:r="-";break;case e.BinaryOperator.Divide:r="/";break;case e.BinaryOperator.Multiply:r="*";break;case e.BinaryOperator.Modulo:r="%";break;case e.BinaryOperator.Lower:r="<";break;case e.BinaryOperator.LowerEquals:r="<=";break;case e.BinaryOperator.Bigger:r=">";break;case e.BinaryOperator.BiggerEquals:r=">=";break;default:throw new Error("Unknown operator "+t.operator)}return t.parens&&n.print(t,"("),t.lhs.visitExpression(this,n),n.print(t," "+r+" "),t.rhs.visitExpression(this,n),t.parens&&n.print(t,")"),null},t.prototype.visitReadPropExpr=function(e,t){return e.receiver.visitExpression(this,t),t.print(e,"."),t.print(e,e.name),null},t.prototype.visitReadKeyExpr=function(e,t){return e.receiver.visitExpression(this,t),t.print(e,"["),e.index.visitExpression(this,t),t.print(e,"]"),null},t.prototype.visitLiteralArrayExpr=function(e,t){return t.print(e,"["),this.visitAllExpressions(e.entries,t,","),t.print(e,"]"),null},t.prototype.visitLiteralMapExpr=function(e,t){var n=this;return t.print(e,"{"),this.visitAllObjects((function(r){t.print(e,dr(r.key,n._escapeDollarInStrings,r.quoted)+":"),r.value.visitExpression(n,t)}),e.entries,t,","),t.print(e,"}"),null},t.prototype.visitCommaExpr=function(e,t){return t.print(e,"("),this.visitAllExpressions(e.parts,t,","),t.print(e,")"),null},t.prototype.visitAllExpressions=function(e,t,n){var r=this;this.visitAllObjects((function(e){return e.visitExpression(r,t)}),e,t,n)},t.prototype.visitAllObjects=function(e,t,n,r){for(var i=!1,o=0;o<t.length;o++)o>0&&(n.lineLength()>80?(n.print(null,r,!0),i||(n.incIndent(),n.incIndent(),i=!0)):n.print(null,r,!1)),e(t[o]);i&&(n.decIndent(),n.decIndent())},t.prototype.visitAllStatements=function(e,t){var n=this;e.forEach((function(e){return e.visitStatement(n,t)}))},t}();function dr(e,t,n){if(void 0===n&&(n=!0),null==e)return null;var r=e.replace(ar,(function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return"$"==e[0]?t?"\\$":"$":"\n"==e[0]?"\\n":"\r"==e[0]?"\\r":"\\"+e[0]}));return n||!ur.test(r)?"'"+r+"'":r}function vr(e){for(var t="",n=0;n<e;n++)t+="  ";return t}
/**
     * @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 mr(e){return Lt(Object.keys(e).map((function(t){return{key:t,value:e[t],quoted:!1}})))}function yr(e,t){if(0===t)return Rt(e);for(var n=[],r=0;r<t;r++)n.push(pe);return Rt(e,void 0,n)}function gr(e){return"@"+e}function Er(e,t){var n=dr(t,!1,!1);return n!==t?e+"["+n+"]":e+"."+t}function _r(e,t){return"animation_"+e+"_"+t}function Sr(t,n){var r=new qe({name:t,moduleName:null}),i=new Je(e.BinaryOperator.Identical,new xe(r),Ut("undefined")),o=new Je(e.BinaryOperator.Or,i,r,void 0,void 0,!0);return new Je(e.BinaryOperator.And,o,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
     */
var xr=function(){function e(e,t){this.value=e,this.sourceSpan=t}return e.prototype.visit=function(e){throw new Error("visit() not implemented for Comment")},e}(),wr=function(){function e(e,t){this.value=e,this.sourceSpan=t}return e.prototype.visit=function(e){return e.visitText(this)},e}(),Cr=function(){function e(e,t,n){this.value=e,this.sourceSpan=t,this.i18n=n}return e.prototype.visit=function(e){return e.visitBoundText(this)},e}(),br=function(){function e(e,t,n,r,i,o){this.name=e,this.value=t,this.sourceSpan=n,this.keySpan=r,this.valueSpan=i,this.i18n=o}return e.prototype.visit=function(e){return e.visitTextAttribute(this)},e}(),Tr=function(){function e(e,t,n,r,i,o,s,a,u){this.name=e,this.type=t,this.securityContext=n,this.value=r,this.unit=i,this.sourceSpan=o,this.keySpan=s,this.valueSpan=a,this.i18n=u}return e.fromBoundElementProperty=function(t,n){if(void 0===t.keySpan)throw new Error("Unexpected state: keySpan must be defined for bound attributes but was not for "+t.name+": "+t.sourceSpan);return new e(t.name,t.type,t.securityContext,t.value,t.unit,t.sourceSpan,t.keySpan,t.valueSpan,n)},e.prototype.visit=function(e){return e.visitBoundAttribute(this)},e}(),Mr=function(){function e(e,t,n,r,i,o,s,a){this.name=e,this.type=t,this.handler=n,this.target=r,this.phase=i,this.sourceSpan=o,this.handlerSpan=s,this.keySpan=a}return e.fromParsedEvent=function(t){var n=0===t.type?t.targetOrPhase:null,r=1===t.type?t.targetOrPhase:null;if(void 0===t.keySpan)throw new Error("Unexpected state: keySpan must be defined for bound event but was not for "+t.name+": "+t.sourceSpan);return new e(t.name,t.type,t.handler,n,r,t.sourceSpan,t.handlerSpan,t.keySpan)},e.prototype.visit=function(e){return e.visitBoundEvent(this)},e}(),Pr=function(){function e(e,t,n,r,i,o,s,a,u,p){this.name=e,this.attributes=t,this.inputs=n,this.outputs=r,this.children=i,this.references=o,this.sourceSpan=s,this.startSourceSpan=a,this.endSourceSpan=u,this.i18n=p}return e.prototype.visit=function(e){return e.visitElement(this)},e}(),Nr=function(){function e(e,t,n,r,i,o,s,a,u,p,l,c){this.tagName=e,this.attributes=t,this.inputs=n,this.outputs=r,this.templateAttrs=i,this.children=o,this.references=s,this.variables=a,this.sourceSpan=u,this.startSourceSpan=p,this.endSourceSpan=l,this.i18n=c}return e.prototype.visit=function(e){return e.visitTemplate(this)},e}(),Ar=function(){function e(e,t,n,r){this.selector=e,this.attributes=t,this.sourceSpan=n,this.i18n=r,this.name="ng-content"}return e.prototype.visit=function(e){return e.visitContent(this)},e}(),Ir=function(){function e(e,t,n,r,i){this.name=e,this.value=t,this.sourceSpan=n,this.keySpan=r,this.valueSpan=i}return e.prototype.visit=function(e){return e.visitVariable(this)},e}(),kr=function(){function e(e,t,n,r,i){this.name=e,this.value=t,this.sourceSpan=n,this.keySpan=r,this.valueSpan=i}return e.prototype.visit=function(e){return e.visitReference(this)},e}(),Or=function(){function e(e,t,n,r){this.vars=e,this.placeholders=t,this.sourceSpan=n,this.i18n=r}return e.prototype.visit=function(e){return e.visitIcu(this)},e}(),Rr=(function(){function e(){}e.prototype.visitElement=function(e){},e.prototype.visitTemplate=function(e){},e.prototype.visitContent=function(e){},e.prototype.visitVariable=function(e){},e.prototype.visitReference=function(e){},e.prototype.visitTextAttribute=function(e){},e.prototype.visitBoundAttribute=function(e){},e.prototype.visitBoundEvent=function(e){},e.prototype.visitText=function(e){},e.prototype.visitBoundText=function(e){},e.prototype.visitIcu=function(e){}}(),function(){function e(){}return e.prototype.visitElement=function(e){Dr(this,e.attributes),Dr(this,e.children),Dr(this,e.references)},e.prototype.visitTemplate=function(e){Dr(this,e.attributes),Dr(this,e.children),Dr(this,e.references),Dr(this,e.variables)},e.prototype.visitContent=function(e){},e.prototype.visitVariable=function(e){},e.prototype.visitReference=function(e){},e.prototype.visitTextAttribute=function(e){},e.prototype.visitBoundAttribute=function(e){},e.prototype.visitBoundEvent=function(e){},e.prototype.visitText=function(e){},e.prototype.visitBoundText=function(e){},e.prototype.visitIcu=function(e){},e}());function Dr(e,t){var n,r,o,s,a=[];if(e.visit)try{for(var u=i(t),p=u.next();!p.done;p=u.next())var l=e.visit(f=p.value)||f.visit(e)}catch(e){n={error:e}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}else try{for(var c=i(t),h=c.next();!h.done;h=c.next()){var f;(l=(f=h.value).visit(e))&&a.push(l)}}catch(e){o={error:e}}finally{try{h&&!h.done&&(s=c.return)&&s.call(c)}finally{if(o)throw o.error}}return a}function Fr(e,t){var n,r,o=[],s=!1;try{for(var a=i(t),u=a.next();!u.done;u=a.next()){var p=u.value,l=p.visit(e);l&&o.push(l),s=s||l!=p}}catch(e){n={error:e}}finally{try{u&&!u.done&&(r=a.return)&&r.call(a)}finally{if(n)throw n.error}}return s?o:t}
/**
     * @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(){function e(){}e.prototype.visitElement=function(e){var t=Fr(this,e.attributes),n=Fr(this,e.inputs),r=Fr(this,e.outputs),i=Fr(this,e.children),o=Fr(this,e.references);return t!=e.attributes||n!=e.inputs||r!=e.outputs||i!=e.children||o!=e.references?new Pr(e.name,t,n,r,i,o,e.sourceSpan,e.startSourceSpan,e.endSourceSpan):e},e.prototype.visitTemplate=function(e){var t=Fr(this,e.attributes),n=Fr(this,e.inputs),r=Fr(this,e.outputs),i=Fr(this,e.templateAttrs),o=Fr(this,e.children),s=Fr(this,e.references),a=Fr(this,e.variables);return t!=e.attributes||n!=e.inputs||r!=e.outputs||i!=e.templateAttrs||o!=e.children||s!=e.references||a!=e.variables?new Nr(e.tagName,t,n,r,i,o,s,a,e.sourceSpan,e.startSourceSpan,e.endSourceSpan):e},e.prototype.visitContent=function(e){return e},e.prototype.visitVariable=function(e){return e},e.prototype.visitReference=function(e){return e},e.prototype.visitTextAttribute=function(e){return e},e.prototype.visitBoundAttribute=function(e){return e},e.prototype.visitBoundEvent=function(e){return e},e.prototype.visitText=function(e){return e},e.prototype.visitBoundText=function(e){return e},e.prototype.visitIcu=function(e){return e}}();var Lr=function Lr(e,t,n,r,i,o){this.nodes=e,this.placeholders=t,this.placeholderToMessage=n,this.meaning=r,this.description=i,this.customId=o,this.id=this.customId,this.legacyIds=[],this.sources=e.length?[{filePath:e[0].sourceSpan.start.file.url,startLine:e[0].sourceSpan.start.line+1,startCol:e[0].sourceSpan.start.col+1,endLine:e[e.length-1].sourceSpan.end.line+1,endCol:e[0].sourceSpan.start.col+1}]:[]},Br=function(){function e(e,t){this.value=e,this.sourceSpan=t}return e.prototype.visit=function(e,t){return e.visitText(this,t)},e}(),Vr=function(){function e(e,t){this.children=e,this.sourceSpan=t}return e.prototype.visit=function(e,t){return e.visitContainer(this,t)},e}(),jr=function(){function e(e,t,n,r){this.expression=e,this.type=t,this.cases=n,this.sourceSpan=r}return e.prototype.visit=function(e,t){return e.visitIcu(this,t)},e}(),Ur=function(){function e(e,t,n,r,i,o,s,a,u){this.tag=e,this.attrs=t,this.startName=n,this.closeName=r,this.children=i,this.isVoid=o,this.sourceSpan=s,this.startSourceSpan=a,this.endSourceSpan=u}return e.prototype.visit=function(e,t){return e.visitTagPlaceholder(this,t)},e}(),Hr=function(){function e(e,t,n){this.value=e,this.name=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitPlaceholder(this,t)},e}(),qr=function(){function e(e,t,n){this.value=e,this.name=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitIcuPlaceholder(this,t)},e}(),Wr=function(){function e(){}return e.prototype.visitText=function(e,t){return new Br(e.value,e.sourceSpan)},e.prototype.visitContainer=function(e,t){var n=this,r=e.children.map((function(e){return e.visit(n,t)}));return new Vr(r,e.sourceSpan)},e.prototype.visitIcu=function(e,t){var n=this,r={};Object.keys(e.cases).forEach((function(i){return r[i]=e.cases[i].visit(n,t)}));var i=new jr(e.expression,e.type,r,e.sourceSpan);return i.expressionPlaceholder=e.expressionPlaceholder,i},e.prototype.visitTagPlaceholder=function(e,t){var n=this,r=e.children.map((function(e){return e.visit(n,t)}));return new Ur(e.tag,e.attrs,e.startName,e.closeName,r,e.isVoid,e.sourceSpan,e.startSourceSpan,e.endSourceSpan)},e.prototype.visitPlaceholder=function(e,t){return new Hr(e.value,e.name,e.sourceSpan)},e.prototype.visitIcuPlaceholder=function(e,t){return new qr(e.value,e.name,e.sourceSpan)},e}(),zr=function(){function e(){}return e.prototype.visitText=function(e,t){},e.prototype.visitContainer=function(e,t){var n=this;e.children.forEach((function(e){return e.visit(n)}))},e.prototype.visitIcu=function(e,t){var n=this;Object.keys(e.cases).forEach((function(t){e.cases[t].visit(n)}))},e.prototype.visitTagPlaceholder=function(e,t){var n=this;e.children.forEach((function(e){return e.visit(n)}))},e.prototype.visitPlaceholder=function(e,t){},e.prototype.visitIcuPlaceholder=function(e,t){},e}(),Kr=function(){function e(e){this.digits=e}return e.zero=function(){return new e([0])},e.one=function(){return new e([1])},e.prototype.clone=function(){return new e(this.digits.slice())},e.prototype.add=function(e){var t=this.clone();return t.addToSelf(e),t},e.prototype.addToSelf=function(e){for(var t=Math.max(this.digits.length,e.digits.length),n=0,r=0;r<t;r++){var i=n;r<this.digits.length&&(i+=this.digits[r]),r<e.digits.length&&(i+=e.digits[r]),i>=10?(this.digits[r]=i-10,n=1):(this.digits[r]=i,n=0)}n>0&&(this.digits[t]=1)},e.prototype.toString=function(){for(var e="",t=this.digits.length-1;t>=0;t--)e+=this.digits[t];return e},e}(),Qr=function(){function e(e){this.powerOfTwos=[e]}return e.prototype.getValue=function(){return this.powerOfTwos[0]},e.prototype.multiplyBy=function(e){var t=Kr.zero();return this.multiplyByAndAddTo(e,t),t},e.prototype.multiplyByAndAddTo=function(e,t){for(var n=0;0!==e;e>>>=1,n++)if(1&e){var r=this.getMultipliedByPowerOfTwo(n);t.addToSelf(r)}},e.prototype.getMultipliedByPowerOfTwo=function(e){for(var t=this.powerOfTwos.length;t<=e;t++){var n=this.powerOfTwos[t-1];this.powerOfTwos[t]=n.add(n)}return this.powerOfTwos[e]},e}(),Xr=function(){function e(e){this.base=e,this.exponents=[new Qr(Kr.one())]}return e.prototype.toThePowerOf=function(e){for(var t=this.exponents.length;t<=e;t++){var n=this.exponents[t-1].multiplyBy(this.base);this.exponents[t]=new Qr(n)}return this.exponents[e]},e}();function Gr(e){return e.id||$r(e)}function $r(e){return function n(e){var t=_n(e),n=function r(e,t){for(var n=e.length+3>>>2,r=[],i=0;i<n;i++)r[i]=fi(e,4*i,t);return r}(t,Zr.Big),i=8*t.length,o=Pn(80),s=1732584193,a=4023233417,u=2562383102,p=271733878,l=3285377520;n[i>>5]|=128<<24-i%32,n[15+(i+64>>9<<4)]=i;for(var c=0;c<n.length;c+=16){for(var h=s,f=a,d=u,v=p,m=l,y=0;y<80;y++){o[y]=y<16?n[c+y]:ci(o[y-3]^o[y-8]^o[y-14]^o[y-16],1);var g=ri(y,a,u,p),E=g[0],_=g[1],S=[ci(s,5),E,l,_,o[y]].reduce(ui);l=p,p=u,u=ci(a,30),a=s,s=S}s=ui(s,h),a=ui(a,f),u=ui(u,d),p=ui(p,v),l=ui(l,m)}return function w(e){for(var t="",n=0;n<e.length;n++){var r=hi(e,n);t+=(r>>>4).toString(16)+(15&r).toString(16)}return t.toLowerCase()}(function x(e){return e.reduce((function(e,t){return e.concat(function n(e){for(var t=[],n=0;n<4;n++)t.push(e>>>8*(3-n)&255);return t}(t))}),[])}([s,a,u,p,l]))}(function t(e){return e.map((function(e){return e.visit(ti,null)}))}(e.nodes).join("")+"["+e.meaning+"]")}function Yr(e){return e.id||Jr(e)}function Jr(e){var t=new ni;return oi(e.nodes.map((function(e){return e.visit(t,null)})).join(""),e.meaning)}var Zr,ei=function(){function e(){}return e.prototype.visitText=function(e,t){return e.value},e.prototype.visitContainer=function(e,t){var n=this;return"["+e.children.map((function(e){return e.visit(n)})).join(", ")+"]"},e.prototype.visitIcu=function(e,t){var n=this,r=Object.keys(e.cases).map((function(t){return t+" {"+e.cases[t].visit(n)+"}"}));return"{"+e.expression+", "+e.type+", "+r.join(", ")+"}"},e.prototype.visitTagPlaceholder=function(e,t){var n=this;return e.isVoid?'<ph tag name="'+e.startName+'"/>':'<ph tag name="'+e.startName+'">'+e.children.map((function(e){return e.visit(n)})).join(", ")+'</ph name="'+e.closeName+'">'},e.prototype.visitPlaceholder=function(e,t){return e.value?'<ph name="'+e.name+'">'+e.value+"</ph>":'<ph name="'+e.name+'"/>'},e.prototype.visitIcuPlaceholder=function(e,t){return'<ph icu name="'+e.name+'">'+e.value.visit(this)+"</ph>"},e}(),ti=new ei,ni=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.visitIcu=function(e,t){var n=this,r=Object.keys(e.cases).map((function(t){return t+" {"+e.cases[t].visit(n)+"}"}));return"{"+e.type+", "+r.join(", ")+"}"},t}(ei);function ri(e,t,n,r){return e<20?[t&n|~t&r,1518500249]:e<40?[t^n^r,1859775393]:e<60?[t&n|t&r|n&r,2400959708]:[t^n^r,3395469782]}function ii(e){var t=_n(e),n=si(t,0),r=si(t,102072);return 0!=n||0!=r&&1!=r||(n^=319790063,r^=-1801410264),[n,r]}function oi(e,t){void 0===t&&(t="");var n=ii(e);if(t){var r=ii(t);n=function o(e,t){var n=e[0],r=t[0],i=pi(e[1],t[1]),o=i[0],s=i[1];return[ui(ui(n,r),o),s]}(function i(e,t){var n=e[0],r=e[1];return[n<<t|r>>>32-t,r<<t|n>>>32-t]}(n,1),r)}return function s(e,t){var n=di.toThePowerOf(0).multiplyBy(t);return di.toThePowerOf(4).multiplyByAndAddTo(e,n),n.toString()}(2147483647&n[0],n[1])}function si(e,t){var n,r=2654435769,i=2654435769,o=e.length;for(n=0;n+12<=o;n+=12){var s=ai(r=ui(r,fi(e,n,Zr.Little)),i=ui(i,fi(e,n+4,Zr.Little)),t=ui(t,fi(e,n+8,Zr.Little)));r=s[0],i=s[1],t=s[2]}return r=ui(r,fi(e,n,Zr.Little)),i=ui(i,fi(e,n+4,Zr.Little)),t=ui(t,o),ai(r,i,t=ui(t,fi(e,n+8,Zr.Little)<<8))[2]}function ai(e,t,n){return e=li(e,t),e=li(e,n),e^=n>>>13,t=li(t,n),t=li(t,e),t^=e<<8,n=li(n,e),n=li(n,t),n^=t>>>13,e=li(e,t),e=li(e,n),e^=n>>>12,t=li(t,n),t=li(t,e),t^=e<<16,n=li(n,e),n=li(n,t),n^=t>>>5,e=li(e,t),e=li(e,n),e^=n>>>3,t=li(t,n),t=li(t,e),t^=e<<10,n=li(n,e),n=li(n,t),[e,t,n^=t>>>15]}function ui(e,t){return pi(e,t)[1]}function pi(e,t){var n=(65535&e)+(65535&t),r=(e>>>16)+(t>>>16)+(n>>>16);return[r>>>16,r<<16|65535&n]}function li(e,t){var n=(65535&e)-(65535&t);return(e>>16)-(t>>16)+(n>>16)<<16|65535&n}function ci(e,t){return e<<t|e>>>32-t}function hi(e,t){return t>=e.length?0:e[t]}function fi(e,t,n){var r=0;if(n===Zr.Big)for(var i=0;i<4;i++)r+=hi(e,t+i)<<24-8*i;else for(i=0;i<4;i++)r+=hi(e,t+i)<<8*i;return r}!function(e){e[e.Little=0]="Little",e[e.Big=1]="Big"}(Zr||(Zr={}));var di=new Xr(256),vi=function(){function e(){}return e.prototype.createNameMapper=function(e){return null},e}(),mi=function(e){function t(t,n){var r=e.call(this)||this;return r.mapName=n,r.internalToPublic={},r.publicToNextId={},r.publicToInternal={},t.nodes.forEach((function(e){return e.visit(r)})),r}return r(t,e),t.prototype.toPublicName=function(e){return this.internalToPublic.hasOwnProperty(e)?this.internalToPublic[e]:null},t.prototype.toInternalName=function(e){return this.publicToInternal.hasOwnProperty(e)?this.publicToInternal[e]:null},t.prototype.visitText=function(e,t){return null},t.prototype.visitTagPlaceholder=function(t,n){this.visitPlaceholderName(t.startName),e.prototype.visitTagPlaceholder.call(this,t,n),this.visitPlaceholderName(t.closeName)},t.prototype.visitPlaceholder=function(e,t){this.visitPlaceholderName(e.name)},t.prototype.visitIcuPlaceholder=function(e,t){this.visitPlaceholderName(e.name)},t.prototype.visitPlaceholderName=function(e){if(e&&!this.internalToPublic.hasOwnProperty(e)){var t=this.mapName(e);if(this.publicToInternal.hasOwnProperty(t)){var n=this.publicToNextId[t];this.publicToNextId[t]=n+1,t=t+"_"+n}else this.publicToNextId[t]=1;this.internalToPublic[e]=t,this.publicToInternal[t]=e}},t}(zr),yi=new(function(){function e(){}return e.prototype.visitTag=function(e){var t=this,n=this._serializeAttributes(e.attrs);if(0==e.children.length)return"<"+e.name+n+"/>";var r=e.children.map((function(e){return e.visit(t)}));return"<"+e.name+n+">"+r.join("")+"</"+e.name+">"},e.prototype.visitText=function(e){return e.value},e.prototype.visitDeclaration=function(e){return"<?xml"+this._serializeAttributes(e.attrs)+" ?>"},e.prototype._serializeAttributes=function(e){var t=Object.keys(e).map((function(t){return t+'="'+e[t]+'"'})).join(" ");return t.length>0?" "+t:""},e.prototype.visitDoctype=function(e){return"<!DOCTYPE "+e.rootTag+" [\n"+e.dtd+"\n]>"},e}());function gi(e){return e.map((function(e){return e.visit(yi)})).join("")}var Ei=function(){function e(e){var t=this;this.attrs={},Object.keys(e).forEach((function(n){t.attrs[n]=bi(e[n])}))}return e.prototype.visit=function(e){return e.visitDeclaration(this)},e}(),_i=function(){function e(e,t){this.rootTag=e,this.dtd=t}return e.prototype.visit=function(e){return e.visitDoctype(this)},e}(),Si=function(){function e(e,t,n){var r=this;void 0===t&&(t={}),void 0===n&&(n=[]),this.name=e,this.children=n,this.attrs={},Object.keys(t).forEach((function(e){r.attrs[e]=bi(t[e])}))}return e.prototype.visit=function(e){return e.visitTag(this)},e}(),xi=function(){function e(e){this.value=bi(e)}return e.prototype.visit=function(e){return e.visitText(this)},e}(),wi=function(e){function t(t){return void 0===t&&(t=0),e.call(this,"\n"+new Array(t+1).join(" "))||this}return r(t,e),t}(xi),Ci=[[/&/g,"&amp;"],[/"/g,"&quot;"],[/'/g,"&apos;"],[/</g,"&lt;"],[/>/g,"&gt;"]];function bi(e){return Ci.reduce((function(e,t){return e.replace(t[0],t[1])}),e)}var Ti=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.write=function(e,t){var n=new Ni,r=new Mi,i=new Si("messagebundle");return e.forEach((function(e){var t={id:e.id};e.description&&(t.desc=e.description),e.meaning&&(t.meaning=e.meaning);var n=[];e.sources.forEach((function(e){n.push(new Si("source",{},[new xi(e.filePath+":"+e.startLine+(e.endLine!==e.startLine?","+e.endLine:""))]))})),i.children.push(new wi(2),new Si("msg",t,s(n,r.serialize(e.nodes))))})),i.children.push(new wi),gi([new Ei({version:"1.0",encoding:"UTF-8"}),new wi,new _i("messagebundle",'<!ELEMENT messagebundle (msg)*>\n<!ATTLIST messagebundle class CDATA #IMPLIED>\n\n<!ELEMENT msg (#PCDATA|ph|source)*>\n<!ATTLIST msg id CDATA #IMPLIED>\n<!ATTLIST msg seq CDATA #IMPLIED>\n<!ATTLIST msg name CDATA #IMPLIED>\n<!ATTLIST msg desc CDATA #IMPLIED>\n<!ATTLIST msg meaning CDATA #IMPLIED>\n<!ATTLIST msg obsolete (obsolete) #IMPLIED>\n<!ATTLIST msg xml:space (default|preserve) "default">\n<!ATTLIST msg is_hidden CDATA #IMPLIED>\n\n<!ELEMENT source (#PCDATA)>\n\n<!ELEMENT ph (#PCDATA|ex)*>\n<!ATTLIST ph name CDATA #REQUIRED>\n\n<!ELEMENT ex (#PCDATA)>'),new wi,n.addDefaultExamples(i),new wi])},t.prototype.load=function(e,t){throw new Error("Unsupported")},t.prototype.digest=function(e){return Pi(e)},t.prototype.createNameMapper=function(e){return new mi(e,Ai)},t}(vi),Mi=function(){function e(){}return e.prototype.visitText=function(e,t){return[new xi(e.value)]},e.prototype.visitContainer=function(e,t){var n=this,r=[];return e.children.forEach((function(e){return r.push.apply(r,s(e.visit(n)))})),r},e.prototype.visitIcu=function(e,t){var n=this,r=[new xi("{"+e.expressionPlaceholder+", "+e.type+", ")];return Object.keys(e.cases).forEach((function(t){r.push.apply(r,s([new xi(t+" {")],e.cases[t].visit(n),[new xi("} ")]))})),r.push(new xi("}")),r},e.prototype.visitTagPlaceholder=function(e,t){var n=new xi("<"+e.tag+">"),r=new Si("ex",{},[n]),i=new Si("ph",{name:e.startName},[r,n]);if(e.isVoid)return[i];var o=new xi("</"+e.tag+">"),a=new Si("ex",{},[o]),u=new Si("ph",{name:e.closeName},[a,o]);return s([i],this.serialize(e.children),[u])},e.prototype.visitPlaceholder=function(e,t){var n=new xi("{{"+e.value+"}}"),r=new Si("ex",{},[n]);return[new Si("ph",{name:e.name},[r,n])]},e.prototype.visitIcuPlaceholder=function(e,t){var n=e.value.expression,r=e.value.type,i=Object.keys(e.value.cases).map((function(e){return e+" {...}"})).join(" "),o=new xi("{"+n+", "+r+", "+i+"}"),s=new Si("ex",{},[o]);return[new Si("ph",{name:e.name},[s,o])]},e.prototype.serialize=function(e){var t=this;return[].concat.apply([],s(e.map((function(e){return e.visit(t)}))))},e}();function Pi(e){return Yr(e)}var Ni=function(){function e(){}return e.prototype.addDefaultExamples=function(e){return e.visit(this),e},e.prototype.visitTag=function(e){var t=this;if("ph"===e.name){if(!e.children||0==e.children.length){var n=new xi(e.attrs.name||"...");e.children=[new Si("ex",{},[n])]}}else e.children&&e.children.forEach((function(e){return e.visit(t)}))},e.prototype.visitText=function(e){},e.prototype.visitDeclaration=function(e){},e.prototype.visitDoctype=function(e){},e}();function Ai(e){return e.toUpperCase().replace(/[^A-Z0-9_]/g,"_")}function Ii(e){return"i18n"===e||e.startsWith("i18n-")}function ki(e){return e instanceof Lr}function Oi(e){return ki(e)&&1===e.nodes.length&&e.nodes[0]instanceof jr}function Ri(e){return!!e.i18n}function Di(e){return e.nodes[0]}function Fi(e,t){return void 0===t&&(t=0),"�"+e+(t>0?":"+t:"")+"�"}function Li(e){void 0===e&&(e=0);var t=e;return function(){return t++}}function Bi(e){var t={};return e.forEach((function(e,n){t[n]=Ut(e.length>1?"["+e.join("|")+"]":e[0])})),t}function Vi(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];var i=e.get(t)||[];i.push.apply(i,s(n)),e.set(t,i)}function ji(e,t,n){void 0===t&&(t=0),void 0===n&&(n=0);var r=t,i=new Map,o=e instanceof Lr?e.nodes.find((function(e){return e instanceof Vr})):e;return o&&o.children.filter((function(e){return e instanceof Hr})).forEach((function(e,t){var o=Fi(r+t,n);Vi(i,e.name,o)})),i}function Ui(e,t){void 0===e&&(e={});var n={};return e&&Object.keys(e).length&&Object.keys(e).forEach((function(r){return n[Hi(r,t)]=e[r]})),n}function Hi(e,t){void 0===t&&(t=!0);var n=Ai(e);if(!t)return n;var r,i=n.split("_");if(1===i.length)return e.toLowerCase();/^\d+$/.test(i[i.length-1])&&(r=i.pop());var o=i.shift().toLowerCase();return i.length&&(o+=i.map((function(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()})).join("")),r?o+"_"+r:o}function qi(e){return("MSG_"+e).toUpperCase()}function Wi(e){return new lt(e.name,void 0,le,void 0,e.sourceSpan)}var zi=/[-.]/;function Ki(e,t){var n=null;return function(){return n||(e.push(new lt("_t",void 0,pe)),n=It(t)),n}}function Qi(e){if(this)throw new Error("Builder "+this.constructor.name+" doesn't support "+e+" yet");throw new Error("Feature "+e+" is not supported yet")}function Xi(e){throw new Error("Invalid state: Visitor "+this.constructor.name+" doesn't handle "+e.constructor.name)}function Gi(e){return Array.isArray(e)?Ft(e.map(Gi)):Ut(e,le)}function $i(e,t){return Object.getOwnPropertyNames(e).length>0?function n(e,t){return Lt(Object.getOwnPropertyNames(e).map((function(n){var r,i,s,a,u,p,l=e[n];return Array.isArray(l)?(u=n,p=(a=(r=o(l,2))[0])!==(s=r[1])):(u=s=(i=o(sn(n,[n,l]),2))[0],p=(a=i[1])!==s&&n.includes(":")),{key:u,quoted:zi.test(u),value:t&&p?Ft([Gi(a),Gi(s)]):Gi(a)}})))}(e,t):null}function Yi(e){for(;Ht(e[e.length-1]);)e.pop();return e}function Ji(e,t){if(Array.isArray(e.predicate)){var n=[];return e.predicate.forEach((function(e){var t=e.split(",").map((function(e){return Ut(e.trim())}));n.push.apply(n,s(t))})),t.getConstLiteral(Ft(n),!0)}return e.predicate}var Zi,eo,to,no=function(){function e(){this.values=[]}return e.prototype.set=function(e,t){t&&this.values.push({key:e,value:t,quoted:!1})},e.prototype.toLiteralMap=function(){return Lt(this.values)},e}();function ro(e){var t={};return e instanceof Nr&&"ng-template"!==e.tagName?e.templateAttrs.forEach((function(e){return t[e.name]=""})):(e.attributes.forEach((function(e){Ii(e.name)||(t[e.name]=e.value)})),e.inputs.forEach((function(e){t[e.name]=""})),e.outputs.forEach((function(e){t[e.name]=""}))),t}function io(e,t,n){var r=kt(e,null,n);if(t.length>0)for(var i=0;i<t.length;i++)r=r.callFn(t[i],n);else r=r.callFn([],n);return r}function oo(e){var t=e.expressions,n=e.strings;return 1===t.length&&2===n.length&&""===n[0]&&""===n[1]?1:t.length+n.length}function so(t){var n=It("t"),r=[],i=de,o=uo(t)?n:new Je(e.BinaryOperator.Or,n,t.internalType),s=null;if(null!==t.deps)"invalid"!==t.deps&&(s=new Ie(o,ao(t.deps,t.injectFn,t.target===e.R3FactoryTarget.Pipe)),i=function a(t){var n=!1,r=t.map((function(t){var r=function i(t){var n=[];return t.resolved===e.R3ResolvedDependencyType.Attribute&&null!==t.attribute&&n.push({key:"attribute",value:t.attribute,quoted:!1}),t.optional&&n.push({key:"optional",value:Ut(!0),quoted:!1}),t.host&&n.push({key:"host",value:Ut(!0),quoted:!1}),t.self&&n.push({key:"self",value:Ut(!0),quoted:!1}),t.skipSelf&&n.push({key:"skipSelf",value:Ut(!0),quoted:!1}),n.length>0?Lt(n):null}(t);return null!==r?(n=!0,r):Ut(null)}));return n?Rt(Ft(r)):de}(t.deps));else{var u=It("ɵ"+t.name+"_BaseFactory"),p=kt(rr.getInheritedFactory),l=u.set(p.callFn([t.internalType],void 0,!0)).toDeclStmt(le,[e.StmtModifier.Exported,e.StmtModifier.Final]);r.push(l),s=u.callFn([o])}var c=s,h=[],f=null;function d(e){var t,r=It("r");return h.push(r.set(ot).toDeclStmt()),t=null!==c?r.set(c).toStmt():kt(rr.invalidFactory).callFn([]).toStmt(),h.push(Vt(n,[t],[r.set(e).toStmt()])),r}if(uo(t)){var v=ao(t.delegateDeps,t.injectFn,t.target===e.R3FactoryTarget.Pipe);f=d(new(t.delegateType===Zi.Class?Ie:Ne)(t.delegate,v))}else f=function m(e){return void 0!==e.expression}
/**
     * @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
     */(t)?d(t.expression):s;return h.push(null!==f?new ft(f):kt(rr.invalidFactory).callFn([]).toStmt()),{factory:Bt([new Ge("t",pe)],h,le,void 0,t.name+"_Factory"),statements:r,type:Rt(kt(rr.FactoryDef,[yr(t.type.type,t.typeArgumentCount),i]))}}function ao(t,n,r){return t.map((function(t,i){return function o(t,n,r,i){switch(t.resolved){case e.R3ResolvedDependencyType.Token:case e.R3ResolvedDependencyType.ChangeDetectorRef:var o=0|(t.self?2:0)|(t.skipSelf?4:0)|(t.host?1:0)|(t.optional?8:0),s=0!==o||t.optional?Ut(o):null;if(r&&t.resolved===e.R3ResolvedDependencyType.ChangeDetectorRef)return kt(rr.injectPipeChangeDetectorRef).callFn(s?[s]:[]);var a=[t.token];return s&&a.push(s),kt(n).callFn(a);case e.R3ResolvedDependencyType.Attribute:return kt(rr.injectAttribute).callFn([t.token]);case e.R3ResolvedDependencyType.Invalid:return kt(rr.invalidFactoryDep).callFn([Ut(i)]);default:return Qi("Unknown R3ResolvedDependencyType: "+e.R3ResolvedDependencyType[t.resolved])}}(t,n,r,i)}))}function uo(e){return void 0!==e.delegateType}function po(t){var n=null,r={name:t.name,type:t.type,internalType:t.internalType,typeArgumentCount:t.typeArgumentCount,deps:[],injectFn:Jt.inject,target:e.R3FactoryTarget.Injectable};if(void 0!==t.useClass){var i=t.useClass.isEquivalent(t.internalType),o=void 0;void 0!==t.userDeps&&(o=t.userDeps),n=void 0!==o?so(Object.assign(Object.assign({},r),{delegate:t.useClass,delegateDeps:o,delegateType:Zi.Class})):i?so(r):lo(t.type.value,t.useClass)}else n=void 0!==t.useFactory?void 0!==t.userDeps?so(Object.assign(Object.assign({},r),{delegate:t.useFactory,delegateDeps:t.userDeps||[],delegateType:Zi.Function})):{statements:[],factory:Bt([],[new ft(t.useFactory.callFn([]))])}:void 0!==t.useValue?so(Object.assign(Object.assign({},r),{expression:t.useValue})):void 0!==t.useExisting?so(Object.assign(Object.assign({},r),{expression:kt(Jt.inject).callFn([t.useExisting])})):lo(t.type.value,t.internalType);var s={token:t.internalType,factory:n.factory};return null!==t.providedIn.value&&(s.providedIn=t.providedIn),{expression:kt(Jt.ɵɵdefineInjectable).callFn([mr(s)]),type:new se(kt(Jt.InjectableDef,[yr(t.type.type,t.typeArgumentCount)])),statements:n.statements}}function lo(e,t){return{statements:[],factory:e.node===t.node?t.prop("ɵfac"):Bt([new Ge("t",pe)],[new ft(t.callMethod("ɵfac",[It("t")]))])}}
/**
     * @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 co(e,t){if(null!=t){if(!Array.isArray(t))throw new Error("Expected '"+e+"' to be an array of strings.");for(var n=0;n<t.length;n+=1)if("string"!=typeof t[n])throw new Error("Expected '"+e+"' to be an array of strings.")}}!function(e){e[e.Class=0]="Class",e[e.Function=1]="Function"}(Zi||(Zi={})),(eo=e.R3FactoryTarget||(e.R3FactoryTarget={}))[eo.Directive=0]="Directive",eo[eo.Component=1]="Component",eo[eo.Injectable=2]="Injectable",eo[eo.Pipe=3]="Pipe",eo[eo.NgModule=4]="NgModule",(to=e.R3ResolvedDependencyType||(e.R3ResolvedDependencyType={}))[to.Token=0]="Token",to[to.Attribute=1]="Attribute",to[to.ChangeDetectorRef=2]="ChangeDetectorRef",to[to.Invalid=3]="Invalid";var ho=[/^\s*$/,/[<>]/,/^[{}]$/,/&(#|[a-z])/i,/^\/\//];function fo(e,t){if(!(null==t||Array.isArray(t)&&2==t.length))throw new Error("Expected '"+e+"' to be an array, [start, end].");if(null!=t){var n=t[0],r=t[1];ho.forEach((function(e){if(e.test(n)||e.test(r))throw new Error("['"+n+"', '"+r+"'] contains unusable interpolation symbol.")}))}}
/**
     * @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 vo,mo=function(){function e(e,t){this.start=e,this.end=t}return e.fromArray=function(t){return t?(fo("interpolation",t),new e(t[0],t[1])):yo},e}(),yo=new mo("{{","}}"),go='(this&&this.__makeTemplateObject||function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e})',Eo=function(t){function n(){return t.call(this,!1)||this}return r(n,t),n.prototype.visitDeclareClassStmt=function(e,t){var n=this;return t.pushClass(e),this._visitClassConstructor(e,t),null!=e.parent&&(t.print(e,e.name+".prototype = Object.create("),e.parent.visitExpression(this,t),t.println(e,".prototype);")),e.getters.forEach((function(r){return n._visitClassGetter(e,r,t)})),e.methods.forEach((function(r){return n._visitClassMethod(e,r,t)})),t.popClass(),null},n.prototype._visitClassConstructor=function(e,t){t.print(e,"function "+e.name+"("),null!=e.constructorMethod&&this._visitParams(e.constructorMethod.params,t),t.println(e,") {"),t.incIndent(),null!=e.constructorMethod&&e.constructorMethod.body.length>0&&(t.println(e,"var self = this;"),this.visitAllStatements(e.constructorMethod.body,t)),t.decIndent(),t.println(e,"}")},n.prototype._visitClassGetter=function(e,t,n){n.println(e,"Object.defineProperty("+e.name+".prototype, '"+t.name+"', { get: function() {"),n.incIndent(),t.body.length>0&&(n.println(e,"var self = this;"),this.visitAllStatements(t.body,n)),n.decIndent(),n.println(e,"}});")},n.prototype._visitClassMethod=function(e,t,n){n.print(e,e.name+".prototype."+t.name+" = function("),this._visitParams(t.params,n),n.println(e,") {"),n.incIndent(),t.body.length>0&&(n.println(e,"var self = this;"),this.visitAllStatements(t.body,n)),n.decIndent(),n.println(e,"};")},n.prototype.visitWrappedNodeExpr=function(e,t){throw new Error("Cannot emit a WrappedNodeExpr in Javascript.")},n.prototype.visitReadVarExpr=function(n,r){if(n.builtin===e.BuiltinVar.This)r.print(n,"self");else{if(n.builtin===e.BuiltinVar.Super)throw new Error("'super' needs to be handled at a parent ast node, not at the variable level!");t.prototype.visitReadVarExpr.call(this,n,r)}return null},n.prototype.visitDeclareVarStmt=function(e,t){return t.print(e,"var "+e.name),e.value&&(t.print(e," = "),e.value.visitExpression(this,t)),t.println(e,";"),null},n.prototype.visitCastExpr=function(e,t){return e.value.visitExpression(this,t),null},n.prototype.visitInvokeFunctionExpr=function(n,r){var i=n.fn;return i instanceof Se&&i.builtin===e.BuiltinVar.Super?(r.currentClass.parent.visitExpression(this,r),r.print(n,".call(this"),n.args.length>0&&(r.print(n,", "),this.visitAllExpressions(n.args,r,",")),r.print(n,")")):t.prototype.visitInvokeFunctionExpr.call(this,n,r),null},n.prototype.visitTaggedTemplateExpr=function(e,t){var n=this,r=e.template.elements;return e.tag.visitExpression(this,t),t.print(e,"("+go+"("),t.print(e,"["+r.map((function(e){return dr(e.text,!1)})).join(", ")+"], "),t.print(e,"["+r.map((function(e){return dr(e.rawText,!1)})).join(", ")+"])"),e.template.expressions.forEach((function(r){t.print(e,", "),r.visitExpression(n,t)})),t.print(e,")"),null},n.prototype.visitFunctionExpr=function(e,t){return t.print(e,"function"+(e.name?" "+e.name:"")+"("),this._visitParams(e.params,t),t.println(e,") {"),t.incIndent(),this.visitAllStatements(e.statements,t),t.decIndent(),t.print(e,"}"),null},n.prototype.visitDeclareFunctionStmt=function(e,t){return t.print(e,"function "+e.name+"("),this._visitParams(e.params,t),t.println(e,") {"),t.incIndent(),this.visitAllStatements(e.statements,t),t.decIndent(),t.println(e,"}"),null},n.prototype.visitTryCatchStmt=function(t,n){n.println(t,"try {"),n.incIndent(),this.visitAllStatements(t.bodyStmts,n),n.decIndent(),n.println(t,"} catch ("+pr.name+") {"),n.incIndent();var r=[lr.set(pr.prop("stack")).toDeclStmt(null,[e.StmtModifier.Final])].concat(t.catchStmts);return this.visitAllStatements(r,n),n.decIndent(),n.println(t,"}"),null},n.prototype.visitLocalizedString=function(e,t){var n=this;t.print(e,"$localize("+go+"(");for(var r=[e.serializeI18nHead()],i=1;i<e.messageParts.length;i++)r.push(e.serializeI18nTemplatePart(i));return t.print(e,"["+r.map((function(e){return dr(e.cooked,!1)})).join(", ")+"], "),t.print(e,"["+r.map((function(e){return dr(e.raw,!1)})).join(", ")+"])"),e.expressions.forEach((function(r){t.print(e,", "),r.visitExpression(n,t)})),t.print(e,")"),null},n.prototype._visitParams=function(e,t){this.visitAllObjects((function(e){return t.print(null,e.name)}),e,t,",")},n.prototype.getBuiltinMethodName=function(t){var n;switch(t){case e.BuiltinMethod.ConcatArray:n="concat";break;case e.BuiltinMethod.SubscribeObservable:n="subscribe";break;case e.BuiltinMethod.Bind:n="bind";break;default:throw new Error("Unknown builtin method: "+t)}return n},n}(fr);function _o(e){var t;return(null===(t=function n(){if(void 0===vo&&(vo=null,Mn.trustedTypes))try{vo=Mn.trustedTypes.createPolicy("angular#unsafe-jit",{createScript:function(e){return e}})}catch(e){}return vo}())||void 0===t?void 0:t.createScript(e))||e}function So(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(!Mn.trustedTypes)return new(Function.bind.apply(Function,s([void 0],e)));var n=e.slice(0,-1).join(","),r=e[e.length-1],i="(function anonymous("+n+"\n) { "+r+"\n})",o=Mn.eval(_o(i));return void 0===o.bind?new(Function.bind.apply(Function,s([void 0],e))):(o.toString=function(){return i},o.bind(Mn))}var xo=function(){function e(){}return e.prototype.evaluateStatements=function(e,t,n,r){var i=new wo(n),o=hr.createRoot();return t.length>0&&!function a(e){return e.isEquivalent(Ut("use strict").toStmt())}
/**
     * @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
     */(t[0])&&(t=s([Ut("use strict").toStmt()],t)),i.visitAllStatements(t,o),i.createReturnStmt(o),this.evaluateCode(e,o,i.getArgs(),r)},e.prototype.evaluateCode=function(e,t,n,r){var i='"use strict";'+t.toSource()+"\n//# sourceURL="+e,o=[],a=[];for(var u in n)a.push(n[u]),o.push(u);if(r){var p=So.apply(void 0,s(o.concat("return null;"))).toString(),l=p.slice(0,p.indexOf("return null;")).split("\n").length-1;i+="\n"+t.toSourceMapGenerator(e,l).toJsComment()}var c=So.apply(void 0,s(o.concat(i)));return this.executeFunction(c,a)},e.prototype.executeFunction=function(e,t){return e.apply(void 0,s(t))},e}(),wo=function(t){function n(e){var n=t.call(this)||this;return n.reflector=e,n._evalArgNames=[],n._evalArgValues=[],n._evalExportedVars=[],n}return r(n,t),n.prototype.createReturnStmt=function(e){new ft(new rt(this._evalExportedVars.map((function(e){return new nt(e,It(e),!1)})))).visitStatement(this,e)},n.prototype.getArgs=function(){for(var e={},t=0;t<this._evalArgNames.length;t++)e[this._evalArgNames[t]]=this._evalArgValues[t];return e},n.prototype.visitExternalExpr=function(e,t){return this._emitReferenceToExternal(e,this.reflector.resolveExternalReference(e.value),t),null},n.prototype.visitWrappedNodeExpr=function(e,t){return this._emitReferenceToExternal(e,e.node,t),null},n.prototype.visitDeclareVarStmt=function(n,r){return n.hasModifier(e.StmtModifier.Exported)&&this._evalExportedVars.push(n.name),t.prototype.visitDeclareVarStmt.call(this,n,r)},n.prototype.visitDeclareFunctionStmt=function(n,r){return n.hasModifier(e.StmtModifier.Exported)&&this._evalExportedVars.push(n.name),t.prototype.visitDeclareFunctionStmt.call(this,n,r)},n.prototype.visitDeclareClassStmt=function(n,r){return n.hasModifier(e.StmtModifier.Exported)&&this._evalExportedVars.push(n.name),t.prototype.visitDeclareClassStmt.call(this,n,r)},n.prototype._emitReferenceToExternal=function(e,t,n){var r=this._evalArgValues.indexOf(t);if(-1===r){r=this._evalArgValues.length,this._evalArgValues.push(t);var i=On({reference:t})||"val";this._evalArgNames.push("jit_"+i+"_"+r)}n.print(e,this._evalArgNames[r])},n}(Eo);function Co(e){return e>=9&&e<=32||160==e}function bo(e){return 48<=e&&e<=57}function To(e){return e>=97&&e<=122||e>=65&&e<=90}function Mo(e){return 10===e||13===e}function Po(e){return 48<=e&&e<=55}
/**
     * @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 No,Ao=function(){function e(e,t,n,r){this.file=e,this.offset=t,this.line=n,this.col=r}return e.prototype.toString=function(){return null!=this.offset?this.file.url+"@"+this.line+":"+this.col:this.file.url},e.prototype.moveBy=function(t){for(var n=this.file.content,r=n.length,i=this.offset,o=this.line,s=this.col;i>0&&t<0;)if(i--,t++,10==(u=n.charCodeAt(i))){o--;var a=n.substr(0,i-1).lastIndexOf(String.fromCharCode(10));s=a>0?i-a:i}else s--;for(;i<r&&t>0;){var u=n.charCodeAt(i);i++,t--,10==u?(o++,s=0):s++}return new e(this.file,i,o,s)},e.prototype.getContext=function(e,t){var n=this.file.content,r=this.offset;if(null!=r){r>n.length-1&&(r=n.length-1);for(var i=r,o=0,s=0;o<e&&r>0&&(o++,"\n"!=n[--r]||++s!=t););for(o=0,s=0;o<e&&i<n.length-1&&(o++,"\n"!=n[++i]||++s!=t););return{before:n.substring(r,this.offset),after:n.substring(this.offset,i+1)}}return null},e}(),Io=function Io(e,t){this.content=e,this.url=t},ko=function(){function e(e,t,n,r){void 0===n&&(n=e),void 0===r&&(r=null),this.start=e,this.end=t,this.fullStart=n,this.details=r}return e.prototype.toString=function(){return this.start.file.content.substring(this.start.offset,this.end.offset)},e}();(No=e.ParseErrorLevel||(e.ParseErrorLevel={}))[No.WARNING=0]="WARNING",No[No.ERROR=1]="ERROR";var Oo=function(){function t(t,n,r){void 0===r&&(r=e.ParseErrorLevel.ERROR),this.span=t,this.msg=n,this.level=r}return t.prototype.contextualMessage=function(){var t=this.span.start.getContext(100,3);return t?this.msg+' ("'+t.before+"["+e.ParseErrorLevel[this.level]+" ->]"+t.after+'")':this.msg},t.prototype.toString=function(){var e=this.span.details?", "+this.span.details:"";return this.contextualMessage()+": "+this.span.start+e},t}();function Ro(e,t){var n=Rn(t),r=null!=n?"in "+e+" "+On(t)+" in "+n:"in "+e+" "+On(t),i=new Io("",r);return new ko(new Ao(i,-1,-1,-1),new Ao(i,-1,-1,-1))}function Do(e,t,n){var r=new Io("","in "+e+" "+t+" in "+n);return new ko(new Ao(r,-1,-1,-1),new Ao(r,-1,-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
     */var Fo=function(){function e(e){this.context=e}return e.prototype.resolveExternalReference=function(e){if("@angular/core"!==e.moduleName)throw new Error("Cannot resolve external reference to "+e.moduleName+", only references to @angular/core are supported.");if(!this.context.hasOwnProperty(e.name))throw new Error("No value provided for @angular/core symbol '"+e.name+"'.");return this.context[e.name]},e.prototype.parameters=function(e){throw new Error("Not implemented.")},e.prototype.annotations=function(e){throw new Error("Not implemented.")},e.prototype.shallowAnnotations=function(e){throw new Error("Not implemented.")},e.prototype.tryAnnotations=function(e){throw new Error("Not implemented.")},e.prototype.propMetadata=function(e){throw new Error("Not implemented.")},e.prototype.hasLifecycleHook=function(e,t){throw new Error("Not implemented.")},e.prototype.guards=function(e){throw new Error("Not implemented.")},e.prototype.componentModuleUrl=function(e,t){throw new Error("Not implemented.")},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
     */function Lo(e){var t=e.type,n=e.bootstrap,r=e.declarations,i=e.imports,o=e.exports,s=e.schemas,a=e.containsForwardDecls,u=e.emitInline,p=e.id,l=[],c={type:e.internalType};if(n.length&&(c.bootstrap=jo(n,a)),u)r.length&&(c.declarations=jo(r,a)),i.length&&(c.imports=jo(i,a)),o.length&&(c.exports=jo(o,a));else{var h=function f(e){var t=e.adjacentType,n=e.declarations,r=e.imports,i=e.exports,o=e.containsForwardDecls,s={};if(n.length&&(s.declarations=jo(n,o)),r.length&&(s.imports=jo(r,o)),i.length&&(s.exports=jo(i,o)),0===Object.keys(s).length)return null;var a=function u(e){return Sr("ngJitMode",e)}(new Ne(kt(rr.setNgModuleScope),[t,mr(s)])),p=new $e([],[a.toStmt()]);return new Ne(p,[]).toStmt()}(e);null!==h&&l.push(h)}return s&&s.length&&(c.schemas=Ft(s.map((function(e){return e.value})))),p&&(c.id=p),{expression:kt(rr.defineNgModule).callFn([mr(c)]),type:new se(kt(rr.NgModuleDefWithMeta,[new se(t.type),Vo(r),Vo(i),Vo(o)])),additionalStatements:l}}function Bo(e){var t={};return null!==e.providers&&(t.providers=e.providers),e.imports.length>0&&(t.imports=Ft(e.imports)),{expression:kt(rr.defineInjector).callFn([mr(t)]),type:new se(kt(rr.InjectorDef,[new se(e.type.type)]))}}function Vo(e){var t=e.map((function(e){return Dt(e.type)}));return e.length>0?Rt(Ft(t)):de}function jo(e,t){var n=Ft(e.map((function(e){return e.value})));return t?Bt([],[new ft(n)]):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
     */function Uo(e){var t=[];return t.push({key:"name",value:Ut(e.pipeName),quoted:!1}),t.push({key:"type",value:e.type.value,quoted:!1}),t.push({key:"pure",value:Ut(e.pure),quoted:!1}),{expression:kt(rr.definePipe).callFn([Lt(t)]),type:Ho(e)}}function Ho(e){return new se(kt(rr.PipeDefWithMeta,[yr(e.type.type,e.typeArgumentCount),new se(new ke(e.pipeName))]))}
/**
     * @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 qo,Wo=function Wo(e,t,n,r){this.input=t,this.errLocation=n,this.ctxLocation=r,this.message="Parser Error: "+e+" "+n+" ["+t+"] in "+r},zo=function(){function e(e,t){this.start=e,this.end=t}return e.prototype.toAbsolute=function(e){return new ys(e+this.start,e+this.end)},e}(),Ko=function(){function e(e,t){this.span=e,this.sourceSpan=t}return e.prototype.visit=function(e,t){return void 0===t&&(t=null),null},e.prototype.toString=function(){return"AST"},e}(),Qo=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.nameSpan=r,i}return r(t,e),t}(Ko),Xo=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n)||this;return s.prefix=r,s.uninterpretedExpression=i,s.location=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitQuote(this,t)},t.prototype.toString=function(){return"Quote"},t}(Ko),Go=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.visit=function(e,t){void 0===t&&(t=null)},t}(Ko),$o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitImplicitReceiver(this,t)},t}(Ko),Yo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.visit=function(e,t){var n;return void 0===t&&(t=null),null===(n=e.visitThisReceiver)||void 0===n?void 0:n.call(e,this,t)},t}($o),Jo=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.expressions=r,i}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitChain(this,t)},t}(Ko),Zo=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n)||this;return s.condition=r,s.trueExp=i,s.falseExp=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitConditional(this,t)},t}(Ko),es=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n,r)||this;return s.receiver=i,s.name=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitPropertyRead(this,t)},t}(Qo),ts=function(e){function t(t,n,r,i,o,s){var a=e.call(this,t,n,r)||this;return a.receiver=i,a.name=o,a.value=s,a}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitPropertyWrite(this,t)},t}(Qo),ns=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n,r)||this;return s.receiver=i,s.name=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitSafePropertyRead(this,t)},t}(Qo),rs=function(e){function t(t,n,r,i){var o=e.call(this,t,n)||this;return o.obj=r,o.key=i,o}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitKeyedRead(this,t)},t}(Ko),is=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n)||this;return s.obj=r,s.key=i,s.value=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitKeyedWrite(this,t)},t}(Ko),os=function(e){function t(t,n,r,i,o,s){var a=e.call(this,t,n,s)||this;return a.exp=r,a.name=i,a.args=o,a}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitPipe(this,t)},t}(Qo),ss=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.value=r,i}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitLiteralPrimitive(this,t)},t}(Ko),as=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.expressions=r,i}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitLiteralArray(this,t)},t}(Ko),us=function(e){function t(t,n,r,i){var o=e.call(this,t,n)||this;return o.keys=r,o.values=i,o}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitLiteralMap(this,t)},t}(Ko),ps=function(e){function t(t,n,r,i){var o=e.call(this,t,n)||this;return o.strings=r,o.expressions=i,o}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitInterpolation(this,t)},t}(Ko),ls=function(e){function t(t,n,r,i,o){var s=e.call(this,t,n)||this;return s.operation=r,s.left=i,s.right=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitBinary(this,t)},t}(Ko),cs=function(e){function t(t,n,r,i,o,s,a){var u=e.call(this,t,n,o,s,a)||this;return u.operator=r,u.expr=i,u}return r(t,e),t.createMinus=function(e,n,r){return new t(e,n,"-",r,"-",new ss(e,n,0),r)},t.createPlus=function(e,n,r){return new t(e,n,"+",r,"-",r,new ss(e,n,0))},t.prototype.visit=function(e,t){return void 0===t&&(t=null),void 0!==e.visitUnary?e.visitUnary(this,t):e.visitBinary(this,t)},t}(ls),hs=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.expression=r,i}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitPrefixNot(this,t)},t}(Ko),fs=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i.expression=r,i}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitNonNullAssert(this,t)},t}(Ko),ds=function(e){function t(t,n,r,i,o,s){var a=e.call(this,t,n,r)||this;return a.receiver=i,a.name=o,a.args=s,a}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitMethodCall(this,t)},t}(Qo),vs=function(e){function t(t,n,r,i,o,s){var a=e.call(this,t,n,r)||this;return a.receiver=i,a.name=o,a.args=s,a}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitSafeMethodCall(this,t)},t}(Qo),ms=function(e){function t(t,n,r,i){var o=e.call(this,t,n)||this;return o.target=r,o.args=i,o}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitFunctionCall(this,t)},t}(Ko),ys=function ys(e,t){this.start=e,this.end=t},gs=function(e){function t(t,n,r,i,o){var s=e.call(this,new zo(0,null===n?0:n.length),new ys(i,null===n?i:i+n.length))||this;return s.ast=t,s.source=n,s.location=r,s.errors=o,s}return r(t,e),t.prototype.visit=function(e,t){return void 0===t&&(t=null),e.visitASTWithSource?e.visitASTWithSource(this,t):this.ast.visit(e,t)},t.prototype.toString=function(){return this.source+" in "+this.location},t}(Ko),Es=function Es(e,t,n){this.sourceSpan=e,this.key=t,this.value=n},_s=function _s(e,t,n){this.sourceSpan=e,this.key=t,this.value=n},Ss=function(){function e(){}return e.prototype.visit=function(e,t){e.visit(this,t)},e.prototype.visitUnary=function(e,t){this.visit(e.expr,t)},e.prototype.visitBinary=function(e,t){this.visit(e.left,t),this.visit(e.right,t)},e.prototype.visitChain=function(e,t){this.visitAll(e.expressions,t)},e.prototype.visitConditional=function(e,t){this.visit(e.condition,t),this.visit(e.trueExp,t),this.visit(e.falseExp,t)},e.prototype.visitPipe=function(e,t){this.visit(e.exp,t),this.visitAll(e.args,t)},e.prototype.visitFunctionCall=function(e,t){e.target&&this.visit(e.target,t),this.visitAll(e.args,t)},e.prototype.visitImplicitReceiver=function(e,t){},e.prototype.visitThisReceiver=function(e,t){},e.prototype.visitInterpolation=function(e,t){this.visitAll(e.expressions,t)},e.prototype.visitKeyedRead=function(e,t){this.visit(e.obj,t),this.visit(e.key,t)},e.prototype.visitKeyedWrite=function(e,t){this.visit(e.obj,t),this.visit(e.key,t),this.visit(e.value,t)},e.prototype.visitLiteralArray=function(e,t){this.visitAll(e.expressions,t)},e.prototype.visitLiteralMap=function(e,t){this.visitAll(e.values,t)},e.prototype.visitLiteralPrimitive=function(e,t){},e.prototype.visitMethodCall=function(e,t){this.visit(e.receiver,t),this.visitAll(e.args,t)},e.prototype.visitPrefixNot=function(e,t){this.visit(e.expression,t)},e.prototype.visitNonNullAssert=function(e,t){this.visit(e.expression,t)},e.prototype.visitPropertyRead=function(e,t){this.visit(e.receiver,t)},e.prototype.visitPropertyWrite=function(e,t){this.visit(e.receiver,t),this.visit(e.value,t)},e.prototype.visitSafePropertyRead=function(e,t){this.visit(e.receiver,t)},e.prototype.visitSafeMethodCall=function(e,t){this.visit(e.receiver,t),this.visitAll(e.args,t)},e.prototype.visitQuote=function(e,t){},e.prototype.visitAll=function(e,t){var n,r;try{for(var o=i(e),s=o.next();!s.done;s=o.next())this.visit(s.value,t)}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}},e}(),xs=function(){function e(){}return e.prototype.visitImplicitReceiver=function(e,t){return e},e.prototype.visitThisReceiver=function(e,t){return e},e.prototype.visitInterpolation=function(e,t){return new ps(e.span,e.sourceSpan,e.strings,this.visitAll(e.expressions))},e.prototype.visitLiteralPrimitive=function(e,t){return new ss(e.span,e.sourceSpan,e.value)},e.prototype.visitPropertyRead=function(e,t){return new es(e.span,e.sourceSpan,e.nameSpan,e.receiver.visit(this),e.name)},e.prototype.visitPropertyWrite=function(e,t){return new ts(e.span,e.sourceSpan,e.nameSpan,e.receiver.visit(this),e.name,e.value.visit(this))},e.prototype.visitSafePropertyRead=function(e,t){return new ns(e.span,e.sourceSpan,e.nameSpan,e.receiver.visit(this),e.name)},e.prototype.visitMethodCall=function(e,t){return new ds(e.span,e.sourceSpan,e.nameSpan,e.receiver.visit(this),e.name,this.visitAll(e.args))},e.prototype.visitSafeMethodCall=function(e,t){return new vs(e.span,e.sourceSpan,e.nameSpan,e.receiver.visit(this),e.name,this.visitAll(e.args))},e.prototype.visitFunctionCall=function(e,t){return new ms(e.span,e.sourceSpan,e.target.visit(this),this.visitAll(e.args))},e.prototype.visitLiteralArray=function(e,t){return new as(e.span,e.sourceSpan,this.visitAll(e.expressions))},e.prototype.visitLiteralMap=function(e,t){return new us(e.span,e.sourceSpan,e.keys,this.visitAll(e.values))},e.prototype.visitUnary=function(e,t){switch(e.operator){case"+":return cs.createPlus(e.span,e.sourceSpan,e.expr.visit(this));case"-":return cs.createMinus(e.span,e.sourceSpan,e.expr.visit(this));default:throw new Error("Unknown unary operator "+e.operator)}},e.prototype.visitBinary=function(e,t){return new ls(e.span,e.sourceSpan,e.operation,e.left.visit(this),e.right.visit(this))},e.prototype.visitPrefixNot=function(e,t){return new hs(e.span,e.sourceSpan,e.expression.visit(this))},e.prototype.visitNonNullAssert=function(e,t){return new fs(e.span,e.sourceSpan,e.expression.visit(this))},e.prototype.visitConditional=function(e,t){return new Zo(e.span,e.sourceSpan,e.condition.visit(this),e.trueExp.visit(this),e.falseExp.visit(this))},e.prototype.visitPipe=function(e,t){return new os(e.span,e.sourceSpan,e.exp.visit(this),e.name,this.visitAll(e.args),e.nameSpan)},e.prototype.visitKeyedRead=function(e,t){return new rs(e.span,e.sourceSpan,e.obj.visit(this),e.key.visit(this))},e.prototype.visitKeyedWrite=function(e,t){return new is(e.span,e.sourceSpan,e.obj.visit(this),e.key.visit(this),e.value.visit(this))},e.prototype.visitAll=function(e){for(var t=[],n=0;n<e.length;++n)t[n]=e[n].visit(this);return t},e.prototype.visitChain=function(e,t){return new Jo(e.span,e.sourceSpan,this.visitAll(e.expressions))},e.prototype.visitQuote=function(e,t){return new Xo(e.span,e.sourceSpan,e.prefix,e.uninterpretedExpression,e.location)},e}(),ws=function(){function e(){}return e.prototype.visitImplicitReceiver=function(e,t){return e},e.prototype.visitThisReceiver=function(e,t){return e},e.prototype.visitInterpolation=function(e,t){var n=this.visitAll(e.expressions);return n!==e.expressions?new ps(e.span,e.sourceSpan,e.strings,n):e},e.prototype.visitLiteralPrimitive=function(e,t){return e},e.prototype.visitPropertyRead=function(e,t){var n=e.receiver.visit(this);return n!==e.receiver?new es(e.span,e.sourceSpan,e.nameSpan,n,e.name):e},e.prototype.visitPropertyWrite=function(e,t){var n=e.receiver.visit(this),r=e.value.visit(this);return n!==e.receiver||r!==e.value?new ts(e.span,e.sourceSpan,e.nameSpan,n,e.name,r):e},e.prototype.visitSafePropertyRead=function(e,t){var n=e.receiver.visit(this);return n!==e.receiver?new ns(e.span,e.sourceSpan,e.nameSpan,n,e.name):e},e.prototype.visitMethodCall=function(e,t){var n=e.receiver.visit(this),r=this.visitAll(e.args);return n!==e.receiver||r!==e.args?new ds(e.span,e.sourceSpan,e.nameSpan,n,e.name,r):e},e.prototype.visitSafeMethodCall=function(e,t){var n=e.receiver.visit(this),r=this.visitAll(e.args);return n!==e.receiver||r!==e.args?new vs(e.span,e.sourceSpan,e.nameSpan,n,e.name,r):e},e.prototype.visitFunctionCall=function(e,t){var n=e.target&&e.target.visit(this),r=this.visitAll(e.args);return n!==e.target||r!==e.args?new ms(e.span,e.sourceSpan,n,r):e},e.prototype.visitLiteralArray=function(e,t){var n=this.visitAll(e.expressions);return n!==e.expressions?new as(e.span,e.sourceSpan,n):e},e.prototype.visitLiteralMap=function(e,t){var n=this.visitAll(e.values);return n!==e.values?new us(e.span,e.sourceSpan,e.keys,n):e},e.prototype.visitUnary=function(e,t){var n=e.expr.visit(this);if(n!==e.expr)switch(e.operator){case"+":return cs.createPlus(e.span,e.sourceSpan,n);case"-":return cs.createMinus(e.span,e.sourceSpan,n);default:throw new Error("Unknown unary operator "+e.operator)}return e},e.prototype.visitBinary=function(e,t){var n=e.left.visit(this),r=e.right.visit(this);return n!==e.left||r!==e.right?new ls(e.span,e.sourceSpan,e.operation,n,r):e},e.prototype.visitPrefixNot=function(e,t){var n=e.expression.visit(this);return n!==e.expression?new hs(e.span,e.sourceSpan,n):e},e.prototype.visitNonNullAssert=function(e,t){var n=e.expression.visit(this);return n!==e.expression?new fs(e.span,e.sourceSpan,n):e},e.prototype.visitConditional=function(e,t){var n=e.condition.visit(this),r=e.trueExp.visit(this),i=e.falseExp.visit(this);return n!==e.condition||r!==e.trueExp||i!==e.falseExp?new Zo(e.span,e.sourceSpan,n,r,i):e},e.prototype.visitPipe=function(e,t){var n=e.exp.visit(this),r=this.visitAll(e.args);return n!==e.exp||r!==e.args?new os(e.span,e.sourceSpan,n,e.name,r,e.nameSpan):e},e.prototype.visitKeyedRead=function(e,t){var n=e.obj.visit(this),r=e.key.visit(this);return n!==e.obj||r!==e.key?new rs(e.span,e.sourceSpan,n,r):e},e.prototype.visitKeyedWrite=function(e,t){var n=e.obj.visit(this),r=e.key.visit(this),i=e.value.visit(this);return n!==e.obj||r!==e.key||i!==e.value?new is(e.span,e.sourceSpan,n,r,i):e},e.prototype.visitAll=function(e){for(var t=[],n=!1,r=0;r<e.length;++r){var i=e[r],o=i.visit(this);t[r]=o,n=n||o!==i}return n?t:e},e.prototype.visitChain=function(e,t){var n=this.visitAll(e.expressions);return n!==e.expressions?new Jo(e.span,e.sourceSpan,n):e},e.prototype.visitQuote=function(e,t){return e},e}(),Cs=function Cs(t,n,r,i,o,s){this.name=t,this.expression=n,this.type=r,this.sourceSpan=i,this.keySpan=o,this.valueSpan=s,this.isLiteral=this.type===e.ParsedPropertyType.LITERAL_ATTR,this.isAnimation=this.type===e.ParsedPropertyType.ANIMATION};(qo=e.ParsedPropertyType||(e.ParsedPropertyType={}))[qo.DEFAULT=0]="DEFAULT",qo[qo.LITERAL_ATTR=1]="LITERAL_ATTR",qo[qo.ANIMATION=2]="ANIMATION";var bs,Ts=function Ts(e,t,n,r,i,o,s){this.name=e,this.targetOrPhase=t,this.type=n,this.handler=r,this.sourceSpan=i,this.handlerSpan=o,this.keySpan=s},Ms=function Ms(e,t,n,r,i){this.name=e,this.value=t,this.sourceSpan=n,this.keySpan=r,this.valueSpan=i},Ps=function Ps(e,t,n,r,i,o,s,a){this.name=e,this.type=t,this.securityContext=n,this.value=r,this.unit=i,this.sourceSpan=o,this.keySpan=s,this.valueSpan=a};(bs=function bs(){}).event=It("$event");var Ns=function Ns(e,t){this.stmts=e,this.allowDefault=t,this.render3Stmts=e.map((function(e){return e instanceof lt&&e.name==t.name&&e.value instanceof Je?new ft(e.value.lhs.value):e}))};function As(t,n,r,i,o,s,a,u){t||(t=new qs(u));var p=Is({createLiteralArrayConverter:function(e){return function(e){return Ft(e)}},createLiteralMapConverter:function(e){return function(t){return Lt(e.map((function(e,n){return{key:e.key,value:t[n],quoted:e.quoted}})))}},createPipeConverter:function(e){throw new Error("Illegal State: Actions are not allowed to contain pipes. Pipe: "+e)}},r),l=new Hs(t,n,i,o,s,a),c=[];!function e(t,n){Array.isArray(t)?t.forEach((function(t){return e(t,n)})):n.push(t)}(p.visit(l,Os.Statement),c),function h(e,t,n){for(var r=e-1;r>=0;r--)n.unshift(Bs(t,r))}(l.temporaryCount,i,c),l.usesImplicitReceiver&&t.notifyImplicitReceiverUse();var f=c.length-1,d=null;if(f>=0){var v=function m(e){return e instanceof ht?e.expr:e instanceof ft?e.value:null}(c[f]);v&&(d=function y(e){return It("pd_"+e)}(i),c[f]=d.set(v.cast(pe).notIdentical(Ut(!1))).toDeclStmt(null,[e.StmtModifier.Final]))}return new Ns(c,d)}function Is(e,t){return function n(e,t){var n=new Us(e);return t.visit(n)}(e,t)}var ks,Os,Rs=function Rs(e,t){this.stmts=e,this.currValExpr=t};function Ds(t,n,r,i,o,s){t||(t=new qs);var a=new Hs(t,n,i,s),u=r.visit(a,Os.Expression),p=Fs(a,i);if(a.usesImplicitReceiver&&t.notifyImplicitReceiverUse(),0===a.temporaryCount&&o==ks.TrySimple)return new Rs([],u);if(o===ks.Expression)return new Rs(p,u);var l=function c(e){return It("currVal_"+e)}(i);return p.push(l.set(u).toDeclStmt(pe,[e.StmtModifier.Final])),new Rs(p,l)}function Fs(e,t){for(var n=[],r=0;r<e.temporaryCount;r++)n.push(Bs(t,r));return n}function Ls(e,t){return"tmp_"+e+"_"+t}function Bs(e,t){return new lt(Ls(e,t),ot)}function Vs(e,t){if(e!==Os.Expression)throw new Error("Expected an expression, but saw "+t)}function js(e,t){return e===Os.Statement?t.toStmt():t}!function(e){e[e.General=0]="General",e[e.TrySimple=1]="TrySimple",e[e.Expression=2]="Expression"}(ks||(ks={})),function(e){e[e.Statement=0]="Statement",e[e.Expression=1]="Expression"}(Os||(Os={}));var Us=function(e){function t(t){var n=e.call(this)||this;return n._converterFactory=t,n}return r(t,e),t.prototype.visitPipe=function(e,t){var n=this,r=s([e.exp],e.args).map((function(e){return e.visit(n,t)}));return new Ws(e.span,e.sourceSpan,r,this._converterFactory.createPipeConverter(e.name,r.length))},t.prototype.visitLiteralArray=function(e,t){var n=this,r=e.expressions.map((function(e){return e.visit(n,t)}));return new Ws(e.span,e.sourceSpan,r,this._converterFactory.createLiteralArrayConverter(e.expressions.length))},t.prototype.visitLiteralMap=function(e,t){var n=this,r=e.values.map((function(e){return e.visit(n,t)}));return new Ws(e.span,e.sourceSpan,r,this._converterFactory.createLiteralMapConverter(e.keys))},t}(xs),Hs=function(){function t(e,t,n,r,i,o){this._localResolver=e,this._implicitReceiver=t,this.bindingId=n,this.interpolationFunction=r,this.baseSourceSpan=i,this.implicitReceiverAccesses=o,this._nodeMap=new Map,this._resultMap=new Map,this._currentTemporary=0,this.temporaryCount=0,this.usesImplicitReceiver=!1}return t.prototype.visitUnary=function(t,n){var r;switch(t.operator){case"+":r=e.UnaryOperator.Plus;break;case"-":r=e.UnaryOperator.Minus;break;default:throw new Error("Unsupported operator "+t.operator)}return js(n,new Ye(r,this._visit(t.expr,Os.Expression),void 0,this.convertSourceSpan(t.span)))},t.prototype.visitBinary=function(t,n){var r;switch(t.operation){case"+":r=e.BinaryOperator.Plus;break;case"-":r=e.BinaryOperator.Minus;break;case"*":r=e.BinaryOperator.Multiply;break;case"/":r=e.BinaryOperator.Divide;break;case"%":r=e.BinaryOperator.Modulo;break;case"&&":r=e.BinaryOperator.And;break;case"||":r=e.BinaryOperator.Or;break;case"==":r=e.BinaryOperator.Equals;break;case"!=":r=e.BinaryOperator.NotEquals;break;case"===":r=e.BinaryOperator.Identical;break;case"!==":r=e.BinaryOperator.NotIdentical;break;case"<":r=e.BinaryOperator.Lower;break;case">":r=e.BinaryOperator.Bigger;break;case"<=":r=e.BinaryOperator.LowerEquals;break;case">=":r=e.BinaryOperator.BiggerEquals;break;default:throw new Error("Unsupported operation "+t.operation)}return js(n,new Je(r,this._visit(t.left,Os.Expression),this._visit(t.right,Os.Expression),void 0,this.convertSourceSpan(t.span)))},t.prototype.visitChain=function(e,t){return function n(e,t){if(e!==Os.Statement)throw new Error("Expected a statement, but saw "+t)}(t,e),this.visitAll(e.expressions,t)},t.prototype.visitConditional=function(e,t){return js(t,this._visit(e.condition,Os.Expression).conditional(this._visit(e.trueExp,Os.Expression),this._visit(e.falseExp,Os.Expression),this.convertSourceSpan(e.span)))},t.prototype.visitPipe=function(e,t){throw new Error("Illegal state: Pipes should have been converted into functions. Pipe: "+e.name)},t.prototype.visitFunctionCall=function(e,t){var n=this.visitAll(e.args,Os.Expression);return js(t,e instanceof Ws?e.converter(n):this._visit(e.target,Os.Expression).callFn(n,this.convertSourceSpan(e.span)))},t.prototype.visitImplicitReceiver=function(e,t){return Vs(t,e),this.usesImplicitReceiver=!0,this._implicitReceiver},t.prototype.visitThisReceiver=function(e,t){return this.visitImplicitReceiver(e,t)},t.prototype.visitInterpolation=function(e,t){Vs(t,e);for(var n=[Ut(e.expressions.length)],r=0;r<e.strings.length-1;r++)n.push(Ut(e.strings[r])),n.push(this._visit(e.expressions[r],Os.Expression));return n.push(Ut(e.strings[e.strings.length-1])),this.interpolationFunction?this.interpolationFunction(n):e.expressions.length<=9?kt(Jt.inlineInterpolate).callFn(n):kt(Jt.interpolate).callFn([n[0],Ft(n.slice(1),void 0,this.convertSourceSpan(e.span))])},t.prototype.visitKeyedRead=function(e,t){var n=this.leftMostSafeNode(e);return n?this.convertSafeAccess(e,n,t):js(t,this._visit(e.obj,Os.Expression).key(this._visit(e.key,Os.Expression)))},t.prototype.visitKeyedWrite=function(e,t){var n=this._visit(e.obj,Os.Expression),r=this._visit(e.key,Os.Expression),i=this._visit(e.value,Os.Expression);return js(t,n.key(r).set(i))},t.prototype.visitLiteralArray=function(e,t){throw new Error("Illegal State: literal arrays should have been converted into functions")},t.prototype.visitLiteralMap=function(e,t){throw new Error("Illegal State: literal maps should have been converted into functions")},t.prototype.visitLiteralPrimitive=function(e,t){return js(t,Ut(e.value,null==e.value||!0===e.value||!0===e.value?le:void 0,this.convertSourceSpan(e.span)))},t.prototype._getLocal=function(e,t){var n;return(null===(n=this._localResolver.globals)||void 0===n?void 0:n.has(e))&&t instanceof Yo?null:this._localResolver.getLocal(e)},t.prototype.visitMethodCall=function(e,t){if(e.receiver instanceof $o&&!(e.receiver instanceof Yo)&&"$any"===e.name){if(1!=(r=this.visitAll(e.args,Os.Expression)).length)throw new Error("Invalid call to $any, expected 1 argument but received "+(r.length||"none"));return r[0].cast(pe,this.convertSourceSpan(e.span))}var n=this.leftMostSafeNode(e);if(n)return this.convertSafeAccess(e,n,t);var r=this.visitAll(e.args,Os.Expression),i=this.usesImplicitReceiver,o=null,s=this._visit(e.receiver,Os.Expression);if(s===this._implicitReceiver){var a=this._getLocal(e.name,e.receiver);a&&(this.usesImplicitReceiver=i,o=a.callFn(r),this.addImplicitReceiverAccess(e.name))}return null==o&&(o=s.callMethod(e.name,r,this.convertSourceSpan(e.span))),js(t,o)},t.prototype.visitPrefixNot=function(e,t){return js(t,function n(e,t){return new Ke(e,t)}(this._visit(e.expression,Os.Expression)))},t.prototype.visitNonNullAssert=function(e,t){return js(t,function n(e,t){return new Qe(e,t)}(this._visit(e.expression,Os.Expression)))},t.prototype.visitPropertyRead=function(e,t){var n=this.leftMostSafeNode(e);if(n)return this.convertSafeAccess(e,n,t);var r=null,i=this.usesImplicitReceiver,o=this._visit(e.receiver,Os.Expression);return o===this._implicitReceiver&&(r=this._getLocal(e.name,e.receiver))&&(this.usesImplicitReceiver=i,this.addImplicitReceiverAccess(e.name)),null==r&&(r=o.prop(e.name)),js(t,r)},t.prototype.visitPropertyWrite=function(e,t){var n=this._visit(e.receiver,Os.Expression),r=this.usesImplicitReceiver,i=null;if(n===this._implicitReceiver){var o=this._getLocal(e.name,e.receiver);if(o){if(!(o instanceof Ze))throw new Error('Cannot assign value "'+(e.value instanceof es?e.value.name:void 0)+'" to template variable "'+e.name+'". Template variables are read-only.');i=o,this.usesImplicitReceiver=r,this.addImplicitReceiverAccess(e.name)}}return null===i&&(i=n.prop(e.name)),js(t,i.set(this._visit(e.value,Os.Expression)))},t.prototype.visitSafePropertyRead=function(e,t){return this.convertSafeAccess(e,this.leftMostSafeNode(e),t)},t.prototype.visitSafeMethodCall=function(e,t){return this.convertSafeAccess(e,this.leftMostSafeNode(e),t)},t.prototype.visitAll=function(e,t){var n=this;return e.map((function(e){return n._visit(e,t)}))},t.prototype.visitQuote=function(e,t){throw new Error("Quotes are not supported for evaluation!\n        Statement: "+e.uninterpretedExpression+" located at "+e.location)},t.prototype._visit=function(e,t){return this._resultMap.get(e)||(this._nodeMap.get(e)||e).visit(this,t)},t.prototype.convertSafeAccess=function(e,t,n){var r=this._visit(t.receiver,Os.Expression),i=void 0;this.needsTemporary(t.receiver)&&(r=(i=this.allocateTemporary()).set(r),this._resultMap.set(t.receiver,i));var o=r.isBlank();this._nodeMap.set(t,t instanceof vs?new ds(t.span,t.sourceSpan,t.nameSpan,t.receiver,t.name,t.args):new es(t.span,t.sourceSpan,t.nameSpan,t.receiver,t.name));var s=this._visit(e,Os.Expression);return this._nodeMap.delete(t),i&&this.releaseTemporary(i),js(n,o.conditional(Ut(null),s))},t.prototype.leftMostSafeNode=function(e){var t=this,n=function(e,n){return(t._nodeMap.get(n)||n).visit(e)};return e.visit({visitUnary:function(e){return null},visitBinary:function(e){return null},visitChain:function(e){return null},visitConditional:function(e){return null},visitFunctionCall:function(e){return null},visitImplicitReceiver:function(e){return null},visitThisReceiver:function(e){return null},visitInterpolation:function(e){return null},visitKeyedRead:function(e){return n(this,e.obj)},visitKeyedWrite:function(e){return null},visitLiteralArray:function(e){return null},visitLiteralMap:function(e){return null},visitLiteralPrimitive:function(e){return null},visitMethodCall:function(e){return n(this,e.receiver)},visitPipe:function(e){return null},visitPrefixNot:function(e){return null},visitNonNullAssert:function(e){return null},visitPropertyRead:function(e){return n(this,e.receiver)},visitPropertyWrite:function(e){return null},visitQuote:function(e){return null},visitSafeMethodCall:function(e){return n(this,e.receiver)||e},visitSafePropertyRead:function(e){return n(this,e.receiver)||e}})},t.prototype.needsTemporary=function(e){var t=this,n=function(e,n){return n&&(t._nodeMap.get(n)||n).visit(e)};return e.visit({visitUnary:function(e){return n(this,e.expr)},visitBinary:function(e){return n(this,e.left)||n(this,e.right)},visitChain:function(e){return!1},visitConditional:function(e){return n(this,e.condition)||n(this,e.trueExp)||n(this,e.falseExp)},visitFunctionCall:function(e){return!0},visitImplicitReceiver:function(e){return!1},visitThisReceiver:function(e){return!1},visitInterpolation:function(e){return function(e,t){return t.some((function(t){return n(e,t)}))}(this,e.expressions)},visitKeyedRead:function(e){return!1},visitKeyedWrite:function(e){return!1},visitLiteralArray:function(e){return!0},visitLiteralMap:function(e){return!0},visitLiteralPrimitive:function(e){return!1},visitMethodCall:function(e){return!0},visitPipe:function(e){return!0},visitPrefixNot:function(e){return n(this,e.expression)},visitNonNullAssert:function(e){return n(this,e.expression)},visitPropertyRead:function(e){return!1},visitPropertyWrite:function(e){return!1},visitQuote:function(e){return!1},visitSafeMethodCall:function(e){return!0},visitSafePropertyRead:function(e){return!1}})},t.prototype.allocateTemporary=function(){var e=this._currentTemporary++;return this.temporaryCount=Math.max(this._currentTemporary,this.temporaryCount),new Se(Ls(this.bindingId,e))},t.prototype.releaseTemporary=function(e){if(this._currentTemporary--,e.name!=Ls(this.bindingId,this._currentTemporary))throw new Error("Temporary "+e.name+" released out of order")},t.prototype.convertSourceSpan=function(e){if(this.baseSourceSpan){var t=this.baseSourceSpan.start.moveBy(e.start),n=this.baseSourceSpan.start.moveBy(e.end),r=this.baseSourceSpan.fullStart.moveBy(e.start);return new ko(t,n,r)}return null},t.prototype.addImplicitReceiverAccess=function(e){this.implicitReceiverAccesses&&this.implicitReceiverAccesses.add(e)},t}(),qs=function(){function e(e){this.globals=e}return e.prototype.notifyImplicitReceiverUse=function(){},e.prototype.getLocal=function(e){return e===bs.event.name?bs.event:null},e}(),Ws=function(e){function t(t,n,r,i){var o=e.call(this,t,n,null,r)||this;return o.args=r,o.converter=i,o}return r(t,e),t}(ms),zs=function(){function e(){this.strictStyling=!0}return e.prototype.shimCssText=function(e,t,n){void 0===n&&(n="");var r=function i(e){return e.match(ca)||[]}(e);return e=function o(e){return e.replace(la,"")}(e),e=this._insertDirectives(e),s([this._scopeCssText(e,t,n)],r).join("\n")},e.prototype._insertDirectives=function(e){return e=this._insertPolyfillDirectivesInCssText(e),this._insertPolyfillRulesInCssText(e)},e.prototype._insertPolyfillDirectivesInCssText=function(e){return e.replace(Qs,(function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[2]+"{"}))},e.prototype._insertPolyfillRulesInCssText=function(e){return e.replace(Xs,(function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=e[0].replace(e[1],"").replace(e[2],"");return e[4]+n}))},e.prototype._scopeCssText=function(e,t,n){var r=this._extractUnscopedRulesFromCssText(e);return e=this._insertPolyfillHostInCssText(e),e=this._convertColonHost(e),e=this._convertColonHostContext(e),e=this._convertShadowDOMSelectors(e),t&&(e=this._scopeSelectors(e,t,n)),(e=e+"\n"+r).trim()},e.prototype._extractUnscopedRulesFromCssText=function(e){var t,n="";for(Gs.lastIndex=0;null!==(t=Gs.exec(e));)n+=t[0].replace(t[2],"").replace(t[1],t[4])+"\n\n";return n},e.prototype._convertColonHost=function(e){return e.replace(Zs,(function(e,t,n){var r,o;if(t){var s=[],a=t.split(",").map((function(e){return e.trim()}));try{for(var u=i(a),p=u.next();!p.done;p=u.next()){var l=p.value;if(!l)break;var c=na+l.replace($s,"")+n;s.push(c)}}catch(e){r={error:e}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}return s.join(",")}return na+n}))},e.prototype._convertColonHostContext=function(e){return e.replace(ea,(function(e){for(var t,n,r=[[]];n=ta.exec(e);){var i=(null!==(t=n[1])&&void 0!==t?t:"").trim().split(",").map((function(e){return e.trim()})).filter((function(e){return""!==e})),o=r.length;_a(r,i.length);for(var s=0;s<i.length;s++)for(var a=0;a<o;a++)r[a+s*o].push(i[s]);e=n[2]}return r.map((function(t){return function n(e,t){var n=na;aa.lastIndex=0;var r=aa.test(t);if(0===e.length)return n+t;for(var i=[e.pop()||""];e.length>0;)for(var o=i.length,s=e.pop(),a=0;a<o;a++){var u=i[a];i[2*o+a]=u+" "+s,i[o+a]=s+" "+u,i[a]=s+u}return i.map((function(e){return r?""+e+t:""+e+n+t+", "+e+" "+n+t})).join(",")}(t,e)})).join(", ")}))},e.prototype._convertShadowDOMSelectors=function(e){return ia.reduce((function(e,t){return e.replace(t," ")}),e)},e.prototype._scopeSelectors=function(e,t,n){var r=this;return ya(e,(function(e){var i=e.selector,o=e.content;return"@"!=e.selector[0]?i=r._scopeSelector(e.selector,t,n,r.strictStyling):e.selector.startsWith("@media")||e.selector.startsWith("@supports")||e.selector.startsWith("@page")||e.selector.startsWith("@document")?o=r._scopeSelectors(e.content,t,n):e.selector.startsWith("@font-face")&&(o=r._stripScopingSelectors(e.content,t,n)),new ma(i,o)}))},e.prototype._stripScopingSelectors=function(e,t,n){var r=this;return ya(e,(function(e){var i=e.selector.replace(oa," ").replace(ra," "),o=r._scopeSelectors(e.content,t,n);return new ma(i,o)}))},e.prototype._scopeSelector=function(e,t,n,r){var i=this;return e.split(",").map((function(e){return e.trim().split(oa)})).map((function(e){var a=o(e),u=a[0],p=a.slice(1);return s([function(e){return i._selectorNeedsScoping(e,t)?r?i._applyStrictSelectorScope(e,t,n):i._applySelectorScope(e,t,n):e}(u)],p).join(" ")})).join(", ")},e.prototype._selectorNeedsScoping=function(e,t){return!this._makeScopeMatcher(t).test(e)},e.prototype._makeScopeMatcher=function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+sa,"m")},e.prototype._applySelectorScope=function(e,t,n){return this._applySimpleSelectorScope(e,t,n)},e.prototype._applySimpleSelectorScope=function(e,t,n){if(aa.lastIndex=0,aa.test(e)){var r=this.strictStyling?"["+n+"]":t;return e.replace(ra,(function(e,t){return t.replace(/([^:]*)(:*)(.*)/,(function(e,t,n,i){return t+r+n+i}))})).replace(aa,r+" ")}return t+" "+e},e.prototype._applyStrictSelectorScope=function(e,t,n){for(var r,i=this,o="["+(t=t.replace(/\[is=([^\]]*)\]/g,(function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return t[0]})))+"]",s=function(e){var r=e.trim();if(!r)return"";if(e.indexOf(na)>-1)r=i._applySimpleSelectorScope(e,t,n);else{var s=e.replace(aa,"");if(s.length>0){var a=s.match(/([^:]*)(:*)(.*)/);a&&(r=a[1]+o+a[2]+a[3])}}return r},a=new Ks(e),u="",p=0,l=/( |>|\+|~(?!=))\s*/g,c=!((e=a.content()).indexOf(na)>-1);null!==(r=l.exec(e));){var h=r[1],f=e.slice(p,r.index).trim();u+=((c=c||f.indexOf(na)>-1)?s(f):f)+" "+h+" ",p=l.lastIndex}var d=e.substring(p);return u+=(c=c||d.indexOf(na)>-1)?s(d):d,a.restore(u)},e.prototype._insertPolyfillHostInCssText=function(e){return e.replace(pa,Ys).replace(ua,$s)},e}(),Ks=function(){function e(e){var t=this;this.placeholders=[],this.index=0,e=this._escapeRegexMatches(e,/(\[[^\]]*\])/g),e=this._escapeRegexMatches(e,/(\\.)/g),this._content=e.replace(/(:nth-[-\w]+)(\([^)]+\))/g,(function(e,n,r){var i="__ph-"+t.index+"__";return t.placeholders.push(r),t.index++,n+i}))}return e.prototype.restore=function(e){var t=this;return e.replace(/__ph-(\d+)__/g,(function(e,n){return t.placeholders[+n]}))},e.prototype.content=function(){return this._content},e.prototype._escapeRegexMatches=function(e,t){var n=this;return e.replace(t,(function(e,t){var r="__ph-"+n.index+"__";return n.placeholders.push(t),n.index++,r}))},e}(),Qs=/polyfill-next-selector[^}]*content:[\s]*?(['"])(.*?)\1[;\s]*}([^{]*?){/gim,Xs=/(polyfill-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim,Gs=/(polyfill-unscoped-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim,$s="-shadowcsshost",Ys="-shadowcsscontext",Js="(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",Zs=new RegExp($s+Js,"gim"),ea=new RegExp(Ys+Js,"gim"),ta=new RegExp(Ys+Js,"im"),na=$s+"-no-combinator",ra=/-shadowcsshost-no-combinator([^\s]*)/,ia=[/::shadow/g,/::content/g,/\/shadow-deep\//g,/\/shadow\//g],oa=/(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g,sa="([>\\s~+[.,{:][\\s\\S]*)?$",aa=/-shadowcsshost/gim,ua=/:host/gim,pa=/:host-context/gim,la=/\/\*\s*[\s\S]*?\*\//g,ca=/\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g,ha=/(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g,fa=/%QUOTED%/g,da=new Map([["{","}"]]),va=new Map([['"','"'],["'","'"]]),ma=function ma(e,t){this.selector=e,this.content=t};function ya(e,t){var n=Ea(e,va,"%QUOTED%"),r=Ea(n.escapedString,da,"%BLOCK%"),i=0,o=0;return r.escapedString.replace(ha,(function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var o=e[2],s="",a=e[4],u="";a&&a.startsWith("{%BLOCK%")&&(s=r.blocks[i++],a=a.substring("%BLOCK%".length+1),u="{");var p=t(new ma(o,s));return""+e[1]+p.selector+e[3]+u+p.content+a})).replace(fa,(function(){return n.blocks[o++]}))}var ga=function ga(e,t){this.escapedString=e,this.blocks=t};function Ea(e,t,n){for(var r,i,o=[],s=[],a=0,u=0,p=-1,l=0;l<e.length;l++){var c=e[l];"\\"===c?l++:c===i?0==--a&&(s.push(e.substring(p,l)),o.push(n),u=l,p=-1,r=i=void 0):c===r?a++:0===a&&t.has(c)&&(r=c,i=t.get(c),a=1,o.push(e.substring(u,p=l+1)))}return-1!==p?(s.push(e.substring(p)),o.push(n)):o.push(e.substring(u)),new ga(o.join(""),s)}function _a(e,t){for(var n=e.length,r=1;r<t;r++)for(var i=0;i<n;i++)e[i+r*n]=e[i].slice(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 Sa=function Sa(e,t,n){this.name=e,this.moduleUrl=t,this.setValue=n},xa=function xa(e,t,n,r,i){this.outputCtx=e,this.stylesVar=t,this.dependencies=n,this.isShimmed=r,this.meta=i},wa=function(){function t(e){this._urlResolver=e,this._shadowCss=new zs}return t.prototype.compileComponent=function(e,t){var n=t.template;return this._compileStyles(e,t,new Un({styles:n.styles,styleUrls:n.styleUrls,moduleUrl:Rn(t.type)}),this.needsStyleShim(t),!0)},t.prototype.compileStyles=function(e,t,n,r){return void 0===r&&(r=this.needsStyleShim(t)),this._compileStyles(e,t,n,r,!1)},t.prototype.needsStyleShim=function(e){return e.template.encapsulation===g.Emulated},t.prototype._compileStyles=function(t,n,r,i,o){var s=this,a=r.styles.map((function(e){return Ut(s._shimIfNeeded(e,i))})),u=[];r.styleUrls.forEach((function(e){var n=a.length;a.push(null),u.push(new Sa(Ca(null),e,(function(e){return a[n]=t.importExpr(e)})))}));var p=Ca(o?n:null),l=It(p).set(Ft(a,new ae(pe,[Z.Const]))).toDeclStmt(null,o?[e.StmtModifier.Final]:[e.StmtModifier.Final,e.StmtModifier.Exported]);return t.statements.push(l),new xa(t,p,u,i,r)},t.prototype._shimIfNeeded=function(e,t){return t?this._shadowCss.shimCssText(e,"_ngcontent-%COMP%","_nghost-%COMP%"):e},t}();function Ca(e){var t="styles";return e&&(t+="_"+On(e.type)),t}
/**
     * @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 ba,Ta=function(){function e(e,t){void 0===t&&(t=-1),this.path=e,this.position=t}return Object.defineProperty(e.prototype,"empty",{get:function(){return!this.path||!this.path.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"head",{get:function(){return this.path[0]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tail",{get:function(){return this.path[this.path.length-1]},enumerable:!1,configurable:!0}),e.prototype.parentOf=function(e){return e&&this.path[this.path.indexOf(e)-1]},e.prototype.childOf=function(e){return this.path[this.path.indexOf(e)+1]},e.prototype.first=function(e){for(var t=this.path.length-1;t>=0;t--){var n=this.path[t];if(n instanceof e)return n}},e.prototype.push=function(e){this.path.push(e)},e.prototype.pop=function(){return this.path.pop()},e}(),Ma=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.value=t,i}return r(t,e),t.prototype.visit=function(e,t){return e.visitText(this,t)},t}(ba=function ba(e,t){this.sourceSpan=e,this.i18n=t}),Pa=function(e){function t(t,n,r,i,o,s){var a=e.call(this,i,s)||this;return a.switchValue=t,a.type=n,a.cases=r,a.switchValueSourceSpan=o,a}return r(t,e),t.prototype.visit=function(e,t){return e.visitExpansion(this,t)},t}(ba),Na=function(){function e(e,t,n,r,i){this.value=e,this.expression=t,this.sourceSpan=n,this.valueSourceSpan=r,this.expSourceSpan=i}return e.prototype.visit=function(e,t){return e.visitExpansionCase(this,t)},e}(),Aa=function(e){function t(t,n,r,i,o,s){var a=e.call(this,r,s)||this;return a.name=t,a.value=n,a.keySpan=i,a.valueSpan=o,a}return r(t,e),t.prototype.visit=function(e,t){return e.visitAttribute(this,t)},t}(ba),Ia=function(e){function t(t,n,r,i,o,s,a){void 0===s&&(s=null);var u=e.call(this,i,a)||this;return u.name=t,u.attrs=n,u.children=r,u.startSourceSpan=o,u.endSourceSpan=s,u}return r(t,e),t.prototype.visit=function(e,t){return e.visitElement(this,t)},t}(ba),ka=function(){function e(e,t){this.value=e,this.sourceSpan=t}return e.prototype.visit=function(e,t){return e.visitComment(this,t)},e}();function Oa(e,t,n){void 0===n&&(n=null);var r=[],i=e.visit?function(t){return e.visit(t,n)||t.visit(e,n)}:function(t){return t.visit(e,n)};return t.forEach((function(e){var t=i(e);t&&r.push(t)})),r}var Ra,Da=function(){function e(){}return e.prototype.visitElement=function(e,t){this.visitChildren(t,(function(t){t(e.attrs),t(e.children)}))},e.prototype.visitAttribute=function(e,t){},e.prototype.visitText=function(e,t){},e.prototype.visitComment=function(e,t){},e.prototype.visitExpansion=function(e,t){return this.visitChildren(t,(function(t){t(e.cases)}))},e.prototype.visitExpansionCase=function(e,t){},e.prototype.visitChildren=function(e,t){var n=[],r=this;return t((function i(t){t&&n.push(Oa(r,t,e))})),Array.prototype.concat.apply([],n)},e}();!function(e){e[e.TAG_OPEN_START=0]="TAG_OPEN_START",e[e.TAG_OPEN_END=1]="TAG_OPEN_END",e[e.TAG_OPEN_END_VOID=2]="TAG_OPEN_END_VOID",e[e.TAG_CLOSE=3]="TAG_CLOSE",e[e.INCOMPLETE_TAG_OPEN=4]="INCOMPLETE_TAG_OPEN",e[e.TEXT=5]="TEXT",e[e.ESCAPABLE_RAW_TEXT=6]="ESCAPABLE_RAW_TEXT",e[e.RAW_TEXT=7]="RAW_TEXT",e[e.COMMENT_START=8]="COMMENT_START",e[e.COMMENT_END=9]="COMMENT_END",e[e.CDATA_START=10]="CDATA_START",e[e.CDATA_END=11]="CDATA_END",e[e.ATTR_NAME=12]="ATTR_NAME",e[e.ATTR_QUOTE=13]="ATTR_QUOTE",e[e.ATTR_VALUE=14]="ATTR_VALUE",e[e.DOC_TYPE=15]="DOC_TYPE",e[e.EXPANSION_FORM_START=16]="EXPANSION_FORM_START",e[e.EXPANSION_CASE_VALUE=17]="EXPANSION_CASE_VALUE",e[e.EXPANSION_CASE_EXP_START=18]="EXPANSION_CASE_EXP_START",e[e.EXPANSION_CASE_EXP_END=19]="EXPANSION_CASE_EXP_END",e[e.EXPANSION_FORM_END=20]="EXPANSION_FORM_END",e[e.EOF=21]="EOF"}(Ra||(Ra={}));var Fa,La=function La(e,t,n){this.type=e,this.parts=t,this.sourceSpan=n},Ba=function(e){function t(t,n,r){var i=e.call(this,r,t)||this;return i.tokenType=n,i}return r(t,e),t}(Oo),Va=function Va(e,t,n){this.tokens=e,this.errors=t,this.nonNormalizedIcuExpressions=n},ja=/\r\n?/g;function Ua(e){return'Unexpected character "'+(0===e?"EOF":String.fromCharCode(e))+'"'}function Ha(e){return'Unknown entity "'+e+'" - use the "&#<decimal>;" or  "&#x<hex>;" syntax'}!function(e){e.HEX="hexadecimal",e.DEC="decimal"}(Fa||(Fa={}));var qa=function qa(e){this.error=e},Wa=function(){function t(e,t,n){this._getTagDefinition=t,this._currentTokenStart=null,this._currentTokenType=null,this._expansionCaseStack=[],this._inInterpolation=!1,this.tokens=[],this.errors=[],this.nonNormalizedIcuExpressions=[],this._tokenizeIcu=n.tokenizeExpansionForms||!1,this._interpolationConfig=n.interpolationConfig||yo,this._leadingTriviaCodePoints=n.leadingTriviaChars&&n.leadingTriviaChars.map((function(e){return e.codePointAt(0)||0}));var r=n.range||{endPos:e.content.length,startPos:0,startLine:0,startCol:0};this._cursor=n.escapedString?new Ya(e,r):new $a(e,r),this._preserveLineEndings=n.preserveLineEndings||!1,this._escapedString=n.escapedString||!1,this._i18nNormalizeLineEndingsInICUs=n.i18nNormalizeLineEndingsInICUs||!1;try{this._cursor.init()}catch(e){this.handleError(e)}}return t.prototype._processCarriageReturns=function(e){return this._preserveLineEndings?e:e.replace(ja,"\n")},t.prototype.tokenize=function(){for(;0!==this._cursor.peek();){var e=this._cursor.clone();try{this._attemptCharCode(60)?this._attemptCharCode(33)?this._attemptCharCode(91)?this._consumeCdata(e):this._attemptCharCode(45)?this._consumeComment(e):this._consumeDocType(e):this._attemptCharCode(47)?this._consumeTagClose(e):this._consumeTagOpen(e):this._tokenizeIcu&&this._tokenizeExpansionForm()||this._consumeText()}catch(e){this.handleError(e)}}this._beginToken(Ra.EOF),this._endToken([])},t.prototype._tokenizeExpansionForm=function(){if(this.isExpansionFormStart())return this._consumeExpansionFormStart(),!0;if(function e(t){return 125!==t}(this._cursor.peek())&&this._isInExpansionForm())return this._consumeExpansionCaseStart(),!0;if(125===this._cursor.peek()){if(this._isInExpansionCase())return this._consumeExpansionCaseEnd(),!0;if(this._isInExpansionForm())return this._consumeExpansionFormEnd(),!0}return!1},t.prototype._beginToken=function(e,t){void 0===t&&(t=this._cursor.clone()),this._currentTokenStart=t,this._currentTokenType=e},t.prototype._endToken=function(e,t){if(null===this._currentTokenStart)throw new Ba("Programming error - attempted to end a token when there was no start to the token",this._currentTokenType,this._cursor.getSpan(t));if(null===this._currentTokenType)throw new Ba("Programming error - attempted to end a token which has no token type",null,this._cursor.getSpan(this._currentTokenStart));var n=new La(this._currentTokenType,e,this._cursor.getSpan(this._currentTokenStart,this._leadingTriviaCodePoints));return this.tokens.push(n),this._currentTokenStart=null,this._currentTokenType=null,n},t.prototype._createError=function(e,t){this._isInExpansionForm()&&(e+=' (Do you have an unescaped "{" in your template? Use "{{ \'{\' }}") to escape it.)');var n=new Ba(e,this._currentTokenType,t);return this._currentTokenStart=null,this._currentTokenType=null,new qa(n)},t.prototype.handleError=function(e){if(e instanceof Ja&&(e=this._createError(e.msg,this._cursor.getSpan(e.cursor))),!(e instanceof qa))throw e;this.errors.push(e.error)},t.prototype._attemptCharCode=function(e){return this._cursor.peek()===e&&(this._cursor.advance(),!0)},t.prototype._attemptCharCodeCaseInsensitive=function(e){return!!function t(e,n){return Ga(e)==Ga(n)}(this._cursor.peek(),e)&&(this._cursor.advance(),!0)},t.prototype._requireCharCode=function(e){var t=this._cursor.clone();if(!this._attemptCharCode(e))throw this._createError(Ua(this._cursor.peek()),this._cursor.getSpan(t))},t.prototype._attemptStr=function(e){var t=e.length;if(this._cursor.charsLeft()<t)return!1;for(var n=this._cursor.clone(),r=0;r<t;r++)if(!this._attemptCharCode(e.charCodeAt(r)))return this._cursor=n,!1;return!0},t.prototype._attemptStrCaseInsensitive=function(e){for(var t=0;t<e.length;t++)if(!this._attemptCharCodeCaseInsensitive(e.charCodeAt(t)))return!1;return!0},t.prototype._requireStr=function(e){var t=this._cursor.clone();if(!this._attemptStr(e))throw this._createError(Ua(this._cursor.peek()),this._cursor.getSpan(t))},t.prototype._attemptCharCodeUntilFn=function(e){for(;!e(this._cursor.peek());)this._cursor.advance()},t.prototype._requireCharCodeUntilFn=function(e,t){var n=this._cursor.clone();if(this._attemptCharCodeUntilFn(e),this._cursor.diff(n)<t)throw this._createError(Ua(this._cursor.peek()),this._cursor.getSpan(n))},t.prototype._attemptUntilChar=function(e){for(;this._cursor.peek()!==e;)this._cursor.advance()},t.prototype._readChar=function(e){if(e&&38===this._cursor.peek())return this._decodeEntity();var t=String.fromCodePoint(this._cursor.peek());return this._cursor.advance(),t},t.prototype._decodeEntity=function(){var e=this._cursor.clone();if(this._cursor.advance(),!this._attemptCharCode(35)){var t=this._cursor.clone();if(this._attemptCharCodeUntilFn(Xa),59!=this._cursor.peek())return this._cursor=t,"&";var n=this._cursor.getChars(t);this._cursor.advance();var r=v[n];if(!r)throw this._createError(Ha(n),this._cursor.getSpan(e));return r}var i=this._attemptCharCode(120)||this._attemptCharCode(88),o=this._cursor.clone();if(this._attemptCharCodeUntilFn(Qa),59!=this._cursor.peek())throw this._cursor.advance(),this._createError(function s(e,t){return'Unable to parse entity "'+t+'" - '+e+' character reference entities must end with ";"'}(i?Fa.HEX:Fa.DEC,this._cursor.getChars(e)),this._cursor.getSpan());var a=this._cursor.getChars(o);this._cursor.advance();try{var u=parseInt(a,i?16:10);return String.fromCharCode(u)}catch(t){throw this._createError(Ha(this._cursor.getChars(e)),this._cursor.getSpan())}},t.prototype._consumeRawText=function(e,t){this._beginToken(e?Ra.ESCAPABLE_RAW_TEXT:Ra.RAW_TEXT);for(var n=[];;){var r=this._cursor.clone(),i=t();if(this._cursor=r,i)break;n.push(this._readChar(e))}return this._endToken([this._processCarriageReturns(n.join(""))])},t.prototype._consumeComment=function(e){var t=this;this._beginToken(Ra.COMMENT_START,e),this._requireCharCode(45),this._endToken([]),this._consumeRawText(!1,(function(){return t._attemptStr("--\x3e")})),this._beginToken(Ra.COMMENT_END),this._requireStr("--\x3e"),this._endToken([])},t.prototype._consumeCdata=function(e){var t=this;this._beginToken(Ra.CDATA_START,e),this._requireStr("CDATA["),this._endToken([]),this._consumeRawText(!1,(function(){return t._attemptStr("]]>")})),this._beginToken(Ra.CDATA_END),this._requireStr("]]>"),this._endToken([])},t.prototype._consumeDocType=function(e){this._beginToken(Ra.DOC_TYPE,e);var t=this._cursor.clone();this._attemptUntilChar(62);var n=this._cursor.getChars(t);this._cursor.advance(),this._endToken([n])},t.prototype._consumePrefixAndName=function(){for(var e,t,n=this._cursor.clone(),r="";58!==this._cursor.peek()&&!(((e=this._cursor.peek())<97||122<e)&&(e<65||90<e)&&(e<48||e>57));)this._cursor.advance();return 58===this._cursor.peek()?(r=this._cursor.getChars(n),this._cursor.advance(),t=this._cursor.clone()):t=n,this._requireCharCodeUntilFn(Ka,""===r?0:1),[r,this._cursor.getChars(t)]},t.prototype._consumeTagOpen=function(t){var n,r,i;try{if(!To(this._cursor.peek()))throw this._createError(Ua(this._cursor.peek()),this._cursor.getSpan(t));for(r=(i=this._consumeTagOpenStart(t)).parts[0],n=i.parts[1],this._attemptCharCodeUntilFn(za);47!==this._cursor.peek()&&62!==this._cursor.peek()&&60!==this._cursor.peek()&&0!==this._cursor.peek();)this._consumeAttributeName(),this._attemptCharCodeUntilFn(za),this._attemptCharCode(61)&&(this._attemptCharCodeUntilFn(za),this._consumeAttributeValue()),this._attemptCharCodeUntilFn(za);this._consumeTagOpenEnd()}catch(e){if(e instanceof qa)return void(i?i.type=Ra.INCOMPLETE_TAG_OPEN:(this._beginToken(Ra.TEXT,t),this._endToken(["<"])));throw e}var o=this._getTagDefinition(n).getContentType(r);o===e.TagContentType.RAW_TEXT?this._consumeRawTextWithTagClose(r,n,!1):o===e.TagContentType.ESCAPABLE_RAW_TEXT&&this._consumeRawTextWithTagClose(r,n,!0)},t.prototype._consumeRawTextWithTagClose=function(e,t,n){var r=this;this._consumeRawText(n,(function(){return!!r._attemptCharCode(60)&&!!r._attemptCharCode(47)&&(r._attemptCharCodeUntilFn(za),!!r._attemptStrCaseInsensitive(t)&&(r._attemptCharCodeUntilFn(za),r._attemptCharCode(62)))})),this._beginToken(Ra.TAG_CLOSE),this._requireCharCodeUntilFn((function(e){return 62===e}),3),this._cursor.advance(),this._endToken([e,t])},t.prototype._consumeTagOpenStart=function(e){this._beginToken(Ra.TAG_OPEN_START,e);var t=this._consumePrefixAndName();return this._endToken(t)},t.prototype._consumeAttributeName=function(){var e=this._cursor.peek();if(39===e||34===e)throw this._createError(Ua(e),this._cursor.getSpan());this._beginToken(Ra.ATTR_NAME);var t=this._consumePrefixAndName();this._endToken(t)},t.prototype._consumeAttributeValue=function(){var e;if(39===this._cursor.peek()||34===this._cursor.peek()){this._beginToken(Ra.ATTR_QUOTE);var t=this._cursor.peek();this._cursor.advance(),this._endToken([String.fromCodePoint(t)]),this._beginToken(Ra.ATTR_VALUE);for(var n=[];this._cursor.peek()!==t;)n.push(this._readChar(!0));e=n.join(""),this._endToken([this._processCarriageReturns(e)]),this._beginToken(Ra.ATTR_QUOTE),this._cursor.advance(),this._endToken([String.fromCodePoint(t)])}else{this._beginToken(Ra.ATTR_VALUE);var r=this._cursor.clone();this._requireCharCodeUntilFn(Ka,1),e=this._cursor.getChars(r),this._endToken([this._processCarriageReturns(e)])}},t.prototype._consumeTagOpenEnd=function(){var e=this._attemptCharCode(47)?Ra.TAG_OPEN_END_VOID:Ra.TAG_OPEN_END;this._beginToken(e),this._requireCharCode(62),this._endToken([])},t.prototype._consumeTagClose=function(e){this._beginToken(Ra.TAG_CLOSE,e),this._attemptCharCodeUntilFn(za);var t=this._consumePrefixAndName();this._attemptCharCodeUntilFn(za),this._requireCharCode(62),this._endToken(t)},t.prototype._consumeExpansionFormStart=function(){this._beginToken(Ra.EXPANSION_FORM_START),this._requireCharCode(123),this._endToken([]),this._expansionCaseStack.push(Ra.EXPANSION_FORM_START),this._beginToken(Ra.RAW_TEXT);var e=this._readUntil(44),t=this._processCarriageReturns(e);if(this._i18nNormalizeLineEndingsInICUs)this._endToken([t]);else{var n=this._endToken([e]);t!==e&&this.nonNormalizedIcuExpressions.push(n)}this._requireCharCode(44),this._attemptCharCodeUntilFn(za),this._beginToken(Ra.RAW_TEXT);var r=this._readUntil(44);this._endToken([r]),this._requireCharCode(44),this._attemptCharCodeUntilFn(za)},t.prototype._consumeExpansionCaseStart=function(){this._beginToken(Ra.EXPANSION_CASE_VALUE);var e=this._readUntil(123).trim();this._endToken([e]),this._attemptCharCodeUntilFn(za),this._beginToken(Ra.EXPANSION_CASE_EXP_START),this._requireCharCode(123),this._endToken([]),this._attemptCharCodeUntilFn(za),this._expansionCaseStack.push(Ra.EXPANSION_CASE_EXP_START)},t.prototype._consumeExpansionCaseEnd=function(){this._beginToken(Ra.EXPANSION_CASE_EXP_END),this._requireCharCode(125),this._endToken([]),this._attemptCharCodeUntilFn(za),this._expansionCaseStack.pop()},t.prototype._consumeExpansionFormEnd=function(){this._beginToken(Ra.EXPANSION_FORM_END),this._requireCharCode(125),this._endToken([]),this._expansionCaseStack.pop()},t.prototype._consumeText=function(){var e=this._cursor.clone();this._beginToken(Ra.TEXT,e);var t=[];do{this._interpolationConfig&&this._attemptStr(this._interpolationConfig.start)?(t.push(this._interpolationConfig.start),this._inInterpolation=!0):this._interpolationConfig&&this._inInterpolation&&this._attemptStr(this._interpolationConfig.end)?(t.push(this._interpolationConfig.end),this._inInterpolation=!1):t.push(this._readChar(!0))}while(!this._isTextEnd());this._endToken([this._processCarriageReturns(t.join(""))])},t.prototype._isTextEnd=function(){if(60===this._cursor.peek()||0===this._cursor.peek())return!0;if(this._tokenizeIcu&&!this._inInterpolation){if(this.isExpansionFormStart())return!0;if(125===this._cursor.peek()&&this._isInExpansionCase())return!0}return!1},t.prototype._readUntil=function(e){var t=this._cursor.clone();return this._attemptUntilChar(e),this._cursor.getChars(t)},t.prototype._isInExpansionCase=function(){return this._expansionCaseStack.length>0&&this._expansionCaseStack[this._expansionCaseStack.length-1]===Ra.EXPANSION_CASE_EXP_START},t.prototype._isInExpansionForm=function(){return this._expansionCaseStack.length>0&&this._expansionCaseStack[this._expansionCaseStack.length-1]===Ra.EXPANSION_FORM_START},t.prototype.isExpansionFormStart=function(){if(123!==this._cursor.peek())return!1;if(this._interpolationConfig){var e=this._cursor.clone(),t=this._attemptStr(this._interpolationConfig.start);return this._cursor=e,!t}return!0},t}();function za(e){return!Co(e)||0===e}function Ka(e){return Co(e)||62===e||60===e||47===e||39===e||34===e||61===e||0===e}function Qa(e){return 59==e||0==e||!function t(e){return e>=97&&e<=102||e>=65&&e<=70||bo(e)}(e)}function Xa(e){return 59==e||0==e||!To(e)}function Ga(e){return e>=97&&e<=122?e-97+65:e}var $a=function(){function e(t,n){if(t instanceof e){this.file=t.file,this.input=t.input,this.end=t.end;var r=t.state;this.state={peek:r.peek,offset:r.offset,line:r.line,column:r.column}}else{if(!n)throw new Error("Programming error: the range argument must be provided with a file argument.");this.file=t,this.input=t.content,this.end=n.endPos,this.state={peek:-1,offset:n.startPos,line:n.startLine,column:n.startCol}}}return e.prototype.clone=function(){return new e(this)},e.prototype.peek=function(){return this.state.peek},e.prototype.charsLeft=function(){return this.end-this.state.offset},e.prototype.diff=function(e){return this.state.offset-e.state.offset},e.prototype.advance=function(){this.advanceState(this.state)},e.prototype.init=function(){this.updatePeek(this.state)},e.prototype.getSpan=function(e,t){var n=e=e||this;if(t)for(;this.diff(e)>0&&-1!==t.indexOf(e.peek());)n===e&&(e=e.clone()),e.advance();var r=this.locationFromCursor(e),i=this.locationFromCursor(this),o=n!==e?this.locationFromCursor(n):r;return new ko(r,i,o)},e.prototype.getChars=function(e){return this.input.substring(e.state.offset,this.state.offset)},e.prototype.charAt=function(e){return this.input.charCodeAt(e)},e.prototype.advanceState=function(e){if(e.offset>=this.end)throw this.state=e,new Ja('Unexpected character "EOF"',this);var t=this.charAt(e.offset);10===t?(e.line++,e.column=0):Mo(t)||e.column++,e.offset++,this.updatePeek(e)},e.prototype.updatePeek=function(e){e.peek=e.offset>=this.end?0:this.charAt(e.offset)},e.prototype.locationFromCursor=function(e){return new Ao(e.file,e.state.offset,e.state.line,e.state.column)},e}(),Ya=function(e){function t(n,r){var i=this;return n instanceof t?(i=e.call(this,n)||this).internalState=Object.assign({},n.internalState):(i=e.call(this,n,r)||this).internalState=i.state,i}return r(t,e),t.prototype.advance=function(){this.state=this.internalState,e.prototype.advance.call(this),this.processEscapeSequence()},t.prototype.init=function(){e.prototype.init.call(this),this.processEscapeSequence()},t.prototype.clone=function(){return new t(this)},t.prototype.getChars=function(e){for(var t=e.clone(),n="";t.internalState.offset<this.internalState.offset;)n+=String.fromCodePoint(t.peek()),t.advance();return n},t.prototype.processEscapeSequence=function(){var e=this,t=function(){return e.internalState.peek};if(92===t())if(this.internalState=Object.assign({},this.state),this.advanceState(this.internalState),110===t())this.state.peek=10;else if(114===t())this.state.peek=13;else if(118===t())this.state.peek=11;else if(116===t())this.state.peek=9;else if(98===t())this.state.peek=8;else if(102===t())this.state.peek=12;else if(117===t())if(this.advanceState(this.internalState),123===t()){this.advanceState(this.internalState);for(var n=this.clone(),r=0;125!==t();)this.advanceState(this.internalState),r++;this.state.peek=this.decodeHexDigits(n,r)}else n=this.clone(),this.advanceState(this.internalState),this.advanceState(this.internalState),this.advanceState(this.internalState),this.state.peek=this.decodeHexDigits(n,4);else if(120===t())this.advanceState(this.internalState),n=this.clone(),this.advanceState(this.internalState),this.state.peek=this.decodeHexDigits(n,2);else if(Po(t())){for(var i="",o=(r=0,this.clone());Po(t())&&r<3;)o=this.clone(),i+=String.fromCodePoint(t()),this.advanceState(this.internalState),r++;this.state.peek=parseInt(i,8),this.internalState=o.internalState}else Mo(this.internalState.peek)?(this.advanceState(this.internalState),this.state=this.internalState):this.state.peek=this.internalState.peek},t.prototype.decodeHexDigits=function(e,t){var n=this.input.substr(e.internalState.offset,t),r=parseInt(n,16);if(isNaN(r))throw e.state=e.internalState,new Ja("Invalid hexadecimal escape sequence",e);return r},t}($a),Ja=function Ja(e,t){this.msg=e,this.cursor=t},Za=function(e){function t(t,n,r){var i=e.call(this,n,r)||this;return i.elementName=t,i}return r(t,e),t.create=function(e,n,r){return new t(e,n,r)},t}(Oo),eu=function eu(e,t){this.rootNodes=e,this.errors=t},tu=function(){function e(e){this.getTagDefinition=e}return e.prototype.parse=function(e,t,n){var r=function i(e,t,n,r){void 0===r&&(r={});var i=new Wa(new Io(e,t),n,r);return i.tokenize(),new Va(function o(e){for(var t=[],n=void 0,r=0;r<e.length;r++){var i=e[r];n&&n.type==Ra.TEXT&&i.type==Ra.TEXT?(n.parts[0]+=i.parts[0],n.sourceSpan.end=i.sourceSpan.end):t.push(n=i)}return t}(i.tokens),i.errors,i.nonNormalizedIcuExpressions)}(e,t,this.getTagDefinition,n),o=new nu(r.tokens,this.getTagDefinition);return o.build(),new eu(o.rootNodes,r.errors.concat(o.errors))},e}(),nu=function(){function e(e,t){this.tokens=e,this.getTagDefinition=t,this._index=-1,this._elementStack=[],this.rootNodes=[],this.errors=[],this._advance()}return e.prototype.build=function(){for(;this._peek.type!==Ra.EOF;)this._peek.type===Ra.TAG_OPEN_START||this._peek.type===Ra.INCOMPLETE_TAG_OPEN?this._consumeStartTag(this._advance()):this._peek.type===Ra.TAG_CLOSE?this._consumeEndTag(this._advance()):this._peek.type===Ra.CDATA_START?(this._closeVoidElement(),this._consumeCdata(this._advance())):this._peek.type===Ra.COMMENT_START?(this._closeVoidElement(),this._consumeComment(this._advance())):this._peek.type===Ra.TEXT||this._peek.type===Ra.RAW_TEXT||this._peek.type===Ra.ESCAPABLE_RAW_TEXT?(this._closeVoidElement(),this._consumeText(this._advance())):this._peek.type===Ra.EXPANSION_FORM_START?this._consumeExpansion(this._advance()):this._advance()},e.prototype._advance=function(){var e=this._peek;return this._index<this.tokens.length-1&&this._index++,this._peek=this.tokens[this._index],e},e.prototype._advanceIf=function(e){return this._peek.type===e?this._advance():null},e.prototype._consumeCdata=function(e){this._consumeText(this._advance()),this._advanceIf(Ra.CDATA_END)},e.prototype._consumeComment=function(e){var t=this._advanceIf(Ra.RAW_TEXT);this._advanceIf(Ra.COMMENT_END);var n=null!=t?t.parts[0].trim():null;this._addToParent(new ka(n,e.sourceSpan))},e.prototype._consumeExpansion=function(e){for(var t=this._advance(),n=this._advance(),r=[];this._peek.type===Ra.EXPANSION_CASE_VALUE;){var i=this._parseExpansionCase();if(!i)return;r.push(i)}if(this._peek.type===Ra.EXPANSION_FORM_END){var o=new ko(e.sourceSpan.start,this._peek.sourceSpan.end,e.sourceSpan.fullStart);this._addToParent(new Pa(t.parts[0],n.parts[0],r,o,t.sourceSpan)),this._advance()}else this.errors.push(Za.create(null,this._peek.sourceSpan,"Invalid ICU message. Missing '}'."))},e.prototype._parseExpansionCase=function(){var t=this._advance();if(this._peek.type!==Ra.EXPANSION_CASE_EXP_START)return this.errors.push(Za.create(null,this._peek.sourceSpan,"Invalid ICU message. Missing '{'.")),null;var n=this._advance(),r=this._collectExpansionExpTokens(n);if(!r)return null;var i=this._advance();r.push(new La(Ra.EOF,[],i.sourceSpan));var o=new e(r,this.getTagDefinition);if(o.build(),o.errors.length>0)return this.errors=this.errors.concat(o.errors),null;var s=new ko(t.sourceSpan.start,i.sourceSpan.end,t.sourceSpan.fullStart),a=new ko(n.sourceSpan.start,i.sourceSpan.end,n.sourceSpan.fullStart);return new Na(t.parts[0],o.rootNodes,s,t.sourceSpan,a)},e.prototype._collectExpansionExpTokens=function(e){for(var t=[],n=[Ra.EXPANSION_CASE_EXP_START];;){if(this._peek.type!==Ra.EXPANSION_FORM_START&&this._peek.type!==Ra.EXPANSION_CASE_EXP_START||n.push(this._peek.type),this._peek.type===Ra.EXPANSION_CASE_EXP_END){if(!ru(n,Ra.EXPANSION_CASE_EXP_START))return this.errors.push(Za.create(null,e.sourceSpan,"Invalid ICU message. Missing '}'.")),null;if(n.pop(),0==n.length)return t}if(this._peek.type===Ra.EXPANSION_FORM_END){if(!ru(n,Ra.EXPANSION_FORM_START))return this.errors.push(Za.create(null,e.sourceSpan,"Invalid ICU message. Missing '}'.")),null;n.pop()}if(this._peek.type===Ra.EOF)return this.errors.push(Za.create(null,e.sourceSpan,"Invalid ICU message. Missing '}'.")),null;t.push(this._advance())}},e.prototype._consumeText=function(e){var t=e.parts[0];if(t.length>0&&"\n"==t[0]){var n=this._getParentElement();null!=n&&0==n.children.length&&this.getTagDefinition(n.name).ignoreFirstLf&&(t=t.substring(1))}t.length>0&&this._addToParent(new Ma(t,e.sourceSpan))},e.prototype._closeVoidElement=function(){var e=this._getParentElement();e&&this.getTagDefinition(e.name).isVoid&&this._elementStack.pop()},e.prototype._consumeStartTag=function(e){for(var t=o(e.parts,2),n=t[0],r=t[1],i=[];this._peek.type===Ra.ATTR_NAME;)i.push(this._consumeAttr(this._advance()));var s=this._getElementFullName(n,r,this._getParentElement()),a=!1;if(this._peek.type===Ra.TAG_OPEN_END_VOID){this._advance(),a=!0;var u=this.getTagDefinition(s);u.canSelfClose||null!==c(s)||u.isVoid||this.errors.push(Za.create(s,e.sourceSpan,'Only void and foreign elements can be self closed "'+e.parts[1]+'"'))}else this._peek.type===Ra.TAG_OPEN_END&&(this._advance(),a=!1);var p=this._peek.sourceSpan.fullStart,l=new ko(e.sourceSpan.start,p,e.sourceSpan.fullStart),h=new ko(e.sourceSpan.start,p,e.sourceSpan.fullStart),f=new Ia(s,i,[],l,h,void 0);this._pushElement(f),a?this._popElement(s,l):e.type===Ra.INCOMPLETE_TAG_OPEN&&(this._popElement(s,null),this.errors.push(Za.create(s,l,'Opening tag "'+s+'" not terminated.')))},e.prototype._pushElement=function(e){var t=this._getParentElement();t&&this.getTagDefinition(t.name).isClosedByChild(e.name)&&this._elementStack.pop(),this._addToParent(e),this._elementStack.push(e)},e.prototype._consumeEndTag=function(e){var t=this._getElementFullName(e.parts[0],e.parts[1],this._getParentElement());this.getTagDefinition(t).isVoid?this.errors.push(Za.create(t,e.sourceSpan,'Void elements do not have end tags "'+e.parts[1]+'"')):this._popElement(t,e.sourceSpan)||this.errors.push(Za.create(t,e.sourceSpan,'Unexpected closing tag "'+t+'". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags'))},e.prototype._popElement=function(e,t){for(var n=this._elementStack.length-1;n>=0;n--){var r=this._elementStack[n];if(r.name==e)return r.endSourceSpan=t,r.sourceSpan.end=null!==t?t.end:r.sourceSpan.end,this._elementStack.splice(n,this._elementStack.length-n),!0;if(!this.getTagDefinition(r.name).closedByParent)return!1}return!1},e.prototype._consumeAttr=function(e){var t=h(e.parts[0],e.parts[1]),n=e.sourceSpan.end,r="",i=void 0;if(this._peek.type===Ra.ATTR_QUOTE&&this._advance(),this._peek.type===Ra.ATTR_VALUE){var o=this._advance();r=o.parts[0],n=o.sourceSpan.end,i=o.sourceSpan}this._peek.type===Ra.ATTR_QUOTE&&(n=this._advance().sourceSpan.end);var s=new ko(e.sourceSpan.start,e.sourceSpan.end);return new Aa(t,r,new ko(e.sourceSpan.start,n,e.sourceSpan.fullStart),s,i)},e.prototype._getParentElement=function(){return this._elementStack.length>0?this._elementStack[this._elementStack.length-1]:null},e.prototype._addToParent=function(e){var t=this._getParentElement();null!=t?t.children.push(e):this.rootNodes.push(e)},e.prototype._getElementFullName=function(e,t,n){if(""===e&&""===(e=this.getTagDefinition(t).implicitNamespacePrefix||"")&&null!=n){var r=a(n.name)[1];this.getTagDefinition(r).preventNamespaceInheritance||(e=c(n.name))}return h(e,t)},e}();function ru(e,t){return e.length>0&&e[e.length-1]===t}var iu=function(e){function t(){return e.call(this,y)||this}return r(t,e),t.prototype.parse=function(t,n,r){return e.prototype.parse.call(this,t,n,r)},t}(tu),ou=new Set(["pre","template","textarea","script","style"]),su=new RegExp("[^ \f\n\r\t\v ᠎ - \u2028\u2029  　\ufeff]"),au=new RegExp("[ \f\n\r\t\v ᠎ - \u2028\u2029  　\ufeff]{2,}","g");
/**
     * @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 uu(e){return e.replace(new RegExp("","g")," ")}var pu=function(){function e(){}return e.prototype.visitElement=function(e,t){return ou.has(e.name)||function n(e){return e.some((function(e){return"ngPreserveWhitespaces"===e.name}))}(e.attrs)?new Ia(e.name,Oa(this,e.attrs),e.children,e.sourceSpan,e.startSourceSpan,e.endSourceSpan,e.i18n):new Ia(e.name,e.attrs,function r(e,t){var n=[];return t.forEach((function(r,i){var o=r.visit(e,{prev:t[i-1],next:t[i+1]});o&&n.push(o)})),n}(this,e.children),e.sourceSpan,e.startSourceSpan,e.endSourceSpan,e.i18n)},e.prototype.visitAttribute=function(e,t){return"ngPreserveWhitespaces"!==e.name?e:null},e.prototype.visitText=function(e,t){return e.value.match(su)||t&&(t.prev instanceof Pa||t.next instanceof Pa)?new Ma(uu(e.value).replace(au," "),e.sourceSpan,e.i18n):null},e.prototype.visitComment=function(e,t){return e},e.prototype.visitExpansion=function(e,t){return e},e.prototype.visitExpansionCase=function(e,t){return e},e}(),lu=["zero","one","two","few","many","other"];function cu(e){var t=new mu;return new du(Oa(t,e),t.isExpanded,t.errors)}var hu,fu,du=function du(e,t,n){this.nodes=e,this.expanded=t,this.errors=n},vu=function(e){function t(t,n){return e.call(this,t,n)||this}return r(t,e),t}(Oo),mu=function(){function e(){this.isExpanded=!1,this.errors=[]}return e.prototype.visitElement=function(e,t){return new Ia(e.name,e.attrs,Oa(this,e.children),e.sourceSpan,e.startSourceSpan,e.endSourceSpan)},e.prototype.visitAttribute=function(e,t){return e},e.prototype.visitText=function(e,t){return e},e.prototype.visitComment=function(e,t){return e},e.prototype.visitExpansion=function(e,t){return this.isExpanded=!0,"plural"==e.type?function n(e,t){var n=e.cases.map((function(e){-1!=lu.indexOf(e.value)||e.value.match(/^=\d+$/)||t.push(new vu(e.valueSourceSpan,'Plural cases should be "=<number>" or one of '+lu.join(", ")));var n=cu(e.expression);return t.push.apply(t,s(n.errors)),new Ia("ng-template",[new Aa("ngPluralCase",""+e.value,e.valueSourceSpan,void 0,void 0,void 0)],n.nodes,e.sourceSpan,e.sourceSpan,e.sourceSpan)})),r=new Aa("[ngPlural]",e.switchValue,e.switchValueSourceSpan,void 0,void 0,void 0);return new Ia("ng-container",[r],n,e.sourceSpan,e.sourceSpan,e.sourceSpan)}(e,this.errors):function r(e,t){var n=e.cases.map((function(e){var n=cu(e.expression);return t.push.apply(t,s(n.errors)),new Ia("ng-template","other"===e.value?[new Aa("ngSwitchDefault","",e.valueSourceSpan,void 0,void 0,void 0)]:[new Aa("ngSwitchCase",""+e.value,e.valueSourceSpan,void 0,void 0,void 0)],n.nodes,e.sourceSpan,e.sourceSpan,e.sourceSpan)})),r=new Aa("[ngSwitch]",e.switchValue,e.switchValueSourceSpan,void 0,void 0,void 0);return new Ia("ng-container",[r],n,e.sourceSpan,e.sourceSpan,e.sourceSpan)}(e,this.errors)},e.prototype.visitExpansionCase=function(e,t){throw new Error("Should not be reached")},e}(),yu=function(){function e(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitText(this,t)},e}(),gu=function(){function e(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitBoundText(this,t)},e}(),Eu=function(){function e(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitAttr(this,t)},e}(),_u=((hu={})[4]=4,hu[1]=1,hu[2]=2,hu[0]=0,hu[3]=3,hu),Su=function(){function e(e,t,n,r,i,o){this.name=e,this.type=t,this.securityContext=n,this.value=r,this.unit=i,this.sourceSpan=o,this.isAnimation=4===this.type}return e.fromBoundProperty=function(t){return new e(t.name,_u[t.type],t.securityContext,t.value,t.unit,t.sourceSpan)},e.prototype.visit=function(e,t){return e.visitElementProperty(this,t)},e}(),xu=function(){function e(t,n,r,i,o,s){this.name=t,this.target=n,this.phase=r,this.handler=i,this.sourceSpan=o,this.handlerSpan=s,this.fullName=e.calcFullName(this.name,this.target,this.phase),this.isAnimation=!!this.phase}return e.calcFullName=function(e,t,n){return t?t+":"+e:n?"@"+e+"."+n:e},e.fromParsedEvent=function(t){return new e(t.name,0===t.type?t.targetOrPhase:null,1===t.type?t.targetOrPhase:null,t.handler,t.sourceSpan,t.handlerSpan)},e.prototype.visit=function(e,t){return e.visitEvent(this,t)},e}(),wu=function(){function e(e,t,n,r){this.name=e,this.value=t,this.originalValue=n,this.sourceSpan=r}return e.prototype.visit=function(e,t){return e.visitReference(this,t)},e}(),Cu=function(){function e(e,t,n,r){this.name=e,this.value=t,this.sourceSpan=n,this.valueSpan=r}return e.fromParsedVariable=function(t){return new e(t.name,t.value,t.sourceSpan,t.valueSpan)},e.prototype.visit=function(e,t){return e.visitVariable(this,t)},e}(),bu=function(){function e(e,t,n,r,i,o,s,a,u,p,l,c,h){this.name=e,this.attrs=t,this.inputs=n,this.outputs=r,this.references=i,this.directives=o,this.providers=s,this.hasViewContainer=a,this.queryMatches=u,this.children=p,this.ngContentIndex=l,this.sourceSpan=c,this.endSourceSpan=h}return e.prototype.visit=function(e,t){return e.visitElement(this,t)},e}(),Tu=function(){function e(e,t,n,r,i,o,s,a,u,p,l){this.attrs=e,this.outputs=t,this.references=n,this.variables=r,this.directives=i,this.providers=o,this.hasViewContainer=s,this.queryMatches=a,this.children=u,this.ngContentIndex=p,this.sourceSpan=l}return e.prototype.visit=function(e,t){return e.visitEmbeddedTemplate(this,t)},e}(),Mu=function(){function e(e,t,n,r){this.directiveName=e,this.templateName=t,this.value=n,this.sourceSpan=r}return e.prototype.visit=function(e,t){return e.visitDirectiveProperty(this,t)},e}(),Pu=function(){function e(e,t,n,r,i,o){this.directive=e,this.inputs=t,this.hostProperties=n,this.hostEvents=r,this.contentQueryStartId=i,this.sourceSpan=o}return e.prototype.visit=function(e,t){return e.visitDirective(this,t)},e}(),Nu=function(){function e(e,t,n,r,i,o,s,a){this.token=e,this.multiProvider=t,this.eager=n,this.providers=r,this.providerType=i,this.lifecycleHooks=o,this.sourceSpan=s,this.isModule=a}return e.prototype.visit=function(e,t){return null},e}();(fu=e.ProviderAstType||(e.ProviderAstType={}))[fu.PublicService=0]="PublicService",fu[fu.PrivateService=1]="PrivateService",fu[fu.Component=2]="Component",fu[fu.Directive=3]="Directive",fu[fu.Builtin=4]="Builtin";var Au=function(){function e(e,t,n){this.index=e,this.ngContentIndex=t,this.sourceSpan=n}return e.prototype.visit=function(e,t){return e.visitNgContent(this,t)},e}(),Iu=function(){function e(){}return e.prototype.visitNgContent=function(e,t){},e.prototype.visitEmbeddedTemplate=function(e,t){},e.prototype.visitElement=function(e,t){},e.prototype.visitReference=function(e,t){},e.prototype.visitVariable=function(e,t){},e.prototype.visitEvent=function(e,t){},e.prototype.visitElementProperty=function(e,t){},e.prototype.visitAttr=function(e,t){},e.prototype.visitBoundText=function(e,t){},e.prototype.visitText=function(e,t){},e.prototype.visitDirective=function(e,t){},e.prototype.visitDirectiveProperty=function(e,t){},e}(),ku=function(e){function t(){return e.call(this)||this}return r(t,e),t.prototype.visitEmbeddedTemplate=function(e,t){return this.visitChildren(t,(function(t){t(e.attrs),t(e.references),t(e.variables),t(e.directives),t(e.providers),t(e.children)}))},t.prototype.visitElement=function(e,t){return this.visitChildren(t,(function(t){t(e.attrs),t(e.inputs),t(e.outputs),t(e.references),t(e.directives),t(e.providers),t(e.children)}))},t.prototype.visitDirective=function(e,t){return this.visitChildren(t,(function(t){t(e.inputs),t(e.hostProperties),t(e.hostEvents)}))},t.prototype.visitChildren=function(e,t){var n=[],r=this;return t((function i(t){t&&t.length&&n.push(Ou(r,t,e))})),Array.prototype.concat.apply([],n)},t}(Iu);function Ou(e,t,n){void 0===n&&(n=null);var r=[],i=e.visit?function(t){return e.visit(t,n)||t.visit(e,n)}:function(t){return t.visit(e,n)};return t.forEach((function(e){var t=i(e);t&&r.push(t)})),r}var Ru=function(e){function t(t,n){return e.call(this,n,t)||this}return r(t,e),t}(Oo),Du=function Du(e,t){var n=this;this.reflector=e,this.component=t,this.errors=[],this.viewQueries=function r(e){var t=1,n=new Map;return e.viewQueries&&e.viewQueries.forEach((function(e){return Uu(n,{meta:e,queryId:t++})})),n}(t),this.viewProviders=new Map,t.viewProviders.forEach((function(e){null==n.viewProviders.get(jn(e.token))&&n.viewProviders.set(jn(e.token),!0)}))},Fu=function(){function t(t,n,r,i,o,s,a,u,p){var l=this;this.viewContext=t,this._parent=n,this._isViewRoot=r,this._directiveAsts=i,this._sourceSpan=p,this._transformedProviders=new Map,this._seenProviders=new Map,this._queriedTokens=new Map,this.transformedHasViewContainer=!1,this._attrs={},o.forEach((function(e){return l._attrs[e.name]=e.value}));var c=i.map((function(e){return e.directive}));if(this._allProviders=function h(t,n,r){var i=new Map;return t.forEach((function(t){ju([{token:{identifier:t.type},useClass:t.type}],t.isComponent?e.ProviderAstType.Component:e.ProviderAstType.Directive,!0,n,r,i,!1)})),t.filter((function(e){return e.isComponent})).concat(t.filter((function(e){return!e.isComponent}))).forEach((function(t){ju(t.providers,e.ProviderAstType.PublicService,!1,n,r,i,!1),ju(t.viewProviders,e.ProviderAstType.PrivateService,!1,n,r,i,!1)})),i}(c,p,t.errors),this._contentQueries=function f(e,t){var n=e,r=new Map;return t.forEach((function(e,t){e.queries&&e.queries.forEach((function(e){return Uu(r,{meta:e,queryId:n++})}))})),r}(u,c),Array.from(this._allProviders.values()).forEach((function(e){l._addQueryReadsTo(e.token,e.token,l._queriedTokens)})),a){var d=tn(this.viewContext.reflector,Jt.TemplateRef);this._addQueryReadsTo(d,d,this._queriedTokens)}s.forEach((function(e){var t=e.value||tn(l.viewContext.reflector,Jt.ElementRef);l._addQueryReadsTo({value:e.name},t,l._queriedTokens)})),this._queriedTokens.get(this.viewContext.reflector.resolveExternalReference(Jt.ViewContainerRef))&&(this.transformedHasViewContainer=!0),Array.from(this._allProviders.values()).forEach((function(e){(e.eager||l._queriedTokens.get(jn(e.token)))&&l._getOrCreateLocalProvider(e.providerType,e.token,!0)}))}return t.prototype.afterElement=function(){var e=this;Array.from(this._allProviders.values()).forEach((function(t){e._getOrCreateLocalProvider(t.providerType,t.token,!1)}))},Object.defineProperty(t.prototype,"transformProviders",{get:function(){var e=[],t=[];return this._transformedProviders.forEach((function(n){n.eager?t.push(n):e.push(n)})),e.concat(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"transformedDirectiveAsts",{get:function(){var e=this.transformProviders.map((function(e){return e.token.identifier})),t=this._directiveAsts.slice();return t.sort((function(t,n){return e.indexOf(t.directive.type)-e.indexOf(n.directive.type)})),t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"queryMatches",{get:function(){var e=[];return this._queriedTokens.forEach((function(t){e.push.apply(e,s(t))})),e},enumerable:!1,configurable:!0}),t.prototype._addQueryReadsTo=function(e,t,n){this._getQueriesFor(e).forEach((function(e){var r=e.meta.read||t,i=jn(r),o=n.get(i);o||n.set(i,o=[]),o.push({queryId:e.queryId,value:r})}))},t.prototype._getQueriesFor=function(e){for(var t,n=[],r=this,i=0;null!==r;)(t=r._contentQueries.get(jn(e)))&&n.push.apply(n,s(t.filter((function(e){return e.meta.descendants||i<=1})))),r._directiveAsts.length>0&&i++,r=r._parent;return(t=this.viewContext.viewQueries.get(jn(e)))&&n.push.apply(n,s(t)),n},t.prototype._getOrCreateLocalProvider=function(t,n,r){var i=this,o=this._allProviders.get(jn(n));if(!o||(t===e.ProviderAstType.Directive||t===e.ProviderAstType.PublicService)&&o.providerType===e.ProviderAstType.PrivateService||(t===e.ProviderAstType.PrivateService||t===e.ProviderAstType.PublicService)&&o.providerType===e.ProviderAstType.Builtin)return null;var s=this._transformedProviders.get(jn(n));if(s)return s;if(null!=this._seenProviders.get(jn(n)))return this.viewContext.errors.push(new Ru("Cannot instantiate cyclic dependency! "+Vn(n),this._sourceSpan)),null;this._seenProviders.set(jn(n),!0);var a=o.providers.map((function(e){var t=e.useValue,n=e.useExisting,s=void 0;if(null!=e.useExisting){var a=i._getDependency(o.providerType,{token:e.useExisting},r);null!=a.token?n=a.token:(n=null,t=a.value)}else e.useFactory?s=(e.deps||e.useFactory.diDeps).map((function(e){return i._getDependency(o.providerType,e,r)})):e.useClass&&(s=(e.deps||e.useClass.diDeps).map((function(e){return i._getDependency(o.providerType,e,r)})));return Bu(e,{useExisting:n,useValue:t,deps:s})}));return s=Vu(o,{eager:r,providers:a}),this._transformedProviders.set(jn(n),s),s},t.prototype._getLocalDependency=function(t,n,r){if(void 0===r&&(r=!1),n.isAttribute){var i=this._attrs[n.token.value];return{isValue:!0,value:null==i?null:i}}if(null!=n.token){if(t===e.ProviderAstType.Directive||t===e.ProviderAstType.Component){if(jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.Renderer)||jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.ElementRef)||jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.ChangeDetectorRef)||jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.TemplateRef))return n;jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.ViewContainerRef)&&(this.transformedHasViewContainer=!0)}if(jn(n.token)===this.viewContext.reflector.resolveExternalReference(Jt.Injector))return n;if(null!=this._getOrCreateLocalProvider(t,n.token,r))return n}return null},t.prototype._getDependency=function(t,n,r){void 0===r&&(r=!1);var i=this,o=r,s=null;if(n.isSkipSelf||(s=this._getLocalDependency(t,n,r)),n.isSelf)!s&&n.isOptional&&(s={isValue:!0,value:null});else{for(;!s&&i._parent;)i._isViewRoot&&(o=!1),s=(i=i._parent)._getLocalDependency(e.ProviderAstType.PublicService,n,o);s||(s=!n.isHost||this.viewContext.component.isHost||this.viewContext.component.type.reference===jn(n.token)||null!=this.viewContext.viewProviders.get(jn(n.token))?n:n.isOptional?{isValue:!0,value:null}:null)}return s||this.viewContext.errors.push(new Ru("No provider for "+Vn(n.token),this._sourceSpan)),s},t}(),Lu=function(){function t(t,n,r,i){var o=this;this.reflector=t,this._transformedProviders=new Map,this._seenProviders=new Map,this._errors=[],this._allProviders=new Map,n.transitiveModule.modules.forEach((function(t){ju([{token:{identifier:t},useClass:t}],e.ProviderAstType.PublicService,!0,i,o._errors,o._allProviders,!0)})),ju(n.transitiveModule.providers.map((function(e){return e.provider})).concat(r),e.ProviderAstType.PublicService,!1,i,this._errors,this._allProviders,!1)}return t.prototype.parse=function(){var e=this;if(Array.from(this._allProviders.values()).forEach((function(t){e._getOrCreateLocalProvider(t.token,t.eager)})),this._errors.length>0){var t=this._errors.join("\n");throw new Error("Provider parse errors:\n"+t)}var n=[],r=[];return this._transformedProviders.forEach((function(e){e.eager?r.push(e):n.push(e)})),n.concat(r)},t.prototype._getOrCreateLocalProvider=function(e,t){var n=this,r=this._allProviders.get(jn(e));if(!r)return null;var i=this._transformedProviders.get(jn(e));if(i)return i;if(null!=this._seenProviders.get(jn(e)))return this._errors.push(new Ru("Cannot instantiate cyclic dependency! "+Vn(e),r.sourceSpan)),null;this._seenProviders.set(jn(e),!0);var o=r.providers.map((function(e){var i=e.useValue,o=e.useExisting,s=void 0;if(null!=e.useExisting){var a=n._getDependency({token:e.useExisting},t,r.sourceSpan);null!=a.token?o=a.token:(o=null,i=a.value)}else e.useFactory?s=(e.deps||e.useFactory.diDeps).map((function(e){return n._getDependency(e,t,r.sourceSpan)})):e.useClass&&(s=(e.deps||e.useClass.diDeps).map((function(e){return n._getDependency(e,t,r.sourceSpan)})));return Bu(e,{useExisting:o,useValue:i,deps:s})}));return i=Vu(r,{eager:t,providers:o}),this._transformedProviders.set(jn(e),i),i},t.prototype._getDependency=function(e,t,n){return void 0===t&&(t=!1),e.isSkipSelf||null==e.token||jn(e.token)===this.reflector.resolveExternalReference(Jt.Injector)||jn(e.token)===this.reflector.resolveExternalReference(Jt.ComponentFactoryResolver)||this._getOrCreateLocalProvider(e.token,t),e},t}();function Bu(e,t){return{token:e.token,useClass:e.useClass,useExisting:t.useExisting,useFactory:e.useFactory,useValue:t.useValue,deps:t.deps,multi:e.multi}}function Vu(e,t){return new Nu(e.token,e.multiProvider,e.eager||t.eager,t.providers,e.providerType,e.lifecycleHooks,e.sourceSpan,e.isModule)}function ju(e,t,n,r,i,o,s){e.forEach((function(e){var a=o.get(jn(e.token));null!=a&&!!a.multiProvider!=!!e.multi&&i.push(new Ru("Mixing multi and non multi provider is not possible for token "+Vn(a.token),r)),a?(e.multi||(a.providers.length=0),a.providers.push(e)):(a=new Nu(e.token,!!e.multi,n||!(e.useClass||e.useExisting||e.useFactory),[e],t,e.token.identifier&&e.token.identifier.lifecycleHooks?e.token.identifier.lifecycleHooks:[],r,s),o.set(jn(e.token),a))}))}function Uu(e,t){t.meta.selectors.forEach((function(n){var r=e.get(jn(n));r||(r=[],e.set(jn(n),r)),r.push(t)}))}
/**
     * @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 Hu=function Hu(e,t){this.style=e,this.styleUrls=t};function qu(e){if(null==e||0===e.length||"/"==e[0])return!1;var t=e.match(Qu);return null===t||"package"==t[1]||"asset"==t[1]}var Wu,zu=/@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g,Ku=/\/\*(?!#\s*(?:sourceURL|sourceMappingURL)=)[\s\S]+?\*\//g,Qu=/^([^:/?#]+):/,Xu=function(){function t(e,t,n,r,i){if(this._exprParser=e,this._interpolationConfig=t,this._schemaRegistry=n,this.errors=i,this.pipesByName=null,this._usedPipes=new Map,r){var o=new Map;r.forEach((function(e){return o.set(e.name,e)})),this.pipesByName=o}}return Object.defineProperty(t.prototype,"interpolationConfig",{get:function(){return this._interpolationConfig},enumerable:!1,configurable:!0}),t.prototype.getUsedPipes=function(){return Array.from(this._usedPipes.values())},t.prototype.createBoundHostProperties=function(e,t){var n=this;if(e.hostProperties){var r=[];return Object.keys(e.hostProperties).forEach((function(i){var o=e.hostProperties[i];"string"==typeof o?n.parsePropertyBinding(i,o,!0,t,t.start.offset,void 0,[],r,t):n._reportError('Value of the host property binding "'+i+'" needs to be a string representing an expression but got "'+o+'" ('+typeof o+")",t)})),r}return null},t.prototype.createDirectiveHostPropertyAsts=function(e,t,n){var r=this,i=this.createBoundHostProperties(e,n);return i&&i.map((function(e){return r.createBoundElementProperty(t,e)}))},t.prototype.createDirectiveHostEventAsts=function(e,t){var n=this;if(e.hostListeners){var r=[];return Object.keys(e.hostListeners).forEach((function(i){var o=e.hostListeners[i];"string"==typeof o?n.parseEvent(i,o,t,t,[],r,t):n._reportError('Value of the host listener "'+i+'" needs to be a string representing an expression but got "'+o+'" ('+typeof o+")",t)})),r}return null},t.prototype.parseInterpolation=function(e,t){var n=t.start.toString(),r=t.fullStart.offset;try{var i=this._exprParser.parseInterpolation(e,n,r,this._interpolationConfig);return i&&this._reportExpressionParserErrors(i.errors,t),this._checkPipes(i,t),i}catch(e){return this._reportError(""+e,t),this._exprParser.wrapLiteralPrimitive("ERROR",n,r)}},t.prototype.parseInterpolationExpression=function(e,t){var n=t.start.toString(),r=t.start.offset;try{var i=this._exprParser.parseInterpolationExpression(e,n,r);return i&&this._reportExpressionParserErrors(i.errors,t),this._checkPipes(i,t),i}catch(e){return this._reportError(""+e,t),this._exprParser.wrapLiteralPrimitive("ERROR",n,r)}},t.prototype.parseInlineTemplateBinding=function(e,t,n,r,o,s,a,u){var p,l,c=this._parseTemplateBindings(e,t,n,n.start.offset+"*".length,r);try{for(var h=i(c),f=h.next();!f.done;f=h.next()){var d=f.value,v=Ju(n,d.sourceSpan),m=d.key.source,y=Ju(n,d.key.span);if(d instanceof Es){var g=d.value?d.value.source:"$implicit",E=d.value?Ju(n,d.value.span):void 0;a.push(new Ms(m,g,v,y,E))}else if(d.value){var _=u?v:n;E=Ju(n,d.value.ast.sourceSpan),this._parsePropertyAst(m,d.value,_,y,E,o,s)}else o.push([m,""]),this.parseLiteralAttr(m,null,y,r,void 0,o,s,y)}}catch(e){p={error:e}}finally{try{f&&!f.done&&(l=h.return)&&l.call(h)}finally{if(p)throw p.error}}},t.prototype._parseTemplateBindings=function(t,n,r,i,o){var s=this,a=r.start.toString();try{var u=this._exprParser.parseTemplateBindings(t,n,a,i,o);return this._reportExpressionParserErrors(u.errors,r),u.templateBindings.forEach((function(e){e.value instanceof gs&&s._checkPipes(e.value,r)})),u.warnings.forEach((function(t){s._reportError(t,r,e.ParseErrorLevel.WARNING)})),u.templateBindings}catch(e){return this._reportError(""+e,r),[]}},t.prototype.parseLiteralAttr=function(t,n,r,i,o,s,a,u){$u(t)?(t=t.substring(1),void 0!==u&&(u=Ju(u,new ys(u.start.offset+1,u.end.offset))),n&&this._reportError('Assigning animation triggers via @prop="exp" attributes with an expression is invalid. Use property bindings (e.g. [@prop]="exp") or use an attribute without a value (e.g. @prop) instead.',r,e.ParseErrorLevel.ERROR),this._parseAnimation(t,n,r,i,u,o,s,a)):a.push(new Cs(t,this._exprParser.wrapLiteralPrimitive(n,"",i),e.ParsedPropertyType.LITERAL_ATTR,r,u,o))},t.prototype.parsePropertyBinding=function(e,t,n,r,i,o,s,a,u){0===e.length&&this._reportError("Property name is missing in binding",r);var p=!1;e.startsWith("animate-")?(p=!0,e=e.substring("animate-".length),void 0!==u&&(u=Ju(u,new ys(u.start.offset+"animate-".length,u.end.offset)))):$u(e)&&(p=!0,e=e.substring(1),void 0!==u&&(u=Ju(u,new ys(u.start.offset+1,u.end.offset)))),p?this._parseAnimation(e,t,r,i,u,o,s,a):this._parsePropertyAst(e,this._parseBinding(t,n,o||r,i),r,u,o,s,a)},t.prototype.parsePropertyInterpolation=function(e,t,n,r,i,o,s){var a=this.parseInterpolation(t,r||n);return!!a&&(this._parsePropertyAst(e,a,n,s,r,i,o),!0)},t.prototype._parsePropertyAst=function(t,n,r,i,o,s,a){s.push([t,n.source]),a.push(new Cs(t,n,e.ParsedPropertyType.DEFAULT,r,i,o))},t.prototype._parseAnimation=function(t,n,r,i,o,s,a,u){0===t.length&&this._reportError("Animation trigger is missing",r);var p=this._parseBinding(n||"undefined",!1,s||r,i);a.push([t,p.source]),u.push(new Cs(t,p,e.ParsedPropertyType.ANIMATION,r,o,s))},t.prototype._parseBinding=function(e,t,n,r){var i=(n&&n.start||"(unknown)").toString();try{var o=t?this._exprParser.parseSimpleBinding(e,i,r,this._interpolationConfig):this._exprParser.parseBinding(e,i,r,this._interpolationConfig);return o&&this._reportExpressionParserErrors(o.errors,n),this._checkPipes(o,n),o}catch(e){return this._reportError(""+e,n),this._exprParser.wrapLiteralPrimitive("ERROR",i,r)}},t.prototype.createBoundElementProperty=function(e,t,n,r){if(void 0===n&&(n=!1),void 0===r&&(r=!0),t.isAnimation)return new Ps(t.name,4,O.NONE,t.expression,null,t.sourceSpan,t.keySpan,t.valueSpan);var i=null,o=void 0,s=null,a=t.name.split("."),u=void 0;if(a.length>1)if("attr"==a[0]){s=a.slice(1).join("."),n||this._validatePropertyOrAttributeName(s,t.sourceSpan,!0),u=Yu(this._schemaRegistry,e,s,!0);var p=s.indexOf(":");if(p>-1){var l=s.substring(0,p),c=s.substring(p+1);s=h(l,c)}o=1}else"class"==a[0]?(s=a[1],o=2,u=[O.NONE]):"style"==a[0]&&(i=a.length>2?a[2]:null,s=a[1],o=3,u=[O.STYLE]);if(null===s){var f=this._schemaRegistry.getMappedPropName(t.name);s=r?f:t.name,u=Yu(this._schemaRegistry,e,f,!1),o=0,n||this._validatePropertyOrAttributeName(f,t.sourceSpan,!1)}return new Ps(s,o,u[0],t.expression,i,t.sourceSpan,t.keySpan,t.valueSpan)},t.prototype.parseEvent=function(e,t,n,r,i,o,s){0===e.length&&this._reportError("Event name is missing in binding",n),$u(e)?(e=e.substr(1),void 0!==s&&(s=Ju(s,new ys(s.start.offset+1,s.end.offset))),this._parseAnimationEvent(e,t,n,r,o,s)):this._parseRegularEvent(e,t,n,r,i,o,s)},t.prototype.calcPossibleSecurityContexts=function(e,t,n){var r=this._schemaRegistry.getMappedPropName(t);return Yu(this._schemaRegistry,e,r,n)},t.prototype._parseAnimationEvent=function(e,t,n,r,i,o){var s=function a(e,t){return an(e,".",t)}(e,[e,""]),u=s[0],p=s[1].toLowerCase(),l=this._parseAction(t,r);i.push(new Ts(u,p,1,l,n,r,o)),0===u.length&&this._reportError("Animation event name is missing in binding",n),p?"start"!==p&&"done"!==p&&this._reportError('The provided animation output phase value "'+p+'" for "@'+u+'" is not supported (use start or done)',n):this._reportError("The animation trigger output event (@"+u+") is missing its phase value name (start or done are currently supported)",n)},t.prototype._parseRegularEvent=function(e,t,n,r,i,s,a){var u=o(sn(e,[null,e]),2),p=u[0],l=u[1],c=this._parseAction(t,r);i.push([e,c.source]),s.push(new Ts(l,p,0,c,n,r,a))},t.prototype._parseAction=function(e,t){var n=(t&&t.start||"(unknown").toString(),r=t&&t.start?t.start.offset:0;try{var i=this._exprParser.parseAction(e,n,r,this._interpolationConfig);return i&&this._reportExpressionParserErrors(i.errors,t),!i||i.ast instanceof Go?(this._reportError("Empty expressions are not allowed",t),this._exprParser.wrapLiteralPrimitive("ERROR",n,r)):(this._checkPipes(i,t),i)}catch(e){return this._reportError(""+e,t),this._exprParser.wrapLiteralPrimitive("ERROR",n,r)}},t.prototype._reportError=function(t,n,r){void 0===r&&(r=e.ParseErrorLevel.ERROR),this.errors.push(new Oo(n,t,r))},t.prototype._reportExpressionParserErrors=function(e,t){var n,r;try{for(var o=i(e),s=o.next();!s.done;s=o.next())this._reportError(s.value.message,t)}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}},t.prototype._checkPipes=function(e,t){var n=this;if(e&&this.pipesByName){var r=new Gu;e.visit(r),r.pipes.forEach((function(e,r){var i=n.pipesByName.get(r);i?n._usedPipes.set(r,i):n._reportError("The pipe '"+r+"' could not be found",new ko(t.start.moveBy(e.span.start),t.start.moveBy(e.span.end)))}))}},t.prototype._validatePropertyOrAttributeName=function(t,n,r){var i=r?this._schemaRegistry.validateAttribute(t):this._schemaRegistry.validateProperty(t);i.error&&this._reportError(i.msg,n,e.ParseErrorLevel.ERROR)},t}(),Gu=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.pipes=new Map,t}return r(t,e),t.prototype.visitPipe=function(e,t){return this.pipes.set(e.name,e),e.exp.visit(this),this.visitAll(e.args,t),null},t}(Ss);function $u(e){return"@"==e[0]}function Yu(e,t,n,r){var i=[];return S.parse(t).forEach((function(t){var o=t.element?[t.element]:e.allKnownElementNames(),a=new Set(t.notSelectors.filter((function(e){return e.isElementSelector()})).map((function(e){return e.element}))),u=o.filter((function(e){return!a.has(e)}));i.push.apply(i,s(u.map((function(t){return e.securityContext(t,n,r)}))))})),0===i.length?[O.NONE]:Array.from(new Set(i)).sort()}function Ju(e,t){var n=t.start-e.start.offset,r=t.end-e.end.offset;return new ko(e.start.moveBy(n),e.end.moveBy(r),e.fullStart.moveBy(n),e.details)}
/**
     * @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 Zu(e){var t=null,n=null,r=null,i=!1,o="";e.attrs.forEach((function(e){var s=e.name.toLowerCase();"select"==s?t=e.value:"href"==s?n=e.value:"rel"==s?r=e.value:"ngNonBindable"==e.name?i=!0:"ngProjectAs"==e.name&&e.value.length>0&&(o=e.value)})),t=function s(e){return null===e||0===e.length?"*":e}(t);var a=e.name.toLowerCase(),u=Wu.OTHER;return p(a)?u=Wu.NG_CONTENT:"style"==a?u=Wu.STYLE:"script"==a?u=Wu.SCRIPT:"link"==a&&"stylesheet"==r&&(u=Wu.STYLESHEET),new tp(u,t,n,i,o)}!function(e){e[e.NG_CONTENT=0]="NG_CONTENT",e[e.STYLE=1]="STYLE",e[e.STYLESHEET=2]="STYLESHEET",e[e.SCRIPT=3]="SCRIPT",e[e.OTHER=4]="OTHER"}(Wu||(Wu={}));var ep,tp=function tp(e,t,n,r,i){this.type=e,this.selectAttr=t,this.hrefAttr=n,this.nonBindable=r,this.projectAs=i},np=/^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.*))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/;function rp(){return ep||(ep=S.parse("*")[0]),ep}var ip=function(e){function t(t,n,r){return e.call(this,n,t,r)||this}return r(t,e),t}(Oo),op=function op(e,t,n){this.templateAst=e,this.usedPipes=t,this.errors=n},sp=function(){function t(e,t,n,r,i,o,s){this._config=e,this._reflector=t,this._exprParser=n,this._schemaRegistry=r,this._htmlParser=i,this._console=o,this.transforms=s}return Object.defineProperty(t.prototype,"expressionParser",{get:function(){return this._exprParser},enumerable:!1,configurable:!0}),t.prototype.parse=function(t,n,r,i,o,s,a){var u,p=this.tryParse(t,n,r,i,o,s,a),l=p.errors.filter((function(t){return t.level===e.ParseErrorLevel.WARNING})),c=p.errors.filter((function(t){return t.level===e.ParseErrorLevel.ERROR}));if(l.length>0&&(null===(u=this._console)||void 0===u||u.warn("Template parse warnings:\n"+l.join("\n"))),c.length>0)throw mn("Template parse errors:\n"+c.join("\n"),c);return{template:p.templateAst,pipes:p.usedPipes}},t.prototype.tryParse=function(e,t,n,r,i,o,s){var a="string"==typeof t?this._htmlParser.parse(t,o,{tokenizeExpansionForms:!0,interpolationConfig:this.getInterpolationConfig(e)}):t;return s||(a=function u(e){return new eu(Oa(new pu,e.rootNodes),e.errors)}(a)),this.tryParseHtml(this.expandHtml(a),e,n,r,i)},t.prototype.tryParseHtml=function(e,t,n,r,i){var o,a=e.errors,u=[];if(e.rootNodes.length>0){var p=mp(n),l=mp(r),c=new Du(this._reflector,t),h=void 0;t.template&&t.template.interpolation&&(h={start:t.template.interpolation[0],end:t.template.interpolation[1]});var f=new Xu(this._exprParser,h,this._schemaRegistry,l,a),d=new ap(this._reflector,this._config,c,p,f,this._schemaRegistry,i,a);o=Oa(d,e.rootNodes,fp),a.push.apply(a,s(c.errors)),u.push.apply(u,s(f.getUsedPipes()))}else o=[];return this._assertNoReferenceDuplicationOnTemplate(o,a),a.length>0||this.transforms&&this.transforms.forEach((function(e){o=Ou(e,o)})),new op(o,u,a)},t.prototype.expandHtml=function(e,t){void 0===t&&(t=!1);var n=e.errors;if(0==n.length||t){var r=cu(e.rootNodes);n.push.apply(n,s(r.errors)),e=new eu(r.nodes,n)}return e},t.prototype.getInterpolationConfig=function(e){if(e.template)return mo.fromArray(e.template.interpolation)},t.prototype._assertNoReferenceDuplicationOnTemplate=function(t,n){var r=[];t.filter((function(e){return!!e.references})).forEach((function(t){return t.references.forEach((function(t){var i=t.name;if(r.indexOf(i)<0)r.push(i);else{var o=new ip('Reference "#'+i+'" is defined several times',t.sourceSpan,e.ParseErrorLevel.ERROR);n.push(o)}}))}))},t}(),ap=function(){function t(e,t,n,r,i,o,s,a){var u=this;this.reflector=e,this.config=t,this.providerViewContext=n,this._bindingParser=i,this._schemaRegistry=o,this._schemas=s,this._targetErrors=a,this.selectorMatcher=new x,this.directivesIndex=new Map,this.ngContentCount=0,this.contentQueryStartId=n.component.viewQueries.length+1,r.forEach((function(e,t){var n=S.parse(e.selector);u.selectorMatcher.addSelectables(n,e),u.directivesIndex.set(e,t)}))}return t.prototype.visitExpansion=function(e,t){return null},t.prototype.visitExpansionCase=function(e,t){return null},t.prototype.visitText=function(e,t){var n=t.findNgContentIndex(rp()),r=uu(e.value),i=this._bindingParser.parseInterpolation(r,e.sourceSpan);return i?new gu(i,n,e.sourceSpan):new yu(r,n,e.sourceSpan)},t.prototype.visitAttribute=function(e,t){return new Eu(e.name,e.value,e.sourceSpan)},t.prototype.visitComment=function(e,t){return null},t.prototype.visitElement=function(e,t){var n=this,r=this.contentQueryStartId,i=e.name,o=Zu(e);if(o.type===Wu.SCRIPT||o.type===Wu.STYLE)return null;if(o.type===Wu.STYLESHEET&&qu(o.hrefAttr))return null;var a=[],u=[],p=[],c=[],h=[],f=[],d=[],v=[],m=!1,y=[],g=l(e.name);e.attrs.forEach((function(e){var t,r,i=n._parseAttr(g,e,a,u,h,p,c);c.push.apply(c,s([].map((function(e){return Cu.fromParsedVariable(e)}))));var o=n._normalizeAttributeName(e.name);o.startsWith("*")&&(t=e.value,r=o.substring("*".length));var l=null!=t;if(l){m&&n._reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *",e.sourceSpan),m=!0;var E=[];n._bindingParser.parseInlineTemplateBinding(r,t,e.sourceSpan,(e.valueSpan||e.sourceSpan).start.offset,d,f,E,!1),v.push.apply(v,s(E.map((function(e){return Cu.fromParsedVariable(e)}))))}i||l||(y.push(n.visitAttribute(e,null)),a.push([e.name,e.value]))}));var E=hp(i,a),_=this._parseDirectives(this.selectorMatcher,E),x=_.directives,w=_.matchElement,C=[],b=new Set,T=this._createDirectiveAsts(g,e.name,x,u,p,e.sourceSpan,C,b),M=this._createElementPropertyAsts(e.name,u,b),P=new Fu(this.providerViewContext,t.providerContext,t.isTemplateElement||m,T,y,C,g,r,e.sourceSpan),N=Oa(o.nonBindable?dp:this,e.children,cp.create(g,T,g?t.providerContext:P));P.afterElement();var A,I=""!=o.projectAs?S.parse(o.projectAs)[0]:E,k=t.findNgContentIndex(I);if(o.type===Wu.NG_CONTENT)e.children&&!e.children.every(vp)&&this._reportError("<ng-content> element cannot have content.",e.sourceSpan),A=new Au(this.ngContentCount++,m?null:k,e.sourceSpan);else if(g)this._assertAllEventsPublishedByDirectives(T,h),this._assertNoComponentsNorElementBindingsOnTemplate(T,M,e.sourceSpan),A=new Tu(y,h,C,c,P.transformedDirectiveAsts,P.transformProviders,P.transformedHasViewContainer,P.queryMatches,N,m?null:k,e.sourceSpan);else{this._assertElementExists(w,e),this._assertOnlyOneComponent(T,e.sourceSpan);var O=m?null:t.findNgContentIndex(I);A=new bu(i,y,M,h,C,P.transformedDirectiveAsts,P.transformProviders,P.transformedHasViewContainer,P.queryMatches,N,m?null:O,e.sourceSpan,e.endSourceSpan||null)}if(m){var R=this.contentQueryStartId,D=hp("ng-template",d),F=this._parseDirectives(this.selectorMatcher,D).directives,L=new Set,B=this._createDirectiveAsts(!0,i,F,f,[],e.sourceSpan,[],L),V=this._createElementPropertyAsts(i,f,L);this._assertNoComponentsNorElementBindingsOnTemplate(B,V,e.sourceSpan);var j=new Fu(this.providerViewContext,t.providerContext,t.isTemplateElement,B,[],[],!0,R,e.sourceSpan);j.afterElement(),A=new Tu([],[],[],v,j.transformedDirectiveAsts,j.transformProviders,j.transformedHasViewContainer,j.queryMatches,[A],k,e.sourceSpan)}return A},t.prototype._parseAttr=function(e,t,n,r,i,o,a){var u=this._normalizeAttributeName(t.name),p=t.value,l=t.sourceSpan,c=t.valueSpan?t.valueSpan.start.offset:l.start.offset,h=[],f=u.match(np),d=!1;return null!==f?(d=!0,null!=f[1]?this._bindingParser.parsePropertyBinding(f[7],p,!1,l,c,t.valueSpan,n,r):f[2]?e?this._parseVariable(f[7],p,l,a):this._reportError('"let-" is only supported on ng-template elements.',l):f[3]?this._parseReference(f[7],p,l,o):f[4]?this._bindingParser.parseEvent(f[7],p,l,t.valueSpan||l,n,h):f[5]?(this._bindingParser.parsePropertyBinding(f[7],p,!1,l,c,t.valueSpan,n,r),this._parseAssignmentEvent(f[7],p,l,t.valueSpan||l,n,h)):f[6]?this._bindingParser.parseLiteralAttr(u,p,l,c,t.valueSpan,n,r):f[8]?(this._bindingParser.parsePropertyBinding(f[8],p,!1,l,c,t.valueSpan,n,r),this._parseAssignmentEvent(f[8],p,l,t.valueSpan||l,n,h)):f[9]?this._bindingParser.parsePropertyBinding(f[9],p,!1,l,c,t.valueSpan,n,r):f[10]&&this._bindingParser.parseEvent(f[10],p,l,t.valueSpan||l,n,h)):d=this._bindingParser.parsePropertyInterpolation(u,p,l,t.valueSpan,n,r),d||this._bindingParser.parseLiteralAttr(u,p,l,c,t.valueSpan,n,r),i.push.apply(i,s(h.map((function(e){return xu.fromParsedEvent(e)})))),d},t.prototype._normalizeAttributeName=function(e){return/^data-/i.test(e)?e.substring(5):e},t.prototype._parseVariable=function(e,t,n,r){e.indexOf("-")>-1?this._reportError('"-" is not allowed in variable names',n):0===e.length&&this._reportError("Variable does not have a name",n),r.push(new Cu(e,t,n))},t.prototype._parseReference=function(e,t,n,r){e.indexOf("-")>-1?this._reportError('"-" is not allowed in reference names',n):0===e.length&&this._reportError("Reference does not have a name",n),r.push(new pp(e,t,n))},t.prototype._parseAssignmentEvent=function(e,t,n,r,i,o){this._bindingParser.parseEvent(e+"Change",t+"=$event",n,r,i,o)},t.prototype._parseDirectives=function(e,t){var n=this,r=Pn(this.directivesIndex.size),i=!1;return e.match(t,(function(e,t){r[n.directivesIndex.get(t)]=t,i=i||e.hasElementSelector()})),{directives:r.filter((function(e){return!!e})),matchElement:i}},t.prototype._createDirectiveAsts=function(e,t,n,r,i,o,s,a){var u=this,p=new Set,l=null,c=n.map((function(e){var n=new ko(o.start,o.end,o.fullStart,"Directive "+On(e.type));e.isComponent&&(l=e);var c=[],h=u._bindingParser.createDirectiveHostPropertyAsts(e,t,n).map((function(e){return Su.fromBoundProperty(e)}));h=u._checkPropertiesInSchema(t,h);var f=u._bindingParser.createDirectiveHostEventAsts(e,n);u._createDirectivePropertyAsts(e.inputs,r,c,a),i.forEach((function(t){(0===t.value.length&&e.isComponent||t.isReferenceToDirective(e))&&(s.push(new wu(t.name,en(e.type.reference),t.value,t.sourceSpan)),p.add(t.name))}));var d=f.map((function(e){return xu.fromParsedEvent(e)})),v=u.contentQueryStartId;return u.contentQueryStartId+=e.queries.length,new Pu(e,c,h,d,v,n)}));return i.forEach((function(t){if(t.value.length>0)p.has(t.name)||u._reportError('There is no directive with "exportAs" set to "'+t.value+'"',t.sourceSpan);else if(!l){var n=null;e&&(n=tn(u.reflector,Jt.TemplateRef)),s.push(new wu(t.name,n,t.value,t.sourceSpan))}})),c},t.prototype._createDirectivePropertyAsts=function(e,t,n,r){if(e){var i=new Map;t.forEach((function(e){var t=i.get(e.name);t&&!t.isLiteral||i.set(e.name,e)})),Object.keys(e).forEach((function(t){var o=i.get(e[t]);o&&(r.add(o.name),yp(o.expression)||n.push(new Mu(t,o.name,o.expression,o.sourceSpan)))}))}},t.prototype._createElementPropertyAsts=function(e,t,n){var r=this,i=[];return t.forEach((function(t){if(!t.isLiteral&&!n.has(t.name)){var o=r._bindingParser.createBoundElementProperty(e,t);i.push(Su.fromBoundProperty(o))}})),this._checkPropertiesInSchema(e,i)},t.prototype._findComponentDirectives=function(e){return e.filter((function(e){return e.directive.isComponent}))},t.prototype._findComponentDirectiveNames=function(e){return this._findComponentDirectives(e).map((function(e){return On(e.directive.type)}))},t.prototype._assertOnlyOneComponent=function(e,t){var n=this._findComponentDirectiveNames(e);n.length>1&&this._reportError("More than one component matched on this element.\nMake sure that only one component's selector can match a given element.\nConflicting components: "+n.join(","),t)},t.prototype._assertElementExists=function(e,t){var n=t.name.replace(/^:xhtml:/,"");if(!e&&!this._schemaRegistry.hasElement(n,this._schemas)){var r="'"+n+"' is not a known element:\n";r+="1. If '"+n+"' is an Angular component, then verify that it is part of this module.\n",n.indexOf("-")>-1?r+="2. If '"+n+"' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.":r+="2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.",this._reportError(r,t.sourceSpan)}},t.prototype._assertNoComponentsNorElementBindingsOnTemplate=function(e,t,n){var r=this,i=this._findComponentDirectiveNames(e);i.length>0&&this._reportError("Components on an embedded template: "+i.join(","),n),t.forEach((function(e){r._reportError("Property binding "+e.name+' not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "@NgModule.declarations".',n)}))},t.prototype._assertAllEventsPublishedByDirectives=function(e,t){var n=this,r=new Set;e.forEach((function(e){Object.keys(e.directive.outputs).forEach((function(t){r.add(e.directive.outputs[t])}))})),t.forEach((function(e){null==e.target&&r.has(e.name)||n._reportError("Event binding "+e.fullName+' not emitted by any directive on an embedded template. Make sure that the event name is spelled correctly and all directives are listed in the "@NgModule.declarations".',e.sourceSpan)}))},t.prototype._checkPropertiesInSchema=function(e,t){var n=this;return t.filter((function(t){if(0===t.type&&!n._schemaRegistry.hasProperty(e,t.name,n._schemas)){var r="Can't bind to '"+t.name+"' since it isn't a known property of '"+e+"'.";e.startsWith("ng-")?r+="\n1. If '"+t.name+"' is an Angular directive, then add 'CommonModule' to the '@NgModule.imports' of this component.\n2. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.":e.indexOf("-")>-1&&(r+="\n1. If '"+e+"' is an Angular component and it has '"+t.name+"' input, then verify that it is part of this module.\n2. If '"+e+"' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.\n3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component."),n._reportError(r,t.sourceSpan)}return!yp(t.value)}))},t.prototype._reportError=function(t,n,r){void 0===r&&(r=e.ParseErrorLevel.ERROR),this._targetErrors.push(new Oo(n,t,r))},t}(),up=function(){function e(){}return e.prototype.visitElement=function(e,t){var n=Zu(e);if(n.type===Wu.SCRIPT||n.type===Wu.STYLE||n.type===Wu.STYLESHEET)return null;var r=e.attrs.map((function(e){return[e.name,e.value]})),i=hp(e.name,r),o=t.findNgContentIndex(i),s=Oa(this,e.children,fp);return new bu(e.name,Oa(this,e.attrs),[],[],[],[],[],!1,[],s,o,e.sourceSpan,e.endSourceSpan)},e.prototype.visitComment=function(e,t){return null},e.prototype.visitAttribute=function(e,t){return new Eu(e.name,e.value,e.sourceSpan)},e.prototype.visitText=function(e,t){var n=t.findNgContentIndex(rp());return new yu(e.value,n,e.sourceSpan)},e.prototype.visitExpansion=function(e,t){return e},e.prototype.visitExpansionCase=function(e,t){return e},e}(),pp=function(){function e(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}return e.prototype.isReferenceToDirective=function(e){return-1!==function t(e){return e?e.split(",").map((function(e){return e.trim()})):[]}(e.exportAs).indexOf(this.value)},e}();function lp(e){return e.trim().split(/\s+/g)}var cp=function(){function e(e,t,n,r){this.isTemplateElement=e,this._ngContentIndexMatcher=t,this._wildcardNgContentIndex=n,this.providerContext=r}return e.create=function(t,n,r){var i=new x,o=null,s=n.find((function(e){return e.directive.isComponent}));if(s)for(var a=s.directive.template.ngContentSelectors,u=0;u<a.length;u++)"*"===a[u]?o=u:i.addSelectables(S.parse(a[u]),u);return new e(t,i,o,r)},e.prototype.findNgContentIndex=function(e){var t=[];return this._ngContentIndexMatcher.match(e,(function(e,n){t.push(n)})),t.sort(),null!=this._wildcardNgContentIndex&&t.push(this._wildcardNgContentIndex),t.length>0?t[0]:null},e}();function hp(e,t){var n=new S,r=a(e)[1];n.setElement(r);for(var i=0;i<t.length;i++){var o=t[i][0],s=a(o)[1],u=t[i][1];n.addAttribute(s,u),"class"==o.toLowerCase()&&lp(u).forEach((function(e){return n.addClassName(e)}))}return n}var fp=new cp(!0,new x,null,null),dp=new up;function vp(e){return e instanceof Ma&&0==e.value.trim().length}function mp(e){var t=new Map;return e.forEach((function(e){t.get(e.type.reference)||t.set(e.type.reference,e)})),Array.from(t.values())}function yp(e){return e instanceof gs&&(e=e.ast),e instanceof Go}
/**
     * @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 gp(e){var t=e.charCodeAt(0);if(t==e.charCodeAt(e.length-1)&&(39==t||34==t)){var n=e.substring(1,e.length-1);-1==n.indexOf("'")&&-1==n.indexOf('"')&&(e=n)}return e}function Ep(e){return e.replace(/[a-z][A-Z]/g,(function(e){return e.charAt(0)+"-"+e.charAt(1)})).toLowerCase()}var _p=function(){function e(e){this._directiveExpr=e,this._hasInitialValues=!1,this.hasBindings=!1,this.hasBindingsWithPipes=!1,this._classMapInput=null,this._styleMapInput=null,this._singleStyleInputs=null,this._singleClassInputs=null,this._lastStylingInput=null,this._firstStylingInput=null,this._stylesIndex=new Map,this._classesIndex=new Map,this._initialStyleValues=[],this._initialClassValues=[]}return e.prototype.registerBoundInput=function(e){var t=null,n=e.name;switch(e.type){case 0:t=this.registerInputBasedOnName(n,e.value,e.sourceSpan);break;case 3:t=this.registerStyleInput(n,!1,e.value,e.sourceSpan,e.unit);break;case 2:t=this.registerClassInput(n,!1,e.value,e.sourceSpan)}return!!t},e.prototype.registerInputBasedOnName=function(e,t,n){var r=null,i=e.substring(0,6),o="style"===e||"style."===i||"style!"===i;if(o||!o&&("class"===e||"class."===i||"class!"===i)){var s="."!==e.charAt(5),a=e.substr(s?5:6);r=o?this.registerStyleInput(a,s,t,n):this.registerClassInput(a,s,t,n)}return r},e.prototype.registerStyleInput=function(e,t,n,r,i){if(yp(n))return null;(function o(e){return e.startsWith("--")}
/**
     * @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)||(e=Ep(e));var s=xp(e),a=s.property,u={name:a,suffix:i="string"==typeof i&&0!==i.length?i:s.suffix,value:n,sourceSpan:r,hasOverrideFlag:s.hasOverrideFlag};return t?this._styleMapInput=u:((this._singleStyleInputs=this._singleStyleInputs||[]).push(u),Sp(this._stylesIndex,a)),this._lastStylingInput=u,this._firstStylingInput=this._firstStylingInput||u,this._checkForPipes(n),this.hasBindings=!0,u},e.prototype.registerClassInput=function(e,t,n,r){if(yp(n))return null;var i=xp(e),o=i.property,s={name:o,value:n,sourceSpan:r,hasOverrideFlag:i.hasOverrideFlag,suffix:null};return t?this._classMapInput=s:((this._singleClassInputs=this._singleClassInputs||[]).push(s),Sp(this._classesIndex,o)),this._lastStylingInput=s,this._firstStylingInput=this._firstStylingInput||s,this._checkForPipes(n),this.hasBindings=!0,s},e.prototype._checkForPipes=function(e){e instanceof gs&&e.ast instanceof os&&(this.hasBindingsWithPipes=!0)},e.prototype.registerStyleAttr=function(e){this._initialStyleValues=function t(e){for(var t=[],n=0,r=0,i=0,o=0,s=0,a=null,u=!1;n<e.length;)switch(e.charCodeAt(n++)){case 40:r++;break;case 41:r--;break;case 39:u=u||o>0,0===i?i=39:39===i&&92!==e.charCodeAt(n-1)&&(i=0);break;case 34:u=u||o>0,0===i?i=34:34===i&&92!==e.charCodeAt(n-1)&&(i=0);break;case 58:a||0!==r||0!==i||(a=Ep(e.substring(s,n-1).trim()),o=n);break;case 59:if(a&&o>0&&0===r&&0===i){var p=e.substring(o,n-1).trim();t.push(a,u?gp(p):p),s=n,o=0,a=null,u=!1}}return a&&o&&(p=e.substr(o).trim(),t.push(a,u?gp(p):p)),t}(e),this._hasInitialValues=!0},e.prototype.registerClassAttr=function(e){this._initialClassValues=e.trim().split(/\s+/g),this._hasInitialValues=!0},e.prototype.populateInitialStylingAttrs=function(e){if(this._initialClassValues.length){e.push(Ut(1));for(var t=0;t<this._initialClassValues.length;t++)e.push(Ut(this._initialClassValues[t]))}if(this._initialStyleValues.length)for(e.push(Ut(2)),t=0;t<this._initialStyleValues.length;t+=2)e.push(Ut(this._initialStyleValues[t]),Ut(this._initialStyleValues[t+1]))},e.prototype.assignHostAttrs=function(e,t){this._directiveExpr&&(e.length||this._hasInitialValues)&&(this.populateInitialStylingAttrs(e),t.set("hostAttrs",Ft(e)))},e.prototype.buildClassMapInstruction=function(e){return this._classMapInput?this._buildMapBasedInstruction(e,!0,this._classMapInput):null},e.prototype.buildStyleMapInstruction=function(e){return this._styleMapInput?this._buildMapBasedInstruction(e,!1,this._styleMapInput):null},e.prototype._buildMapBasedInstruction=function(e,t,n){var r,i=2,o=n.value.visit(e);return o instanceof ps?(i+=o.expressions.length,r=t?function s(e){switch(oo(e)){case 1:return rr.classMap;case 3:return rr.classMapInterpolate1;case 5:return rr.classMapInterpolate2;case 7:return rr.classMapInterpolate3;case 9:return rr.classMapInterpolate4;case 11:return rr.classMapInterpolate5;case 13:return rr.classMapInterpolate6;case 15:return rr.classMapInterpolate7;case 17:return rr.classMapInterpolate8;default:return rr.classMapInterpolateV}}(o):function a(e){switch(oo(e)){case 1:return rr.styleMap;case 3:return rr.styleMapInterpolate1;case 5:return rr.styleMapInterpolate2;case 7:return rr.styleMapInterpolate3;case 9:return rr.styleMapInterpolate4;case 11:return rr.styleMapInterpolate5;case 13:return rr.styleMapInterpolate6;case 15:return rr.styleMapInterpolate7;case 17:return rr.styleMapInterpolate8;default:return rr.styleMapInterpolateV}}(o)):r=t?rr.classMap:rr.styleMap,{reference:r,calls:[{supportsInterpolation:!0,sourceSpan:n.sourceSpan,allocateBindingSlots:i,params:function(e){var t=e(o);return Array.isArray(t)?t:[t]}}]}},e.prototype._buildSingleInputs=function(e,t,n,r,i){var o=[];return t.forEach((function(t){var a=o[o.length-1],u=t.value.visit(n),p=e,l=2;u instanceof ps&&(l+=u.expressions.length,r&&(p=r(u)));var c={sourceSpan:t.sourceSpan,allocateBindingSlots:l,supportsInterpolation:!!r,params:function(e){var n=[];n.push(Ut(t.name));var r=e(u);return Array.isArray(r)?n.push.apply(n,s(r)):n.push(r),i||null===t.suffix||n.push(Ut(t.suffix)),n}};a&&a.reference===p?a.calls.push(c):o.push({reference:p,calls:[c]})})),o},e.prototype._buildClassInputs=function(e){return this._singleClassInputs?this._buildSingleInputs(rr.classProp,this._singleClassInputs,e,null,!0):[]},e.prototype._buildStyleInputs=function(e){return this._singleStyleInputs?this._buildSingleInputs(rr.styleProp,this._singleStyleInputs,e,wp,!1):[]},e.prototype.buildUpdateLevelInstructions=function(e){var t=[];if(this.hasBindings){var n=this.buildStyleMapInstruction(e);n&&t.push(n);var r=this.buildClassMapInstruction(e);r&&t.push(r),t.push.apply(t,s(this._buildStyleInputs(e))),t.push.apply(t,s(this._buildClassInputs(e)))}return t},e}();function Sp(e,t){e.has(t)||e.set(t,e.size)}function xp(e){var t=!1,n=e.indexOf("!important");-1!==n&&(e=n>0?e.substring(0,n):"",t=!0);var r=null,i=e,o=e.lastIndexOf(".");return o>0&&(r=e.substr(o+1),i=e.substring(0,o)),{property:i,suffix:r,hasOverrideFlag:t}}function wp(e){switch(oo(e)){case 1:return rr.styleProp;case 3:return rr.stylePropInterpolate1;case 5:return rr.stylePropInterpolate2;case 7:return rr.stylePropInterpolate3;case 9:return rr.stylePropInterpolate4;case 11:return rr.stylePropInterpolate5;case 13:return rr.stylePropInterpolate6;case 15:return rr.stylePropInterpolate7;case 17:return rr.stylePropInterpolate8;default:return rr.stylePropInterpolateV}}!function(e){e[e.Character=0]="Character",e[e.Identifier=1]="Identifier",e[e.Keyword=2]="Keyword",e[e.String=3]="String",e[e.Operator=4]="Operator",e[e.Number=5]="Number",e[e.Error=6]="Error"}(e.TokenType||(e.TokenType={}));var Cp=["var","let","as","null","undefined","true","false","if","else","this"],bp=function(){function e(){}return e.prototype.tokenize=function(e){for(var t=new Ap(e),n=[],r=t.scanToken();null!=r;)n.push(r),r=t.scanToken();return n},e}(),Tp=function(){function t(e,t,n,r,i){this.index=e,this.end=t,this.type=n,this.numValue=r,this.strValue=i}return t.prototype.isCharacter=function(t){return this.type==e.TokenType.Character&&this.numValue==t},t.prototype.isNumber=function(){return this.type==e.TokenType.Number},t.prototype.isString=function(){return this.type==e.TokenType.String},t.prototype.isOperator=function(t){return this.type==e.TokenType.Operator&&this.strValue==t},t.prototype.isIdentifier=function(){return this.type==e.TokenType.Identifier},t.prototype.isKeyword=function(){return this.type==e.TokenType.Keyword},t.prototype.isKeywordLet=function(){return this.type==e.TokenType.Keyword&&"let"==this.strValue},t.prototype.isKeywordAs=function(){return this.type==e.TokenType.Keyword&&"as"==this.strValue},t.prototype.isKeywordNull=function(){return this.type==e.TokenType.Keyword&&"null"==this.strValue},t.prototype.isKeywordUndefined=function(){return this.type==e.TokenType.Keyword&&"undefined"==this.strValue},t.prototype.isKeywordTrue=function(){return this.type==e.TokenType.Keyword&&"true"==this.strValue},t.prototype.isKeywordFalse=function(){return this.type==e.TokenType.Keyword&&"false"==this.strValue},t.prototype.isKeywordThis=function(){return this.type==e.TokenType.Keyword&&"this"==this.strValue},t.prototype.isError=function(){return this.type==e.TokenType.Error},t.prototype.toNumber=function(){return this.type==e.TokenType.Number?this.numValue:-1},t.prototype.toString=function(){switch(this.type){case e.TokenType.Character:case e.TokenType.Identifier:case e.TokenType.Keyword:case e.TokenType.Operator:case e.TokenType.String:case e.TokenType.Error:return this.strValue;case e.TokenType.Number:return this.numValue.toString();default:return null}},t}();function Mp(t,n,r){return new Tp(t,n,e.TokenType.Character,r,String.fromCharCode(r))}function Pp(t,n,r){return new Tp(t,n,e.TokenType.Operator,0,r)}var Np=new Tp(-1,-1,e.TokenType.Character,0,""),Ap=function(){function t(e){this.input=e,this.peek=0,this.index=-1,this.length=e.length,this.advance()}return t.prototype.advance=function(){this.peek=++this.index>=this.length?0:this.input.charCodeAt(this.index)},t.prototype.scanToken=function(){for(var e=this.input,t=this.length,n=this.peek,r=this.index;n<=32;){if(++r>=t){n=0;break}n=e.charCodeAt(r)}if(this.peek=n,this.index=r,r>=t)return null;if(Ip(n))return this.scanIdentifier();if(bo(n))return this.scanNumber(r);var i=r;switch(n){case 46:return this.advance(),bo(this.peek)?this.scanNumber(i):Mp(i,this.index,46);case 40:case 41:case 123:case 125:case 91:case 93:case 44:case 58:case 59:return this.scanCharacter(i,n);case 39:case 34:return this.scanString();case 35:case 43:case 45:case 42:case 47:case 37:case 94:return this.scanOperator(i,String.fromCharCode(n));case 63:return this.scanComplexOperator(i,"?",46,".");case 60:case 62:return this.scanComplexOperator(i,String.fromCharCode(n),61,"=");case 33:case 61:return this.scanComplexOperator(i,String.fromCharCode(n),61,"=",61,"=");case 38:return this.scanComplexOperator(i,"&",38,"&");case 124:return this.scanComplexOperator(i,"|",124,"|");case 160:for(;Co(this.peek);)this.advance();return this.scanToken()}return this.advance(),this.error("Unexpected character ["+String.fromCharCode(n)+"]",0)},t.prototype.scanCharacter=function(e,t){return this.advance(),Mp(e,this.index,t)},t.prototype.scanOperator=function(e,t){return this.advance(),Pp(e,this.index,t)},t.prototype.scanComplexOperator=function(e,t,n,r,i,o){this.advance();var s=t;return this.peek==n&&(this.advance(),s+=r),null!=i&&this.peek==i&&(this.advance(),s+=o),Pp(e,this.index,s)},t.prototype.scanIdentifier=function(){var t=this.index;for(this.advance();Op(this.peek);)this.advance();var n=this.input.substring(t,this.index);return Cp.indexOf(n)>-1?function r(t,n,i){return new Tp(t,n,e.TokenType.Keyword,0,i)}(t,this.index,n):function i(t,n,r){return new Tp(t,n,e.TokenType.Identifier,0,r)}(t,this.index,n)},t.prototype.scanNumber=function(t){var n,r=this.index===t;for(this.advance();;){if(bo(this.peek));else if(46==this.peek)r=!1;else{if(101!=(n=this.peek)&&69!=n)break;if(this.advance(),Rp(this.peek)&&this.advance(),!bo(this.peek))return this.error("Invalid exponent",-1);r=!1}this.advance()}var i=this.input.substring(t,this.index),o=r?function s(e){var t=parseInt(e);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+e);return t}(i):parseFloat(i);return function a(t,n,r){return new Tp(t,n,e.TokenType.Number,r,"")}(t,this.index,o)},t.prototype.scanString=function(){var t=this.index,n=this.peek;this.advance();for(var r="",i=this.index,o=this.input;this.peek!=n;)if(92==this.peek){r+=o.substring(i,this.index),this.advance();var s=void 0;if(this.peek=this.peek,117==this.peek){var a=o.substring(this.index+1,this.index+5);if(!/^[0-9a-f]+$/i.test(a))return this.error("Invalid unicode escape [\\u"+a+"]",0);s=parseInt(a,16);for(var u=0;u<5;u++)this.advance()}else s=Fp(this.peek),this.advance();r+=String.fromCharCode(s),i=this.index}else{if(0==this.peek)return this.error("Unterminated quote",0);this.advance()}var p=o.substring(i,this.index);return this.advance(),function l(t,n,r){return new Tp(t,n,e.TokenType.String,0,r)}(t,this.index,r+p)},t.prototype.error=function(t,n){var r=this.index+n;return function i(t,n,r){return new Tp(t,n,e.TokenType.Error,0,r)}(r,this.index,"Lexer Error: "+t+" at column "+r+" in expression ["+this.input+"]")},t}();function Ip(e){return 97<=e&&e<=122||65<=e&&e<=90||95==e||36==e}function kp(e){if(0==e.length)return!1;var t=new Ap(e);if(!Ip(t.peek))return!1;for(t.advance();0!==t.peek;){if(!Op(t.peek))return!1;t.advance()}return!0}function Op(e){return To(e)||bo(e)||95==e||36==e}function Rp(e){return 45==e||43==e}function Dp(e){return 39===e||34===e||96===e}function Fp(e){switch(e){case 110:return 10;case 102:return 12;case 114:return 13;case 116:return 9;case 118:return 11;default:return e}}var Lp,Bp=function Bp(e,t,n){this.strings=e,this.expressions=t,this.offsets=n},Vp=function Vp(e,t,n){this.templateBindings=e,this.warnings=t,this.errors=n},jp=function(){function e(e){this._lexer=e,this.errors=[],this.simpleExpressionChecker=Wp}return e.prototype.parseAction=function(e,t,n,r){void 0===r&&(r=yo),this._checkNoInterpolation(e,t,r);var i=this._stripComments(e),o=this._lexer.tokenize(this._stripComments(e)),s=new qp(e,t,n,o,i.length,!0,this.errors,e.length-i.length).parseChain();return new gs(s,e,t,n,this.errors)},e.prototype.parseBinding=function(e,t,n,r){void 0===r&&(r=yo);var i=this._parseBindingAst(e,t,n,r);return new gs(i,e,t,n,this.errors)},e.prototype.checkSimpleExpression=function(e){var t=new this.simpleExpressionChecker;return e.visit(t),t.errors},e.prototype.parseSimpleBinding=function(e,t,n,r){void 0===r&&(r=yo);var i=this._parseBindingAst(e,t,n,r),o=this.checkSimpleExpression(i);return o.length>0&&this._reportError("Host binding expression cannot contain "+o.join(" "),e,t),new gs(i,e,t,n,this.errors)},e.prototype._reportError=function(e,t,n,r){this.errors.push(new Wo(e,t,n,r))},e.prototype._parseBindingAst=function(e,t,n,r){var i=this._parseQuote(e,t,n);if(null!=i)return i;this._checkNoInterpolation(e,t,r);var o=this._stripComments(e),s=this._lexer.tokenize(o);return new qp(e,t,n,s,o.length,!1,this.errors,e.length-o.length).parseChain()},e.prototype._parseQuote=function(e,t,n){if(null==e)return null;var r=e.indexOf(":");if(-1==r)return null;var i=e.substring(0,r).trim();if(!kp(i))return null;var o=e.substring(r+1),s=new zo(0,e.length);return new Xo(s,s.toAbsolute(n),i,o,t)},e.prototype.parseTemplateBindings=function(e,t,n,r,i){var o=this._lexer.tokenize(t);return new qp(t,n,i,o,t.length,!1,this.errors,0).parseTemplateBindings({source:e,span:new ys(r,r+e.length)})},e.prototype.parseInterpolation=function(e,t,n,r){void 0===r&&(r=yo);var i=this.splitInterpolation(e,t,r),o=i.strings,s=i.expressions,a=i.offsets;if(0===s.length)return null;for(var u=[],p=0;p<s.length;++p){var l=s[p].text,c=this._stripComments(l),h=this._lexer.tokenize(c),f=new qp(e,t,n,h,c.length,!1,this.errors,a[p]+(l.length-c.length)).parseChain();u.push(f)}return this.createInterpolationAst(o.map((function(e){return e.text})),u,e,t,n)},e.prototype.parseInterpolationExpression=function(e,t,n){var r=this._stripComments(e),i=this._lexer.tokenize(r),o=new qp(e,t,n,i,r.length,!1,this.errors,0).parseChain();return this.createInterpolationAst(["",""],[o],e,t,n)},e.prototype.createInterpolationAst=function(e,t,n,r,i){var o=new zo(0,n.length),s=new ps(o,o.toAbsolute(i),e,t);return new gs(s,n,r,i,this.errors)},e.prototype.splitInterpolation=function(e,t,n){void 0===n&&(n=yo);for(var r=[],i=[],o=[],s=0,a=!1,u=!1,p=n.start,l=n.end;s<e.length;)if(a){var c=s,h=c+p.length,f=this._getInterpolationEndIndex(e,l,h);if(-1===f){a=!1,u=!0;break}var d=f+l.length;0===(m=e.substring(h,f)).trim().length&&this._reportError("Blank expressions are not allowed in interpolated strings",e,"at column "+s+" in",t),i.push({text:m,start:c,end:d}),o.push(h),s=d,a=!1}else{var v=s;-1===(s=e.indexOf(p,s))&&(s=e.length);var m=e.substring(v,s);r.push({text:m,start:v,end:s}),a=!0}if(!a)if(u){var y=r[r.length-1];y.text+=e.substring(s),y.end=e.length}else r.push({text:e.substring(s),start:s,end:e.length});return new Bp(r,i,o)},e.prototype.wrapLiteralPrimitive=function(e,t,n){var r=new zo(0,null==e?0:e.length);return new gs(new ss(r,r.toAbsolute(n),e),e,t,n,this.errors)},e.prototype._stripComments=function(e){var t=this._commentStart(e);return null!=t?e.substring(0,t).trim():e},e.prototype._commentStart=function(e){for(var t=null,n=0;n<e.length-1;n++){var r=e.charCodeAt(n),i=e.charCodeAt(n+1);if(47===r&&47==i&&null==t)return n;t===r?t=null:null==t&&Dp(r)&&(t=r)}return null},e.prototype._checkNoInterpolation=function(e,t,n){var r,o,s=n.start,a=n.end,u=-1,p=-1;try{for(var l=i(this._forEachUnquotedChar(e,0)),c=l.next();!c.done;c=l.next()){var h=c.value;if(-1===u)e.startsWith(s)&&(u=h);else if((p=this._getInterpolationEndIndex(e,a,h))>-1)break}}catch(e){r={error:e}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}u>-1&&p>-1&&this._reportError("Got interpolation ("+s+a+") where expression was expected",e,"at column "+u+" in",t)},e.prototype._getInterpolationEndIndex=function(e,t,n){var r,o;try{for(var s=i(this._forEachUnquotedChar(e,n)),a=s.next();!a.done;a=s.next()){var u=a.value;if(e.startsWith(t,u))return u;if(e.startsWith("//",u))return e.indexOf(t,u)}}catch(e){r={error:e}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}return-1},e.prototype._forEachUnquotedChar=function(e,t){var n,r,i,o;return function s(e,t){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function u(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){s.label=o[1];break}if(6===o[0]&&s.label<i[1]){s.label=i[1],i=o;break}if(i&&s.label<i[2]){s.label=i[2],s.ops.push(o);break}i[2]&&s.ops.pop(),s.trys.pop();continue}o=t.call(e,s)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,a])}}}(this,(function(s){switch(s.label){case 0:n=null,r=0,i=t,s.label=1;case 1:return i<e.length?(o=e[i],!Dp(e.charCodeAt(i))||null!==n&&n!==o||r%2!=0?[3,2]:(n=null===n?o:null,[3,4])):[3,6];case 2:return null!==n?[3,4]:[4,i];case 3:s.sent(),s.label=4;case 4:r="\\"===o?r+1:0,s.label=5;case 5:return i++,[3,1];case 6:return[2]}}))},e}(),Up=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.simpleExpressionChecker=zp,t}return r(t,e),t}(jp);!function(e){e[e.None=0]="None",e[e.Writable=1]="Writable"}(Lp||(Lp={}));var Hp,qp=function(){function t(e,t,n,r,i,o,s,a){this.input=e,this.location=t,this.absoluteOffset=n,this.tokens=r,this.inputLength=i,this.parseAction=o,this.errors=s,this.offset=a,this.rparensExpected=0,this.rbracketsExpected=0,this.rbracesExpected=0,this.context=Lp.None,this.sourceSpanCache=new Map,this.index=0}return t.prototype.peek=function(e){var t=this.index+e;return t<this.tokens.length?this.tokens[t]:Np},Object.defineProperty(t.prototype,"next",{get:function(){return this.peek(0)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"atEOF",{get:function(){return this.index>=this.tokens.length},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"inputIndex",{get:function(){return this.atEOF?this.currentEndIndex:this.next.index+this.offset},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"currentEndIndex",{get:function(){return this.index>0?this.peek(-1).end+this.offset:0===this.tokens.length?this.inputLength+this.offset:this.next.index+this.offset},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"currentAbsoluteOffset",{get:function(){return this.absoluteOffset+this.inputIndex},enumerable:!1,configurable:!0}),t.prototype.span=function(e,t){var n=this.currentEndIndex;return void 0!==t&&t>this.currentEndIndex&&(n=t),new zo(e,n)},t.prototype.sourceSpan=function(e,t){var n=e+"@"+this.inputIndex+":"+t;return this.sourceSpanCache.has(n)||this.sourceSpanCache.set(n,this.span(e,t).toAbsolute(this.absoluteOffset)),this.sourceSpanCache.get(n)},t.prototype.advance=function(){this.index++},t.prototype.withContext=function(e,t){this.context|=e;var n=t();return this.context^=e,n},t.prototype.consumeOptionalCharacter=function(e){return!!this.next.isCharacter(e)&&(this.advance(),!0)},t.prototype.peekKeywordLet=function(){return this.next.isKeywordLet()},t.prototype.peekKeywordAs=function(){return this.next.isKeywordAs()},t.prototype.expectCharacter=function(e){this.consumeOptionalCharacter(e)||this.error("Missing expected "+String.fromCharCode(e))},t.prototype.consumeOptionalOperator=function(e){return!!this.next.isOperator(e)&&(this.advance(),!0)},t.prototype.expectOperator=function(e){this.consumeOptionalOperator(e)||this.error("Missing expected operator "+e)},t.prototype.prettyPrintToken=function(e){return e===Np?"end of input":"token "+e},t.prototype.expectIdentifierOrKeyword=function(){var e=this.next;return e.isIdentifier()||e.isKeyword()?(this.advance(),e.toString()):(this.error("Unexpected "+this.prettyPrintToken(e)+", expected identifier or keyword"),null)},t.prototype.expectIdentifierOrKeywordOrString=function(){var e=this.next;return e.isIdentifier()||e.isKeyword()||e.isString()?(this.advance(),e.toString()):(this.error("Unexpected "+this.prettyPrintToken(e)+", expected identifier, keyword, or string"),"")},t.prototype.parseChain=function(){for(var e=[],t=this.inputIndex;this.index<this.tokens.length;){var n=this.parsePipe();if(e.push(n),this.consumeOptionalCharacter(59))for(this.parseAction||this.error("Binding expression cannot contain chained expression");this.consumeOptionalCharacter(59););else this.index<this.tokens.length&&this.error("Unexpected token '"+this.next+"'")}if(0==e.length){var r=this.offset,i=this.offset+this.inputLength;return new Go(this.span(r,i),this.sourceSpan(r,i))}return 1==e.length?e[0]:new Jo(this.span(t),this.sourceSpan(t),e)},t.prototype.parsePipe=function(){var e=this.inputIndex,t=this.parseExpression();if(this.consumeOptionalOperator("|")){this.parseAction&&this.error("Cannot have a pipe in an action expression");do{var n=this.inputIndex,r=this.expectIdentifierOrKeyword(),i=void 0,o=void 0;null!==r?i=this.sourceSpan(n):(r="",i=new zo(o=-1!==this.next.index?this.next.index:this.inputLength+this.offset,o).toAbsolute(this.absoluteOffset));for(var s=[];this.consumeOptionalCharacter(58);)s.push(this.parseExpression());t=new os(this.span(e),this.sourceSpan(e,o),t,r,s,i)}while(this.consumeOptionalOperator("|"))}return t},t.prototype.parseExpression=function(){return this.parseConditional()},t.prototype.parseConditional=function(){var e=this.inputIndex,t=this.parseLogicalOr();if(this.consumeOptionalOperator("?")){var n=this.parsePipe(),r=void 0;if(this.consumeOptionalCharacter(58))r=this.parsePipe();else{var i=this.input.substring(e,this.inputIndex);this.error("Conditional expression "+i+" requires all 3 expressions"),r=new Go(this.span(e),this.sourceSpan(e))}return new Zo(this.span(e),this.sourceSpan(e),t,n,r)}return t},t.prototype.parseLogicalOr=function(){for(var e=this.inputIndex,t=this.parseLogicalAnd();this.consumeOptionalOperator("||");){var n=this.parseLogicalAnd();t=new ls(this.span(e),this.sourceSpan(e),"||",t,n)}return t},t.prototype.parseLogicalAnd=function(){for(var e=this.inputIndex,t=this.parseEquality();this.consumeOptionalOperator("&&");){var n=this.parseEquality();t=new ls(this.span(e),this.sourceSpan(e),"&&",t,n)}return t},t.prototype.parseEquality=function(){for(var t=this.inputIndex,n=this.parseRelational();this.next.type==e.TokenType.Operator;){var r=this.next.strValue;switch(r){case"==":case"===":case"!=":case"!==":this.advance();var i=this.parseRelational();n=new ls(this.span(t),this.sourceSpan(t),r,n,i);continue}break}return n},t.prototype.parseRelational=function(){for(var t=this.inputIndex,n=this.parseAdditive();this.next.type==e.TokenType.Operator;){var r=this.next.strValue;switch(r){case"<":case">":case"<=":case">=":this.advance();var i=this.parseAdditive();n=new ls(this.span(t),this.sourceSpan(t),r,n,i);continue}break}return n},t.prototype.parseAdditive=function(){for(var t=this.inputIndex,n=this.parseMultiplicative();this.next.type==e.TokenType.Operator;){var r=this.next.strValue;switch(r){case"+":case"-":this.advance();var i=this.parseMultiplicative();n=new ls(this.span(t),this.sourceSpan(t),r,n,i);continue}break}return n},t.prototype.parseMultiplicative=function(){for(var t=this.inputIndex,n=this.parsePrefix();this.next.type==e.TokenType.Operator;){var r=this.next.strValue;switch(r){case"*":case"%":case"/":this.advance();var i=this.parsePrefix();n=new ls(this.span(t),this.sourceSpan(t),r,n,i);continue}break}return n},t.prototype.parsePrefix=function(){if(this.next.type==e.TokenType.Operator){var t=this.inputIndex,n=void 0;switch(this.next.strValue){case"+":return this.advance(),n=this.parsePrefix(),cs.createPlus(this.span(t),this.sourceSpan(t),n);case"-":return this.advance(),n=this.parsePrefix(),cs.createMinus(this.span(t),this.sourceSpan(t),n);case"!":return this.advance(),n=this.parsePrefix(),new hs(this.span(t),this.sourceSpan(t),n)}}return this.parseCallChain()},t.prototype.parseCallChain=function(){for(var e=this,t=this.inputIndex,n=this.parsePrimary();;)if(this.consumeOptionalCharacter(46))n=this.parseAccessMemberOrMethodCall(n,t,!1);else if(this.consumeOptionalOperator("?."))n=this.parseAccessMemberOrMethodCall(n,t,!0);else if(this.consumeOptionalCharacter(91))this.withContext(Lp.Writable,(function(){e.rbracketsExpected++;var r=e.parsePipe();if(r instanceof Go&&e.error("Key access cannot be empty"),e.rbracketsExpected--,e.expectCharacter(93),e.consumeOptionalOperator("=")){var i=e.parseConditional();n=new is(e.span(t),e.sourceSpan(t),n,r,i)}else n=new rs(e.span(t),e.sourceSpan(t),n,r)}));else if(this.consumeOptionalCharacter(40)){this.rparensExpected++;var r=this.parseCallArguments();this.rparensExpected--,this.expectCharacter(41),n=new ms(this.span(t),this.sourceSpan(t),n,r)}else{if(!this.consumeOptionalOperator("!"))return n;n=new fs(this.span(t),this.sourceSpan(t),n)}},t.prototype.parsePrimary=function(){var e=this.inputIndex;if(this.consumeOptionalCharacter(40)){this.rparensExpected++;var t=this.parsePipe();return this.rparensExpected--,this.expectCharacter(41),t}if(this.next.isKeywordNull())return this.advance(),new ss(this.span(e),this.sourceSpan(e),null);if(this.next.isKeywordUndefined())return this.advance(),new ss(this.span(e),this.sourceSpan(e),void 0);if(this.next.isKeywordTrue())return this.advance(),new ss(this.span(e),this.sourceSpan(e),!0);if(this.next.isKeywordFalse())return this.advance(),new ss(this.span(e),this.sourceSpan(e),!1);if(this.next.isKeywordThis())return this.advance(),new Yo(this.span(e),this.sourceSpan(e));if(this.consumeOptionalCharacter(91)){this.rbracketsExpected++;var n=this.parseExpressionList(93);return this.rbracketsExpected--,this.expectCharacter(93),new as(this.span(e),this.sourceSpan(e),n)}if(this.next.isCharacter(123))return this.parseLiteralMap();if(this.next.isIdentifier())return this.parseAccessMemberOrMethodCall(new $o(this.span(e),this.sourceSpan(e)),e,!1);if(this.next.isNumber()){var r=this.next.toNumber();return this.advance(),new ss(this.span(e),this.sourceSpan(e),r)}if(this.next.isString()){var i=this.next.toString();return this.advance(),new ss(this.span(e),this.sourceSpan(e),i)}return this.index>=this.tokens.length?(this.error("Unexpected end of expression: "+this.input),new Go(this.span(e),this.sourceSpan(e))):(this.error("Unexpected token "+this.next),new Go(this.span(e),this.sourceSpan(e)))},t.prototype.parseExpressionList=function(e){var t=[];do{if(this.next.isCharacter(e))break;t.push(this.parsePipe())}while(this.consumeOptionalCharacter(44));return t},t.prototype.parseLiteralMap=function(){var e=[],t=[],n=this.inputIndex;if(this.expectCharacter(123),!this.consumeOptionalCharacter(125)){this.rbracesExpected++;do{var r=this.next.isString(),i=this.expectIdentifierOrKeywordOrString();e.push({key:i,quoted:r}),this.expectCharacter(58),t.push(this.parsePipe())}while(this.consumeOptionalCharacter(44));this.rbracesExpected--,this.expectCharacter(125)}return new us(this.span(n),this.sourceSpan(n),e,t)},t.prototype.parseAccessMemberOrMethodCall=function(e,t,n){var r=this;void 0===n&&(n=!1);var i=this.inputIndex,o=this.withContext(Lp.Writable,(function(){var t,n=null!==(t=r.expectIdentifierOrKeyword())&&void 0!==t?t:"";return 0===n.length&&r.error("Expected identifier for property access",e.span.end),n})),s=this.sourceSpan(i);if(this.consumeOptionalCharacter(40)){this.rparensExpected++;var a=this.parseCallArguments();this.expectCharacter(41),this.rparensExpected--;var u=this.span(t),p=this.sourceSpan(t);return n?new vs(u,p,s,e,o,a):new ds(u,p,s,e,o,a)}if(n)return this.consumeOptionalOperator("=")?(this.error("The '?.' operator cannot be used in the assignment"),new Go(this.span(t),this.sourceSpan(t))):new ns(this.span(t),this.sourceSpan(t),s,e,o);if(this.consumeOptionalOperator("=")){if(!this.parseAction)return this.error("Bindings cannot contain assignments"),new Go(this.span(t),this.sourceSpan(t));var l=this.parseConditional();return new ts(this.span(t),this.sourceSpan(t),s,e,o,l)}return new es(this.span(t),this.sourceSpan(t),s,e,o)},t.prototype.parseCallArguments=function(){if(this.next.isCharacter(41))return[];var e=[];do{e.push(this.parsePipe())}while(this.consumeOptionalCharacter(44));return e},t.prototype.expectTemplateBindingKey=function(){var e="",t=!1,n=this.currentAbsoluteOffset;do{e+=this.expectIdentifierOrKeywordOrString(),(t=this.consumeOptionalOperator("-"))&&(e+="-")}while(t);return{source:e,span:new ys(n,n+e.length)}},t.prototype.parseTemplateBindings=function(e){var t=[];for(t.push.apply(t,s(this.parseDirectiveKeywordBindings(e)));this.index<this.tokens.length;){var n=this.parseLetBinding();if(n)t.push(n);else{var r=this.expectTemplateBindingKey(),i=this.parseAsBinding(r);i?t.push(i):(r.source=e.source+r.source.charAt(0).toUpperCase()+r.source.substring(1),t.push.apply(t,s(this.parseDirectiveKeywordBindings(r))))}this.consumeStatementTerminator()}return new Vp(t,[],this.errors)},t.prototype.parseDirectiveKeywordBindings=function(e){var t=[];this.consumeOptionalCharacter(58);var n=this.getDirectiveBoundTarget(),r=this.currentAbsoluteOffset,i=this.parseAsBinding(e);i||(this.consumeStatementTerminator(),r=this.currentAbsoluteOffset);var o=new ys(e.span.start,r);return t.push(new _s(o,e,n)),i&&t.push(i),t},t.prototype.getDirectiveBoundTarget=function(){if(this.next===Np||this.peekKeywordAs()||this.peekKeywordLet())return null;var e=this.parsePipe(),t=e.span,n=t.start,r=this.input.substring(n,t.end);return new gs(e,r,this.location,this.absoluteOffset+n,this.errors)},t.prototype.parseAsBinding=function(e){if(!this.peekKeywordAs())return null;this.advance();var t=this.expectTemplateBindingKey();this.consumeStatementTerminator();var n=new ys(e.span.start,this.currentAbsoluteOffset);return new Es(n,t,e)},t.prototype.parseLetBinding=function(){if(!this.peekKeywordLet())return null;var e=this.currentAbsoluteOffset;this.advance();var t=this.expectTemplateBindingKey(),n=null;this.consumeOptionalOperator("=")&&(n=this.expectTemplateBindingKey()),this.consumeStatementTerminator();var r=new ys(e,this.currentAbsoluteOffset);return new Es(r,t,n)},t.prototype.consumeStatementTerminator=function(){this.consumeOptionalCharacter(59)||this.consumeOptionalCharacter(44)},t.prototype.error=function(e,t){void 0===t&&(t=null),this.errors.push(new Wo(e,this.input,this.locationText(t),this.location)),this.skip()},t.prototype.locationText=function(e){return void 0===e&&(e=null),null==e&&(e=this.index),e<this.tokens.length?"at column "+(this.tokens[e].index+1)+" in":"at the end of the expression"},t.prototype.skip=function(){for(var e=this.next;this.index<this.tokens.length&&!e.isCharacter(59)&&!e.isOperator("|")&&(this.rparensExpected<=0||!e.isCharacter(41))&&(this.rbracesExpected<=0||!e.isCharacter(125))&&(this.rbracketsExpected<=0||!e.isCharacter(93))&&!(this.context&Lp.Writable&&e.isOperator("="));)this.next.isError()&&this.errors.push(new Wo(this.next.toString(),this.input,this.locationText(),this.location)),this.advance(),e=this.next},t}(),Wp=function(){function e(){this.errors=[]}return e.prototype.visitImplicitReceiver=function(e,t){},e.prototype.visitThisReceiver=function(e,t){},e.prototype.visitInterpolation=function(e,t){},e.prototype.visitLiteralPrimitive=function(e,t){},e.prototype.visitPropertyRead=function(e,t){},e.prototype.visitPropertyWrite=function(e,t){},e.prototype.visitSafePropertyRead=function(e,t){},e.prototype.visitMethodCall=function(e,t){},e.prototype.visitSafeMethodCall=function(e,t){},e.prototype.visitFunctionCall=function(e,t){},e.prototype.visitLiteralArray=function(e,t){this.visitAll(e.expressions,t)},e.prototype.visitLiteralMap=function(e,t){this.visitAll(e.values,t)},e.prototype.visitUnary=function(e,t){},e.prototype.visitBinary=function(e,t){},e.prototype.visitPrefixNot=function(e,t){},e.prototype.visitNonNullAssert=function(e,t){},e.prototype.visitConditional=function(e,t){},e.prototype.visitPipe=function(e,t){this.errors.push("pipes")},e.prototype.visitKeyedRead=function(e,t){},e.prototype.visitKeyedWrite=function(e,t){},e.prototype.visitAll=function(e,t){var n=this;return e.map((function(e){return e.visit(n,t)}))},e.prototype.visitChain=function(e,t){},e.prototype.visitQuote=function(e,t){},e}(),zp=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.errors=[],t}return r(t,e),t.prototype.visitPipe=function(){this.errors.push("pipes")},t}(Ss);function Kp(e,t){return void 0===t&&(t=!1),Lt(Object.keys(e).map((function(n){return{key:n,quoted:t,value:e[n]}})))}function Qp(){return Hp||(Hp={},Xp(O.HTML,["iframe|srcdoc","*|innerHTML","*|outerHTML"]),Xp(O.STYLE,["*|style"]),Xp(O.URL,["*|formAction","area|href","area|ping","audio|src","a|href","a|ping","blockquote|cite","body|background","del|cite","form|action","img|src","img|srcset","input|src","ins|cite","q|cite","source|src","source|srcset","track|src","video|poster","video|src"]),Xp(O.RESOURCE_URL,["applet|code","applet|codebase","base|href","embed|src","frame|src","head|profile","html|manifest","iframe|src","link|href","media|src","object|codebase","object|data","script|src"])),Hp}function Xp(e,t){var n,r;try{for(var o=i(t),s=o.next();!s.done;s=o.next())Hp[s.value.toLowerCase()]=e}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}}
/**
     * @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 Gp=function Gp(){},$p=["[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop,slot,*message,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored","[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate","abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate","media^[HTMLElement]|!autoplay,!controls,%controlsList,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,*waitingforkey,#playbackRate,preload,src,%srcObject,#volume",":svg:^[HTMLElement]|*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex",":svg:graphics^:svg:|",":svg:animation^:svg:|*begin,*end,*repeat",":svg:geometry^:svg:|",":svg:componentTransferFunction^:svg:|",":svg:gradient^:svg:|",":svg:textContent^:svg:graphics|",":svg:textPositioning^:svg:textContent|","a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username","area^[HTMLElement]|alt,coords,download,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,rel,search,shape,target,username","audio^media|","br^[HTMLElement]|clear","base^[HTMLElement]|href,target","body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink","button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value","canvas^[HTMLElement]|#height,#width","content^[HTMLElement]|select","dl^[HTMLElement]|!compact","datalist^[HTMLElement]|","details^[HTMLElement]|!open","dialog^[HTMLElement]|!open,returnValue","dir^[HTMLElement]|!compact","div^[HTMLElement]|align","embed^[HTMLElement]|align,height,name,src,type,width","fieldset^[HTMLElement]|!disabled,name","font^[HTMLElement]|color,face,size","form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target","frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src","frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows","hr^[HTMLElement]|align,color,!noShade,size,width","head^[HTMLElement]|","h1,h2,h3,h4,h5,h6^[HTMLElement]|align","html^[HTMLElement]|version","iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width","img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width","input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width","li^[HTMLElement]|type,#value","label^[HTMLElement]|htmlFor","legend^[HTMLElement]|align","link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,referrerPolicy,rel,%relList,rev,%sizes,target,type","map^[HTMLElement]|name","marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width","menu^[HTMLElement]|!compact","meta^[HTMLElement]|content,httpEquiv,name,scheme","meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value","ins,del^[HTMLElement]|cite,dateTime","ol^[HTMLElement]|!compact,!reversed,#start,type","object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width","optgroup^[HTMLElement]|!disabled,label","option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value","output^[HTMLElement]|defaultValue,%htmlFor,name,value","p^[HTMLElement]|align","param^[HTMLElement]|name,type,value,valueType","picture^[HTMLElement]|","pre^[HTMLElement]|#width","progress^[HTMLElement]|#max,#value","q,blockquote,cite^[HTMLElement]|","script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type","select^[HTMLElement]|autocomplete,!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value","shadow^[HTMLElement]|","slot^[HTMLElement]|name","source^[HTMLElement]|media,sizes,src,srcset,type","span^[HTMLElement]|","style^[HTMLElement]|!disabled,media,type","caption^[HTMLElement]|align","th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width","col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width","table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width","tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign","tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign","template^[HTMLElement]|","textarea^[HTMLElement]|autocapitalize,autocomplete,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap","title^[HTMLElement]|text","track^[HTMLElement]|!default,kind,label,src,srclang","ul^[HTMLElement]|!compact,type","unknown^[HTMLElement]|","video^media|#height,poster,#width",":svg:a^:svg:graphics|",":svg:animate^:svg:animation|",":svg:animateMotion^:svg:animation|",":svg:animateTransform^:svg:animation|",":svg:circle^:svg:geometry|",":svg:clipPath^:svg:graphics|",":svg:defs^:svg:graphics|",":svg:desc^:svg:|",":svg:discard^:svg:|",":svg:ellipse^:svg:geometry|",":svg:feBlend^:svg:|",":svg:feColorMatrix^:svg:|",":svg:feComponentTransfer^:svg:|",":svg:feComposite^:svg:|",":svg:feConvolveMatrix^:svg:|",":svg:feDiffuseLighting^:svg:|",":svg:feDisplacementMap^:svg:|",":svg:feDistantLight^:svg:|",":svg:feDropShadow^:svg:|",":svg:feFlood^:svg:|",":svg:feFuncA^:svg:componentTransferFunction|",":svg:feFuncB^:svg:componentTransferFunction|",":svg:feFuncG^:svg:componentTransferFunction|",":svg:feFuncR^:svg:componentTransferFunction|",":svg:feGaussianBlur^:svg:|",":svg:feImage^:svg:|",":svg:feMerge^:svg:|",":svg:feMergeNode^:svg:|",":svg:feMorphology^:svg:|",":svg:feOffset^:svg:|",":svg:fePointLight^:svg:|",":svg:feSpecularLighting^:svg:|",":svg:feSpotLight^:svg:|",":svg:feTile^:svg:|",":svg:feTurbulence^:svg:|",":svg:filter^:svg:|",":svg:foreignObject^:svg:graphics|",":svg:g^:svg:graphics|",":svg:image^:svg:graphics|",":svg:line^:svg:geometry|",":svg:linearGradient^:svg:gradient|",":svg:mpath^:svg:|",":svg:marker^:svg:|",":svg:mask^:svg:|",":svg:metadata^:svg:|",":svg:path^:svg:geometry|",":svg:pattern^:svg:|",":svg:polygon^:svg:geometry|",":svg:polyline^:svg:geometry|",":svg:radialGradient^:svg:gradient|",":svg:rect^:svg:geometry|",":svg:svg^:svg:graphics|#currentScale,#zoomAndPan",":svg:script^:svg:|type",":svg:set^:svg:animation|",":svg:stop^:svg:|",":svg:style^:svg:|!disabled,media,title,type",":svg:switch^:svg:graphics|",":svg:symbol^:svg:|",":svg:tspan^:svg:textPositioning|",":svg:text^:svg:textPositioning|",":svg:textPath^:svg:textContent|",":svg:title^:svg:|",":svg:use^:svg:graphics|",":svg:view^:svg:|#zoomAndPan","data^[HTMLElement]|value","keygen^[HTMLElement]|!autofocus,challenge,!disabled,form,keytype,name","menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default","summary^[HTMLElement]|","time^[HTMLElement]|dateTime",":svg:cursor^:svg:|"],Yp={class:"className",for:"htmlFor",formaction:"formAction",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},Jp=Object.keys(Yp).reduce((function(e,t){return e[Yp[t]]=t,e}),{}),Zp=function(e){function t(){var t=e.call(this)||this;return t._schema={},$p.forEach((function(e){var n={},r=o(e.split("|"),2),i=r[0],s=r[1].split(","),a=o(i.split("^"),2),u=a[1];a[0].split(",").forEach((function(e){return t._schema[e.toLowerCase()]=n}));var p=u&&t._schema[u.toLowerCase()];p&&Object.keys(p).forEach((function(e){n[e]=p[e]})),s.forEach((function(e){if(e.length>0)switch(e[0]){case"*":break;case"!":n[e.substring(1)]="boolean";break;case"#":n[e.substring(1)]="number";break;case"%":n[e.substring(1)]="object";break;default:n[e]="string"}}))})),t}return r(t,e),t.prototype.hasProperty=function(e,t,n){if(n.some((function(e){return e.name===W.name})))return!0;if(e.indexOf("-")>-1){if(u(e)||p(e))return!1;if(n.some((function(e){return e.name===q.name})))return!0}return!!(this._schema[e.toLowerCase()]||this._schema.unknown)[t]},t.prototype.hasElement=function(e,t){if(t.some((function(e){return e.name===W.name})))return!0;if(e.indexOf("-")>-1){if(u(e)||p(e))return!0;if(t.some((function(e){return e.name===q.name})))return!0}return!!this._schema[e.toLowerCase()]},t.prototype.securityContext=function(e,t,n){n&&(t=this.getMappedPropName(t)),e=e.toLowerCase(),t=t.toLowerCase();var r=Qp()[e+"|"+t];return r||(r=Qp()["*|"+t])||O.NONE},t.prototype.getMappedPropName=function(e){return Yp[e]||e},t.prototype.getDefaultComponentElementName=function(){return"ng-component"},t.prototype.validateProperty=function(e){return e.toLowerCase().startsWith("on")?{error:!0,msg:"Binding to event property '"+e+"' is disallowed for security reasons, please use ("+e.slice(2)+")=...\nIf '"+e+"' is a directive input, make sure the directive is imported by the current module."}:{error:!1}},t.prototype.validateAttribute=function(e){return e.toLowerCase().startsWith("on")?{error:!0,msg:"Binding to event attribute '"+e+"' is disallowed for security reasons, please use ("+e.slice(2)+")=..."}:{error:!1}},t.prototype.allKnownElementNames=function(){return Object.keys(this._schema)},t.prototype.allKnownAttributesOfElement=function(e){var t=this._schema[e.toLowerCase()]||this._schema.unknown;return Object.keys(t).map((function(e){var t;return null!==(t=Jp[e])&&void 0!==t?t:e}))},t.prototype.normalizeAnimationStyleProperty=function(e){return function t(e){return e.replace(on,(function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1].toUpperCase()}))}(e)},t.prototype.normalizeAnimationStyleValue=function(e,t,n){var r="",i=n.toString().trim(),o=null;if(function s(e){switch(e){case"width":case"height":case"minWidth":case"minHeight":case"maxWidth":case"maxHeight":case"left":case"top":case"bottom":case"right":case"fontSize":case"outlineWidth":case"outlineOffset":case"paddingTop":case"paddingLeft":case"paddingBottom":case"paddingRight":case"marginTop":case"marginLeft":case"marginBottom":case"marginRight":case"borderRadius":case"borderWidth":case"borderTopWidth":case"borderLeftWidth":case"borderRightWidth":case"borderBottomWidth":case"textIndent":return!0;default:return!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
     */(e)&&0!==n&&"0"!==n)if("number"==typeof n)r="px";else{var a=n.match(/^[+-]?[\d\.]+([a-z]*)$/);a&&0==a[1].length&&(o="Please provide a CSS unit value for "+t+":"+n)}return{error:o,value:i+r}},t}(Gp),el=new Set(["iframe|srcdoc","*|innerhtml","*|outerhtml","embed|src","object|codebase","object|data"]);function tl(e,t){return e=e.toLowerCase(),t=t.toLowerCase(),el.has(e+"|"+t)||el.has("*|"+t)}var nl,rl=/^(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.*)$/,il={start:"[(",end:")]"},ol={start:"[",end:"]"},sl={start:"(",end:")"},al=function(){function t(e,t){this.bindingParser=e,this.options=t,this.errors=[],this.styles=[],this.styleUrls=[],this.ngContentSelectors=[],this.commentNodes=[],this.inI18nBlock=!1}return t.prototype.visitElement=function(e){var t,n,r=this,o=ki(e.i18n);o&&(this.inI18nBlock&&this.reportError("Cannot mark an element as translatable inside of a translatable section. Please remove the nested i18n marker.",e.sourceSpan),this.inI18nBlock=!0);var a=Zu(e);if(a.type===Wu.SCRIPT)return null;if(a.type===Wu.STYLE){var u=function p(e){return 1===e.children.length&&e.children[0]instanceof Ma?e.children[0].value:null}(e);return null!==u&&this.styles.push(u),null}if(a.type===Wu.STYLESHEET&&qu(a.hrefAttr))return this.styleUrls.push(a.hrefAttr),null;var c=l(e.name),h=[],f=[],d=[],v=[],m=[],y={},g=[],E=[],_=!1;try{for(var S=i(e.attrs),x=S.next();!x.done;x=S.next()){var w=x.value,C=!1,b=pl(w.name),T=!1;if(w.i18n&&(y[w.name]=w.i18n),b.startsWith("*")){_&&this.reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *",w.sourceSpan),T=!0,_=!0;var M=w.value,P=b.substring("*".length),N=[];this.bindingParser.parseInlineTemplateBinding(P,M,w.sourceSpan,w.valueSpan?w.valueSpan.start.offset:w.sourceSpan.start.offset+w.name.length,[],g,N,!0),E.push.apply(E,s(N.map((function(e){return new Ir(e.name,e.value,e.sourceSpan,e.keySpan,e.valueSpan)}))))}else C=this.parseAttribute(c,w,[],h,f,d,v);C||T||m.push(this.visitAttribute(w))}}catch(e){t={error:e}}finally{try{x&&!x.done&&(n=S.return)&&n.call(S)}finally{if(t)throw t.error}}var A,I=Oa(a.nonBindable?ul:this,e.children);if(a.type===Wu.NG_CONTENT){e.children&&!e.children.every((function(e){return function t(e){return e instanceof Ma&&0==e.value.trim().length}(e)||function n(e){return e instanceof ka}(e)}))&&this.reportError("<ng-content> element cannot have content.",e.sourceSpan);var k=a.selectAttr,O=e.attrs.map((function(e){return r.visitAttribute(e)}));A=new Ar(k,O,e.sourceSpan,e.i18n),this.ngContentSelectors.push(k)}else c?(O=this.extractAttributes(e.name,h,y),A=new Nr(e.name,m,O.bound,f,[],I,v,d,e.sourceSpan,e.startSourceSpan,e.endSourceSpan,e.i18n)):(O=this.extractAttributes(e.name,h,y),A=new Pr(e.name,m,O.bound,f,I,v,e.sourceSpan,e.startSourceSpan,e.endSourceSpan,e.i18n));if(_){O=this.extractAttributes("ng-template",g,y);var R=[];O.literal.forEach((function(e){return R.push(e)})),O.bound.forEach((function(e){return R.push(e)}));var D=A instanceof Pr?{attributes:A.attributes,inputs:A.inputs,outputs:A.outputs}:{attributes:[],inputs:[],outputs:[]};A=new Nr(A.name,D.attributes,D.inputs,D.outputs,R,[A],[],E,e.sourceSpan,e.startSourceSpan,e.endSourceSpan,c&&o?void 0:e.i18n)}return o&&(this.inI18nBlock=!1),A},t.prototype.visitAttribute=function(e){return new br(e.name,e.value,e.sourceSpan,e.keySpan,e.valueSpan,e.i18n)},t.prototype.visitText=function(e){return this._visitTextWithInterpolation(e.value,e.sourceSpan,e.i18n)},t.prototype.visitExpansion=function(e){var t=this;if(!e.i18n)return null;if(!ki(e.i18n))throw new Error('Invalid type "'+e.i18n.constructor+'" for "i18n" property of '+e.sourceSpan.toString()+'. Expected a "Message"');var n=e.i18n,r={},i={};return Object.keys(n.placeholders).forEach((function(e){var o=n.placeholders[e];if(e.startsWith("VAR_")){var s=e.trim(),a=t.bindingParser.parseInterpolationExpression(o.text,o.sourceSpan);r[s]=new Cr(a,o.sourceSpan)}else i[e]=t._visitTextWithInterpolation(o.text,o.sourceSpan)})),new Or(r,i,e.sourceSpan,n)},t.prototype.visitExpansionCase=function(e){return null},t.prototype.visitComment=function(e){return this.options.collectCommentNodes&&this.commentNodes.push(new xr(e.value||"",e.sourceSpan)),null},t.prototype.extractAttributes=function(e,t,n){var r=this,i=[],o=[];return t.forEach((function(t){var s=n[t.name];if(t.isLiteral)o.push(new br(t.name,t.expression.source||"",t.sourceSpan,t.keySpan,t.valueSpan,s));else{var a=r.bindingParser.createBoundElementProperty(e,t,!0,!1);i.push(Tr.fromBoundElementProperty(a,s))}})),{bound:i,literal:o}},t.prototype.parseAttribute=function(e,t,n,r,i,o,s){var a=pl(t.name),u=t.value,p=t.sourceSpan,l=t.valueSpan?t.valueSpan.start.offset:p.start.offset;function c(e,n,r){var i=e.start.moveBy(n.length+(t.name.length-a.length)),o=i.moveBy(r.length);return new ko(i,o,i,r)}var h=a.match(rl);if(h){if(null!=h[1]){var f=c(p,h[1],S=h[7]);this.bindingParser.parsePropertyBinding(S,u,!1,p,l,t.valueSpan,n,r,f)}else if(h[2])if(e){var d=c(p,h[2],S=h[7]);this.parseVariable(S,u,p,d,t.valueSpan,o)}else this.reportError('"let-" is only supported on ng-template elements.',p);else if(h[3]){var v=c(p,h[3],S=h[7]);this.parseReference(S,u,p,v,t.valueSpan,s)}else if(h[4]){var m=[],y=c(p,h[4],S=h[7]);this.bindingParser.parseEvent(S,u,p,t.valueSpan||p,n,m,y),ll(m,i)}else if(h[5]){var g=c(p,h[5],S=h[7]);this.bindingParser.parsePropertyBinding(S,u,!1,p,l,t.valueSpan,n,r,g),this.parseAssignmentEvent(S,u,p,t.valueSpan,n,i,g)}else if(h[6]){var E=c(p,"",a);this.bindingParser.parseLiteralAttr(a,u,p,l,t.valueSpan,n,r,E)}return!0}var _=null;if(a.startsWith(il.start)?_=il:a.startsWith(ol.start)?_=ol:a.startsWith(sl.start)&&(_=sl),null!==_&&a.endsWith(_.end)&&a.length>_.start.length+_.end.length){var S=a.substring(_.start.length,a.length-_.end.length),x=c(p,_.start,S);return _.start===il.start?(this.bindingParser.parsePropertyBinding(S,u,!1,p,l,t.valueSpan,n,r,x),this.parseAssignmentEvent(S,u,p,t.valueSpan,n,i,x)):_.start===ol.start?this.bindingParser.parsePropertyBinding(S,u,!1,p,l,t.valueSpan,n,r,x):(this.bindingParser.parseEvent(S,u,p,t.valueSpan||p,n,m=[],x),ll(m,i)),!0}var w=c(p,"",a);return this.bindingParser.parsePropertyInterpolation(a,u,p,t.valueSpan,n,r,w)},t.prototype._visitTextWithInterpolation=function(e,t,n){var r=uu(e),i=this.bindingParser.parseInterpolation(r,t);return i?new Cr(i,t,n):new wr(r,t)},t.prototype.parseVariable=function(e,t,n,r,i,o){e.indexOf("-")>-1?this.reportError('"-" is not allowed in variable names',n):0===e.length&&this.reportError("Variable does not have a name",n),o.push(new Ir(e,t,n,r,i))},t.prototype.parseReference=function(e,t,n,r,i,o){e.indexOf("-")>-1?this.reportError('"-" is not allowed in reference names',n):0===e.length?this.reportError("Reference does not have a name",n):o.some((function(t){return t.name===e}))&&this.reportError('Reference "#'+e+'" is defined more than once',n),o.push(new kr(e,t,n,r,i))},t.prototype.parseAssignmentEvent=function(e,t,n,r,i,o,s){var a=[];this.bindingParser.parseEvent(e+"Change",t+"=$event",n,r||n,i,a,s),ll(a,o)},t.prototype.reportError=function(t,n,r){void 0===r&&(r=e.ParseErrorLevel.ERROR),this.errors.push(new Oo(n,t,r))},t}(),ul=new(function(){function e(){}return e.prototype.visitElement=function(e){var t=Zu(e);if(t.type===Wu.SCRIPT||t.type===Wu.STYLE||t.type===Wu.STYLESHEET)return null;var n=Oa(this,e.children,null);return new Pr(e.name,Oa(this,e.attrs),[],[],n,[],e.sourceSpan,e.startSourceSpan,e.endSourceSpan)},e.prototype.visitComment=function(e){return null},e.prototype.visitAttribute=function(e){return new br(e.name,e.value,e.sourceSpan,e.keySpan,e.valueSpan,e.i18n)},e.prototype.visitText=function(e){return new wr(e.value,e.sourceSpan)},e.prototype.visitExpansion=function(e){return null},e.prototype.visitExpansionCase=function(e){return null},e}());function pl(e){return/^data-/i.test(e)?e.substring(5):e}function ll(e,t){t.push.apply(t,s(e.map((function(e){return Mr.fromParsedEvent(e)}))))}!function(e){e[e.ELEMENT=0]="ELEMENT",e[e.TEMPLATE=1]="TEMPLATE"}(nl||(nl={}));var cl=function(){function e(e,t,n,r,i,o){void 0===n&&(n=0),void 0===r&&(r=null),this.index=e,this.ref=t,this.level=n,this.templateIndex=r,this.meta=i,this.registry=o,this.bindings=new Set,this.placeholders=new Map,this.isEmitted=!1,this._unresolvedCtxCount=0,this._registry=o||function s(){return{getUniqueId:Li(),icus:new Map}}(),this.id=this._registry.getUniqueId()}return e.prototype.appendTag=function(e,t,n,r){t.isVoid&&r||Vi(this.placeholders,t.isVoid||!r?t.startName:t.closeName,{type:e,index:n,ctx:this.id,isVoid:t.isVoid,closed:r})},Object.defineProperty(e.prototype,"icus",{get:function(){return this._registry.icus},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isRoot",{get:function(){return 0===this.level},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isResolved",{get:function(){return 0===this._unresolvedCtxCount},enumerable:!1,configurable:!0}),e.prototype.getSerializedPlaceholders=function(){var e=new Map;return this.placeholders.forEach((function(t,n){return e.set(n,t.map(vl))})),e},e.prototype.appendBinding=function(e){this.bindings.add(e)},e.prototype.appendIcu=function(e,t){Vi(this._registry.icus,e,t)},e.prototype.appendBoundText=function(e){var t=this;ji(e,this.bindings.size,this.id).forEach((function(e,n){return Vi.apply(void 0,s([t.placeholders,n],e))}))},e.prototype.appendTemplate=function(e,t){this.appendTag(nl.TEMPLATE,e,t,!1),this.appendTag(nl.TEMPLATE,e,t,!0),this._unresolvedCtxCount++},e.prototype.appendElement=function(e,t,n){this.appendTag(nl.ELEMENT,e,t,n)},e.prototype.appendProjection=function(e,t){this.appendTag(nl.ELEMENT,e,t,!1),this.appendTag(nl.ELEMENT,e,t,!0)},e.prototype.forkChildContext=function(t,n,r){return new e(t,this.ref,this.level+1,n,r,this._registry)},e.prototype.reconcileChildContext=function(e){var t=this;["start","close"].forEach((function(n){var r=(t.placeholders.get(e.meta[n+"Name"])||[]).find(dl(t.id,e.templateIndex));r&&(r.ctx=e.id)})),e.placeholders.forEach((function(n,r){var i=t.placeholders.get(r);if(i){var o=i.findIndex(dl(e.id,e.templateIndex));if(o>=0){var a=r.startsWith("CLOSE");r.endsWith("NG-TEMPLATE")?i.splice.apply(i,s([o+(a?0:1),0],n)):(n[a?n.length-1:0].tmpl=i[o],i.splice.apply(i,s([o,1],n)))}else i.push.apply(i,s(n));t.placeholders.set(r,i)}else t.placeholders.set(r,n)})),this._unresolvedCtxCount--},e}();function hl(e,t,n,r){return Fi((r?"/":"")+e+t,n)}function fl(e,t,n){var r=t.index,i=t.ctx;return t.isVoid?hl(e,r,i)+hl(e,r,i,!0):hl(e,r,i,n)}function dl(e,t){return function(n){return"object"==typeof n&&n.type===nl.TEMPLATE&&n.index===t&&n.ctx===e}}function vl(e){var t=function(e,t){return fl("#",e,t)},n=function(e,t){return fl("*",e,t)};switch(e.type){case nl.ELEMENT:return e.closed?t(e,!0)+(e.tmpl?n(e.tmpl,!0):""):e.tmpl?n(e.tmpl)+t(e)+(e.isVoid?n(e.tmpl,!0):""):t(e);case nl.TEMPLATE:return n(e,e.closed);default: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
     */var ml=new(function(){function e(){}return e.prototype.visitText=function(e){return e.value},e.prototype.visitContainer=function(e){var t=this;return e.children.map((function(e){return e.visit(t)})).join("")},e.prototype.visitIcu=function(e){var t=this,n=Object.keys(e.cases).map((function(n){return n+" {"+e.cases[n].visit(t)+"}"}));return"{"+e.expressionPlaceholder+", "+e.type+", "+n.join(" ")+"}"},e.prototype.visitTagPlaceholder=function(e){var t=this;return e.isVoid?this.formatPh(e.startName):""+this.formatPh(e.startName)+e.children.map((function(e){return e.visit(t)})).join("")+this.formatPh(e.closeName)},e.prototype.visitPlaceholder=function(e){return this.formatPh(e.name)},e.prototype.visitIcuPlaceholder=function(e,t){return this.formatPh(e.name)},e.prototype.formatPh=function(e){return"{"+Hi(e,!1)+"}"},e}());function yl(e){return e.visit(ml)}
/**
     * @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 gl={A:"LINK",B:"BOLD_TEXT",BR:"LINE_BREAK",EM:"EMPHASISED_TEXT",H1:"HEADING_LEVEL1",H2:"HEADING_LEVEL2",H3:"HEADING_LEVEL3",H4:"HEADING_LEVEL4",H5:"HEADING_LEVEL5",H6:"HEADING_LEVEL6",HR:"HORIZONTAL_RULE",I:"ITALIC_TEXT",LI:"LIST_ITEM",LINK:"MEDIA_LINK",OL:"ORDERED_LIST",P:"PARAGRAPH",Q:"QUOTATION",S:"STRIKETHROUGH_TEXT",SMALL:"SMALL_TEXT",SUB:"SUBSTRIPT",SUP:"SUPERSCRIPT",TBODY:"TABLE_BODY",TD:"TABLE_CELL",TFOOT:"TABLE_FOOTER",TH:"TABLE_HEADER_CELL",THEAD:"TABLE_HEADER",TR:"TABLE_ROW",TT:"MONOSPACED_TEXT",U:"UNDERLINED_TEXT",UL:"UNORDERED_LIST"},El=function(){function e(){this._placeHolderNameCounts={},this._signatureToName={}}return e.prototype.getStartTagPlaceholderName=function(e,t,n){var r=this._hashTag(e,t,n);if(this._signatureToName[r])return this._signatureToName[r];var i=e.toUpperCase(),o=gl[i]||"TAG_"+i,s=this._generateUniqueName(n?o:"START_"+o);return this._signatureToName[r]=s,s},e.prototype.getCloseTagPlaceholderName=function(e){var t=this._hashClosingTag(e);if(this._signatureToName[t])return this._signatureToName[t];var n=e.toUpperCase(),r=this._generateUniqueName("CLOSE_"+(gl[n]||"TAG_"+n));return this._signatureToName[t]=r,r},e.prototype.getPlaceholderName=function(e,t){var n=e.toUpperCase(),r="PH: "+n+"="+t;if(this._signatureToName[r])return this._signatureToName[r];var i=this._generateUniqueName(n);return this._signatureToName[r]=i,i},e.prototype.getUniquePlaceholder=function(e){return this._generateUniqueName(e.toUpperCase())},e.prototype._hashTag=function(e,t,n){return"<"+e+Object.keys(t).sort().map((function(e){return" "+e+"="+t[e]})).join("")+(n?"/>":"></"+e+">")},e.prototype._hashClosingTag=function(e){return this._hashTag("/"+e,{},!1)},e.prototype._generateUniqueName=function(e){if(!this._placeHolderNameCounts.hasOwnProperty(e))return this._placeHolderNameCounts[e]=1,e;var t=this._placeHolderNameCounts[e];return this._placeHolderNameCounts[e]=t+1,e+"_"+t},e}(),_l=new jp(new bp);function Sl(e){var t=new wl(_l,e);return function(e,n,r,i,o){return t.toI18nMessage(e,n,r,i,o)}}function xl(e,t){return t}var wl=function(){function e(e,t){this._expressionParser=e,this._interpolationConfig=t}return e.prototype.toI18nMessage=function(e,t,n,r,i){void 0===t&&(t=""),void 0===n&&(n=""),void 0===r&&(r="");var o={isIcu:1==e.length&&e[0]instanceof Pa,icuDepth:0,placeholderRegistry:new El,placeholderToContent:{},placeholderToMessage:{},visitNodeFn:i||xl},s=Oa(this,e,o);return new Lr(s,o.placeholderToContent,o.placeholderToMessage,t,n,r)},e.prototype.visitElement=function(e,t){var n,r=Oa(this,e.children,t),i={};e.attrs.forEach((function(e){i[e.name]=e.value}));var o=y(e.name).isVoid,s=t.placeholderRegistry.getStartTagPlaceholderName(e.name,i,o);t.placeholderToContent[s]={text:e.startSourceSpan.toString(),sourceSpan:e.startSourceSpan};var a="";o||(a=t.placeholderRegistry.getCloseTagPlaceholderName(e.name),t.placeholderToContent[a]={text:"</"+e.name+">",sourceSpan:null!==(n=e.endSourceSpan)&&void 0!==n?n:e.sourceSpan});var u=new Ur(e.name,i,s,a,r,o,e.sourceSpan,e.startSourceSpan,e.endSourceSpan);return t.visitNodeFn(e,u)},e.prototype.visitAttribute=function(e,t){var n=this._visitTextWithInterpolation(e.value,e.valueSpan||e.sourceSpan,t,e.i18n);return t.visitNodeFn(e,n)},e.prototype.visitText=function(e,t){var n=this._visitTextWithInterpolation(e.value,e.sourceSpan,t,e.i18n);return t.visitNodeFn(e,n)},e.prototype.visitComment=function(e,t){return null},e.prototype.visitExpansion=function(e,t){var n=this;t.icuDepth++;var r={},i=new jr(e.switchValue,e.type,r,e.sourceSpan);if(e.cases.forEach((function(e){r[e.value]=new Vr(e.expression.map((function(e){return e.visit(n,t)})),e.expSourceSpan)})),t.icuDepth--,t.isIcu||t.icuDepth>0){var o=t.placeholderRegistry.getUniquePlaceholder("VAR_"+e.type);return i.expressionPlaceholder=o,t.placeholderToContent[o]={text:e.switchValue,sourceSpan:e.switchValueSourceSpan},t.visitNodeFn(e,i)}var s=t.placeholderRegistry.getPlaceholderName("ICU",e.sourceSpan.toString());t.placeholderToMessage[s]=this.toI18nMessage([e],"","","",void 0);var a=new qr(i,s,e.sourceSpan);return t.visitNodeFn(e,a)},e.prototype.visitExpansionCase=function(e,t){throw new Error("Unreachable code")},e.prototype._visitTextWithInterpolation=function(e,t,n,r){var i=this._expressionParser.splitInterpolation(e,t.start.toString(),this._interpolationConfig),o=i.strings,s=i.expressions;if(0===s.length)return new Br(e,t);for(var a=[],u=0;u<o.length-1;u++)this._addText(a,o[u],t),this._addPlaceholder(a,n,s[u],t);return this._addText(a,o[o.length-1],t),function p(e,t){if(t instanceof Lr&&(function n(e){var t=e.nodes;if(1!==t.length||!(t[0]instanceof Vr))throw new Error("Unexpected previous i18n message - expected it to consist of only a single `Container` node.")}(t),t=t.nodes[0]),t instanceof Vr){!function r(e,t){if(e.length!==t.length)throw new Error("The number of i18n message children changed between first and second pass.");if(e.some((function(e,n){return t[n].constructor!==e.constructor})))throw new Error("The types of the i18n message children changed between first and second pass.")}(t.children,e);for(var i=0;i<e.length;i++)e[i].sourceSpan=t.children[i].sourceSpan}}(a,r),new Vr(a,t)},e.prototype._addText=function(e,t,n){if(t.text.length>0){var r=Cl(n,t);e.push(new Br(t.text,r))}},e.prototype._addPlaceholder=function(e,t,n,r){var i=Cl(r,n),o=function s(e){return e.split(bl)[2]}(n.text)||"INTERPOLATION",a=t.placeholderRegistry.getPlaceholderName(o,n.text);t.placeholderToContent[a]={text:this._interpolationConfig.start+n.text+this._interpolationConfig.end,sourceSpan:i},e.push(new Hr(n.text,a,i))},e}();function Cl(e,t){var n=t.end;return new ko(e.fullStart.moveBy(t.start),e.fullStart.moveBy(n))}var bl=/\/\/[\s\S]*i18n[\s\S]*\([\s\S]*ph[\s\S]*=[\s\S]*("|')([\s\S]*?)\1[\s\S]*\)/g,Tl=function(e){function t(t,n){return e.call(this,t,n)||this}return r(t,e),t}(Oo),Ml=function(e,t){return e instanceof ba&&(t instanceof qr&&e.i18n instanceof Lr&&(t.previousMessage=e.i18n),e.i18n=t),t},Pl=function(){function e(e,t,n){void 0===e&&(e=yo),void 0===t&&(t=!1),void 0===n&&(n=!1),this.interpolationConfig=e,this.keepI18nAttrs=t,this.enableI18nLegacyMessageIdFormat=n,this.hasI18nMeta=!1,this._errors=[],this._createI18nMessage=Sl(this.interpolationConfig)}return e.prototype._generateI18nMessage=function(e,t,n){void 0===t&&(t="");var r=this._parseMetadata(t),i=this._createI18nMessage(e,r.meaning,r.description,r.customId,n);return this._setMessageId(i,t),this._setLegacyIds(i,t),i},e.prototype.visitAllWithErrors=function(e){var t=this,n=e.map((function(e){return e.visit(t,null)}));return new eu(n,this._errors)},e.prototype.visitElement=function(e){var t,n,r,o;if(function s(e){return e.attrs.some((function(e){return Ii(e.name)}))}(e)){this.hasI18nMeta=!0;var a=[],u={};try{for(var p=i(e.attrs),l=p.next();!l.done;l=p.next())if("i18n"===(v=l.value).name){var c=this._generateI18nMessage(e.children,e.i18n||v.value,Ml);c.nodes.length&&(e.i18n=c)}else if(v.name.startsWith("i18n-")){var h=v.name.slice("i18n-".length);tl(e.name,h)?this._reportError(v,"Translating attribute '"+h+"' is disallowed for security reasons."):u[h]=v.value}else a.push(v)}catch(e){t={error:e}}finally{try{l&&!l.done&&(n=p.return)&&n.call(p)}finally{if(t)throw t.error}}if(Object.keys(u).length)try{for(var f=i(a),d=f.next();!d.done;d=f.next()){var v,m=u[(v=d.value).name];void 0!==m&&v.value&&(v.i18n=this._generateI18nMessage([v],v.i18n||m))}}catch(e){r={error:e}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}this.keepI18nAttrs||(e.attrs=a)}return Oa(this,e.children,e.i18n),e},e.prototype.visitExpansion=function(e,t){var n,r=e.i18n;if(this.hasI18nMeta=!0,r instanceof qr){var i=r.name;Di(n=this._generateI18nMessage([e],r)).name=i}else n=this._generateI18nMessage([e],t||r);return e.i18n=n,e},e.prototype.visitText=function(e){return e},e.prototype.visitAttribute=function(e){return e},e.prototype.visitComment=function(e){return e},e.prototype.visitExpansionCase=function(e){return e},e.prototype._parseMetadata=function(e){return"string"==typeof e?function t(e){var t,n,r,i,s;if(void 0===e&&(e=""),e=e.trim()){var a=e.indexOf("@@"),u=e.indexOf("|"),p=void 0;p=(t=o(a>-1?[e.slice(0,a),e.slice(a+2)]:[e,""],2))[0],r=t[1],i=(n=o(u>-1?[p.slice(0,u),p.slice(u+1)]:["",p],2))[0],s=n[1]}return{customId:r,meaning:i,description:s}}(e):e instanceof Lr?e:{}},e.prototype._setMessageId=function(e,t){e.id||(e.id=t instanceof Lr&&t.id||Yr(e))},e.prototype._setLegacyIds=function(e,t){if(this.enableI18nLegacyMessageIdFormat)e.legacyIds=[$r(e),Jr(e)];else if("string"!=typeof t){var n=t instanceof Lr?t:t instanceof qr?t.previousMessage:void 0;e.legacyIds=n?n.legacyIds:[]}},e.prototype._reportError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}();function Nl(e,t,n,r){var i=[Ut(function o(e){return e.nodes.map((function(e){return e.visit(Al,null)})).join("")}(t))];Object.keys(r).length&&i.push(Kp(r,!0));var s=n.set(It("goog.getMsg").callFn(i)).toConstDecl(),a=function u(e){var t=[];return e.description&&t.push({tagName:"desc",text:e.description}),e.meaning&&t.push({tagName:"meaning",text:e.meaning}),0==t.length?null:At(t)}(t);return null!==a&&s.addLeadingComment(a),[s,new ht(e.set(n))]}var Al=new(function(){function e(){}return e.prototype.formatPh=function(e){return"{$"+Hi(e)+"}"},e.prototype.visitText=function(e){return e.value},e.prototype.visitContainer=function(e){var t=this;return e.children.map((function(e){return e.visit(t)})).join("")},e.prototype.visitIcu=function(e){return yl(e)},e.prototype.visitTagPlaceholder=function(e){var t=this;return e.isVoid?this.formatPh(e.startName):""+this.formatPh(e.startName)+e.children.map((function(e){return e.visit(t)})).join("")+this.formatPh(e.closeName)},e.prototype.visitPlaceholder=function(e){return this.formatPh(e.name)},e.prototype.visitIcuPlaceholder=function(e,t){return this.formatPh(e.name)},e}());function Il(e,t,n){var r=function i(e){var t=[];return e.nodes.forEach((function(e){return e.visit(kl,t)})),function n(e){var t=[],n=[];e[0]instanceof Fe&&t.push(Ol(e[0].sourceSpan.start));for(var r=0;r<e.length;r++){var i=e[r];i instanceof De?t.push(i):(n.push(i),e[r-1]instanceof Fe&&t.push(Ol(e[r-1].sourceSpan.end)))}return e[e.length-1]instanceof Fe&&t.push(Ol(e[e.length-1].sourceSpan.end)),{messageParts:t,placeHolders:n}}(t)}(t),o=r.messageParts,s=r.placeHolders,a=function u(e){var t=e.nodes[0];return new ko(t.sourceSpan.start,e.nodes[e.nodes.length-1].sourceSpan.end,t.sourceSpan.fullStart,t.sourceSpan.details)}(t),p=s.map((function(e){return n[e.text]})),l=function c(e,t,n,r,i){return new Le(e,t,n,r,i)}(t,o,s,p,a),h=e.set(l);return[new ht(h)]}var kl=new(function(){function e(){}return e.prototype.visitText=function(e,t){t[t.length-1]instanceof De?t[t.length-1].text+=e.value:t.push(new De(e.value,e.sourceSpan))},e.prototype.visitContainer=function(e,t){var n=this;e.children.forEach((function(e){return e.visit(n,t)}))},e.prototype.visitIcu=function(e,t){t.push(new De(yl(e),e.sourceSpan))},e.prototype.visitTagPlaceholder=function(e,t){var n,r,i=this;t.push(this.createPlaceholderPiece(e.startName,null!==(n=e.startSourceSpan)&&void 0!==n?n:e.sourceSpan)),e.isVoid||(e.children.forEach((function(e){return e.visit(i,t)})),t.push(this.createPlaceholderPiece(e.closeName,null!==(r=e.endSourceSpan)&&void 0!==r?r:e.sourceSpan)))},e.prototype.visitPlaceholder=function(e,t){t.push(this.createPlaceholderPiece(e.name,e.sourceSpan))},e.prototype.visitIcuPlaceholder=function(e,t){t.push(this.createPlaceholderPiece(e.name,e.sourceSpan))},e.prototype.createPlaceholderPiece=function(e,t){return new Fe(Hi(e,!1),t)},e}());function Ol(e){return new De("",new ko(e,e))}var Rl=new Set(["$event"]),Dl=new Map([["window",rr.resolveWindow],["document",rr.resolveDocument],["body",rr.resolveBody]]),Fl=[" ","\n","\r","\t"];function Ll(e,t){return Vt(It("rf").bitwiseAnd(Ut(e),null,!1),t)}function Bl(e,t,n){void 0===t&&(t=null),void 0===n&&(n=null);var r=e.type,i=e.name,o=e.target,a=e.phase,u=e.handler;if(o&&!Dl.has(o))throw new Error("Unexpected global target '"+o+"' defined for '"+i+"' event.\n        Supported list of global targets: "+Array.from(Dl.keys())+".");var p=new Set,l=null===n||0===n.bindingLevel?It("ctx"):n.getOrCreateSharedContextVar(0),c=As(n,l,u,"b",(function(){return vn("Unexpected interpolation")}),e.handlerSpan,p,Rl),h=[];n&&(h.push.apply(h,s(n.restoreViewStatement())),h.push.apply(h,s(n.variableDeclarations()))),h.push.apply(h,s(c.render3Stmts));var f=1===r?function d(e,t){return"@"+e+"."+t}(i,a):i,v=t&&An(t),m=[];p.has("$event")&&m.push(new Ge("$event",pe));var y=Bt(m,h,le,null,v),g=[Ut(f),y];return o&&g.push(Ut(!1),kt(Dl.get(o))),g}var Vl=function(){function e(e,t,n,r,i,o,s,a,u,p,l,c,h,f,d){var v=this;void 0===n&&(n=0),void 0===d&&(d=function m(){return{prepareStatements:[],constExpressions:[],i18nVarRefsCache:new Map}}()),this.constantPool=e,this.level=n,this.contextName=r,this.i18nContext=i,this.templateIndex=o,this.templateName=s,this.directiveMatcher=a,this.directives=u,this.pipeTypeByName=p,this.pipes=l,this._namespace=c,this.i18nUseExternalIds=f,this._constants=d,this._dataIndex=0,this._bindingContext=0,this._prefixCode=[],this._creationCodeFns=[],this._updateCodeFns=[],this._currentIndex=0,this._tempVariables=[],this._nestedTemplateFns=[],this._unsupported=Qi,this.i18n=null,this._pureFunctionSlots=0,this._bindingSlots=0,this._ngContentReservedSlots=[],this._ngContentSelectorsOffset=0,this._implicitReceiverExpr=null,this.visitReference=Xi,this.visitVariable=Xi,this.visitTextAttribute=Xi,this.visitBoundAttribute=Xi,this.visitBoundEvent=Xi,this._bindingScope=t.nestedScope(n),this.fileBasedI18nSuffix=h.replace(/[^A-Za-z0-9]/g,"_")+"_",this._valueConverter=new jl(e,(function(){return v.allocateDataSlot()}),(function(e){return v.allocatePureFunctionSlots(e)}),(function(e,t,n,r){var i=p.get(e);i&&v.pipes.add(i),v._bindingScope.set(v.level,t,r),v.creationInstruction(null,rr.pipe,[Ut(n),Ut(e)])}))}return e.prototype.buildTemplateFunction=function(e,t,n,r){var i=this;void 0===n&&(n=0),this._ngContentSelectorsOffset=n,this._namespace!==rr.namespaceHTML&&this.creationInstruction(null,this._namespace),t.forEach((function(e){return i.registerContextVariables(e)}));var o=this.i18nContext||ki(r)&&!Oi(r)&&!(function a(e){return 1===e.length&&e[0]instanceof Pr}(e)&&e[0].i18n===r),u=nc(e);if(o&&this.i18nStart(null,r,u),Dr(this,e),this._pureFunctionSlots+=this._bindingSlots,this._valueConverter.updatePipeSlotOffsets(this._bindingSlots),this._nestedTemplateFns.forEach((function(e){return e()})),0===this.level&&this._ngContentReservedSlots.length){var p=[];if(this._ngContentReservedSlots.length>1||"*"!==this._ngContentReservedSlots[0]){var l=this._ngContentReservedSlots.map((function(e){return"*"!==e?J(e):e}));p.push(this.constantPool.getConstLiteral(Gi(l),!0))}this.creationInstruction(null,rr.projectionDef,p,!0)}o&&this.i18nEnd(null,u);var c=this._creationCodeFns.map((function(e){return e()})),h=this._updateCodeFns.map((function(e){return e()})),f=this._bindingScope.viewSnapshotStatements(),d=this._bindingScope.variableDeclarations().concat(this._tempVariables),v=c.length>0?[Ll(1,f.concat(c))]:[],m=h.length>0?[Ll(2,d.concat(h))]:[];return Bt([new Ge("rf",he),new Ge("ctx",null)],s(this._prefixCode,v,m),le,null,this.templateName)},e.prototype.getLocal=function(e){return this._bindingScope.get(e)},e.prototype.notifyImplicitReceiverUse=function(){this._bindingScope.notifyImplicitReceiverUse()},e.prototype.i18nTranslate=function(e,t,n,r){var i;void 0===t&&(t={});var o=n||this.i18nGenerateMainBlockVar(),a=function u(e,t,n,r,i){void 0===r&&(r={});var o=[Wi(t),Vt(rc(),Nl(t,e,n,Ui(r,!0)),Il(t,e,Ui(r,!1)))];return i&&o.push(new ht(t.set(i(t)))),o}(e,o,this.i18nGenerateClosureVar(e.id),t,r);return(i=this._constants.prepareStatements).push.apply(i,s(a)),o},e.prototype.registerContextVariables=function(e){var t=this._bindingScope.freshReferenceName(),n=this.level,r=It(e.name+t);this._bindingScope.set(n,e.name,r,1,(function(t,i){var o;return o=t.bindingLevel===n?It("ctx"):t.getSharedContextName(n)||Wl(i),[r.set(o.prop(e.value||"$implicit")).toConstDecl()]}))},e.prototype.i18nAppendBindings=function(e){var t=this;e.length>0&&e.forEach((function(e){return t.i18n.appendBinding(e)}))},e.prototype.i18nBindProps=function(e){var t=this,n={};return Object.keys(e).forEach((function(r){var i=e[r];if(i instanceof wr)n[r]=Ut(i.value);else{var o=i.value.visit(t._valueConverter);if(t.allocateBindingSlots(o),o instanceof ps){var s=o.expressions,a=t.i18n,u=function p(e,t,n){if(void 0===t&&(t=0),void 0===n&&(n=0),!e.length)return"";for(var r="",i=e.length-1,o=0;o<i;o++)r+=""+e[o]+Fi(t+o,n);return r+e[i]}(o.strings,a.bindings.size,a.id);t.i18nAppendBindings(s),n[r]=Ut(u)}}})),n},e.prototype.i18nGenerateMainBlockVar=function(){return It(this.constantPool.uniqueName("i18n_"))},e.prototype.i18nGenerateClosureVar=function(e){var t,n=this.fileBasedI18nSuffix.toUpperCase();if(this.i18nUseExternalIds){var r=qi("EXTERNAL_"),i=this.constantPool.uniqueName(n);t=""+r+An(e)+"$$"+i}else r=qi(n),t=this.constantPool.uniqueName(r);return It(t)},e.prototype.i18nUpdateRef=function(e){var t=e.icus,n=e.meta;if(e.isRoot&&e.isResolved&&!e.isEmitted&&!Oi(n)){e.isEmitted=!0;var r=e.getSerializedPlaceholders(),i={},o=r.size?Bi(r):{};t.size&&t.forEach((function(e,t){if(1===e.length)o[t]=e[0];else{var n=Fi("I18N_EXP_"+t);o[t]=Ut(n),i[t]=Ft(e)}}));var s=void 0;(Array.from(r.values()).some((function(e){return e.length>1}))||Object.keys(i).length)&&(s=function(e){var t=[e];return Object.keys(i).length&&t.push(Kp(i,!0)),ql(null,rr.i18nPostprocess,t)}),this.i18nTranslate(n,o,e.ref,s)}},e.prototype.i18nStart=function(e,t,n){void 0===e&&(e=null);var r=this.allocateDataSlot();this.i18n=this.i18nContext?this.i18nContext.forkChildContext(r,this.templateIndex,t):new cl(r,this.i18nGenerateMainBlockVar(),0,this.templateIndex,t);var i=this.i18n,o=i.id,s=i.ref,a=[Ut(r),this.addToConsts(s)];o>0&&a.push(Ut(o)),this.creationInstruction(e,n?rr.i18n:rr.i18nStart,a)},e.prototype.i18nEnd=function(e,t){var n=this;if(void 0===e&&(e=null),!this.i18n)throw new Error("i18nEnd is executed with no i18n context present");this.i18nContext?(this.i18nContext.reconcileChildContext(this.i18n),this.i18nUpdateRef(this.i18nContext)):this.i18nUpdateRef(this.i18n);var r=this.i18n,i=r.index,o=r.bindings;if(o.size){var s=[];o.forEach((function(t){s.push({sourceSpan:e,value:function(){return n.convertPropertyBinding(t)}})})),this.updateInstructionChainWithAdvance(this.getConstCount()-1,rr.i18nExp,s),this.updateInstruction(e,rr.i18nApply,[Ut(i)])}t||this.creationInstruction(e,rr.i18nEnd),this.i18n=null},e.prototype.i18nAttributesInstruction=function(e,t,n){var r=this,i=!1,o=[],s=[];if(t.forEach((function(e){var t=e.i18n,a=e.value.visit(r._valueConverter);if(r.allocateBindingSlots(a),a instanceof ps){var u=Bi(ji(t));o.push(Ut(e.name),r.i18nTranslate(t,u)),a.expressions.forEach((function(e){i=!0,s.push({sourceSpan:n,value:function(){return r.convertPropertyBinding(e)}})}))}})),s.length>0&&this.updateInstructionChainWithAdvance(e,rr.i18nExp,s),o.length>0){var a=Ut(this.allocateDataSlot()),u=this.addToConsts(Ft(o));this.creationInstruction(n,rr.i18nAttributes,[a,u]),i&&this.updateInstruction(n,rr.i18nApply,[a])}},e.prototype.getNamespaceInstruction=function(e){switch(e){case"math":return rr.namespaceMathML;case"svg":return rr.namespaceSVG;default:return rr.namespaceHTML}},e.prototype.addNamespaceInstruction=function(e,t){this._namespace=e,this.creationInstruction(t.startSourceSpan,e)},e.prototype.interpolatedUpdateInstruction=function(e,t,n,r,i,o){var a=this;this.updateInstructionWithAdvance(t,r.sourceSpan,e,(function(){return s([Ut(n)],a.getUpdateInstructionArguments(i),o)}))},e.prototype.visitContent=function(e){var t=this.allocateDataSlot(),n=this._ngContentSelectorsOffset+this._ngContentReservedSlots.length,r=[Ut(t)];this._ngContentReservedSlots.push(e.selector);var i=e.attributes.filter((function(e){return"select"!==e.name.toLowerCase()})),o=this.getAttributeExpressions(e.name,i,[],[]);o.length>0?r.push(Ut(n),Ft(o)):0!==n&&r.push(Ut(n)),this.creationInstruction(e.sourceSpan,rr.projection,r),this.i18n&&this.i18n.appendProjection(e.i18n,t)},e.prototype.visitElement=function(e){var t,n,r,p,l=this,c=this.allocateDataSlot(),h=new _p(null),f=!1,d=ki(e.i18n)&&!Oi(e.i18n),v=[],m=o(a(e.name),2),y=m[0],g=m[1],E=u(e.name);try{for(var _=i(e.attributes),S=_.next();!S.done;S=_.next()){var x=S.value,w=x.name,C=x.value;"ngNonBindable"===w?f=!0:"style"===w?h.registerStyleAttr(C):"class"===w?h.registerClassAttr(C):v.push(x)}}catch(e){t={error:e}}finally{try{S&&!S.done&&(n=_.return)&&n.call(_)}finally{if(t)throw t.error}}this.matchDirectives(e.name,e);var b=[Ut(c)];E||b.push(Ut(g));var T=[],M=[];e.inputs.forEach((function(e){h.registerBoundInput(e)||(0===e.type&&e.i18n?M.push(e):T.push(e))}));var P=this.getAttributeExpressions(e.name,v,T,e.outputs,h,[],M);b.push(this.addAttrsToConsts(P));var N=this.prepareRefsArray(e.references);b.push(this.addToConsts(N));var A=this._namespace,I=this.getNamespaceInstruction(y);I!==A&&this.addNamespaceInstruction(I,e),this.i18n&&this.i18n.appendElement(e.i18n,c);var k=!d&&this.i18n?!nc(e.children):e.children.length>0,O=!h.hasBindingsWithPipes&&0===e.outputs.length&&0===M.length&&!k,R=!O&&nc(e.children);if(O)this.creationInstruction(e.sourceSpan,E?rr.elementContainer:rr.element,Yi(b));else{if(this.creationInstruction(e.startSourceSpan,E?rr.elementContainerStart:rr.elementStart,Yi(b)),f&&this.creationInstruction(e.startSourceSpan,rr.disableBindings),M.length>0&&this.i18nAttributesInstruction(c,M,null!==(r=e.startSourceSpan)&&void 0!==r?r:e.sourceSpan),e.outputs.length>0){var D=e.outputs.map((function(t){return{sourceSpan:t.sourceSpan,params:l.prepareListenerParameter(e.name,t,c)}}));this.creationInstructionChain(rr.listener,D)}d&&this.i18nStart(e.startSourceSpan,e.i18n,R)}for(var F=h.buildUpdateLevelInstructions(this._valueConverter),L=F.length-1,B=0;B<=L;B++)this._bindingSlots+=this.processStylingUpdateInstruction(c,F[B]);var V=Ut(void 0),j=[],U=[];if(T.forEach((function(e){var t=e.type;if(4===t){var n=e.value.visit(l._valueConverter),r=!(n instanceof ss&&!n.value);l.allocateBindingSlots(n),j.push({name:gr(e.name),sourceSpan:e.sourceSpan,value:function(){return r?l.convertPropertyBinding(n):V}})}else{if(e.i18n)return;var i=e.value.visit(l._valueConverter);if(void 0!==i){var u=[],p=o(a(e.name),2),h=p[0],f=p[1],d=Zl(e.securityContext,1===t);if(d&&u.push(d),h){var v=Ut(h);d?u.push(v):u.push(Ut(null),v)}if(l.allocateBindingSlots(i),0===t)i instanceof ps?l.interpolatedUpdateInstruction(Gl(i),c,f,e,i,u):j.push({name:f,sourceSpan:e.sourceSpan,value:function(){return l.convertPropertyBinding(i)},params:u});else if(1===t)if(i instanceof ps&&oo(i)>1)l.interpolatedUpdateInstruction(function m(e){switch(oo(e)){case 3:return rr.attributeInterpolate1;case 5:return rr.attributeInterpolate2;case 7:return rr.attributeInterpolate3;case 9:return rr.attributeInterpolate4;case 11:return rr.attributeInterpolate5;case 13:return rr.attributeInterpolate6;case 15:return rr.attributeInterpolate7;case 17:return rr.attributeInterpolate8;default:return rr.attributeInterpolateV}}(i),c,f,e,i,u);else{var y=i instanceof ps?i.expressions[0]:i;U.push({name:f,sourceSpan:e.sourceSpan,value:function(){return l.convertPropertyBinding(y)},params:u})}else l.updateInstructionWithAdvance(c,e.sourceSpan,rr.classProp,(function(){return s([Ut(c),Ut(f),l.convertPropertyBinding(i)],u)}))}}})),j.length>0&&this.updateInstructionChainWithAdvance(c,rr.property,j),U.length>0&&this.updateInstructionChainWithAdvance(c,rr.attribute,U),Dr(this,e.children),!d&&this.i18n&&this.i18n.appendElement(e.i18n,c,!0),!O){var H=null!==(p=e.endSourceSpan)&&void 0!==p?p:e.sourceSpan;d&&this.i18nEnd(H,R),f&&this.creationInstruction(H,rr.enableBindings),this.creationInstruction(H,E?rr.elementContainerEnd:rr.elementEnd)}},e.prototype.visitTemplate=function(t){var n,r=this,u=this.allocateDataSlot();this.i18n&&this.i18n.appendTemplate(t.i18n,u);var p=An(t.tagName||""),l=this.contextName+(p?"_"+p:"")+"_"+u,c=l+"_Template",h=[Ut(u),It(c),Ut(t.tagName?a(t.tagName)[1]:t.tagName)];this.matchDirectives("ng-template",t);var f=this.getAttributeExpressions("ng-template",t.attributes,t.inputs,t.outputs,void 0,t.templateAttrs);if(h.push(this.addAttrsToConsts(f)),t.references&&t.references.length){var d=this.prepareRefsArray(t.references);h.push(this.addToConsts(d)),h.push(kt(rr.templateRefExtractor))}var v=new e(this.constantPool,this._bindingScope,this.level+1,l,this.i18n,u,c,this.directiveMatcher,this.directives,this.pipeTypeByName,this.pipes,this._namespace,this.fileBasedI18nSuffix,this.i18nUseExternalIds,this._constants);if(this._nestedTemplateFns.push((function(){var e,n=v.buildTemplateFunction(t.children,t.variables,r._ngContentReservedSlots.length+r._ngContentSelectorsOffset,t.i18n);r.constantPool.statements.push(n.toDeclStmt(c)),v._ngContentReservedSlots.length&&(e=r._ngContentReservedSlots).push.apply(e,s(v._ngContentReservedSlots))})),this.creationInstruction(t.sourceSpan,rr.templateCreate,(function(){return h.splice(2,0,Ut(v.getConstCount()),Ut(v.getVarCount())),Yi(h)})),this.templatePropertyBindings(u,t.templateAttrs),"ng-template"===t.tagName){var m=o(function y(e,t){var n,r,o=[],s=[];try{for(var a=i(e),u=a.next();!u.done;u=a.next()){var p=u.value;(t(p)?o:s).push(p)}}catch(e){n={error:e}}finally{try{u&&!u.done&&(r=a.return)&&r.call(a)}finally{if(n)throw n.error}}return[o,s]}(t.inputs,Ri),2),g=m[0],E=m[1];if(g.length>0&&this.i18nAttributesInstruction(u,g,null!==(n=t.startSourceSpan)&&void 0!==n?n:t.sourceSpan),E.length>0&&this.templatePropertyBindings(u,E),t.outputs.length>0){var _=t.outputs.map((function(e){return{sourceSpan:e.sourceSpan,params:r.prepareListenerParameter("ng_template",e,u)}}));this.creationInstructionChain(rr.listener,_)}}},e.prototype.visitBoundText=function(e){var t=this;if(this.i18n){var n=e.value.visit(this._valueConverter);return this.allocateBindingSlots(n),void(n instanceof ps&&(this.i18n.appendBoundText(e.i18n),this.i18nAppendBindings(n.expressions)))}var r=this.allocateDataSlot();this.creationInstruction(e.sourceSpan,rr.text,[Ut(r)]);var i=e.value.visit(this._valueConverter);this.allocateBindingSlots(i),i instanceof ps?this.updateInstructionWithAdvance(r,e.sourceSpan,function o(e){switch(oo(e)){case 1:return rr.textInterpolate;case 3:return rr.textInterpolate1;case 5:return rr.textInterpolate2;case 7:return rr.textInterpolate3;case 9:return rr.textInterpolate4;case 11:return rr.textInterpolate5;case 13:return rr.textInterpolate6;case 15:return rr.textInterpolate7;case 17:return rr.textInterpolate8;default:return rr.textInterpolateV}}(i),(function(){return t.getUpdateInstructionArguments(i)})):vn("Text nodes should be interpolated and never bound directly.")},e.prototype.visitText=function(e){this.i18n||this.creationInstruction(e.sourceSpan,rr.text,[Ut(this.allocateDataSlot()),Ut(e.value)])},e.prototype.visitIcu=function(e){var t=!1;this.i18n||(t=!0,this.i18nStart(null,e.i18n,!0));var n=this.i18n,r=this.i18nBindProps(e.vars),i=this.i18nBindProps(e.placeholders),o=e.i18n,s=function(e){var t=Ui(Object.assign(Object.assign({},r),i),!1);return ql(null,rr.i18nPostprocess,[e,Kp(t,!0)])};if(Oi(n.meta))this.i18nTranslate(o,{},n.ref,s);else{var a=this.i18nTranslate(o,{},void 0,s);n.appendIcu(Di(o).name,a)}return t&&this.i18nEnd(null,!0),null},e.prototype.allocateDataSlot=function(){return this._dataIndex++},e.prototype.getConstCount=function(){return this._dataIndex},e.prototype.getVarCount=function(){return this._pureFunctionSlots},e.prototype.getConsts=function(){return this._constants},e.prototype.getNgContentSelectors=function(){return this._ngContentReservedSlots.length?this.constantPool.getConstLiteral(Gi(this._ngContentReservedSlots),!0):null},e.prototype.bindingContext=function(){return""+this._bindingContext++},e.prototype.templatePropertyBindings=function(e,t){var n=this,r=[];t.forEach((function(t){if(t instanceof Tr){var i=t.value.visit(n._valueConverter);void 0!==i&&(n.allocateBindingSlots(i),i instanceof ps?n.interpolatedUpdateInstruction(Gl(i),e,t.name,t,i,[]):r.push({name:t.name,sourceSpan:t.sourceSpan,value:function(){return n.convertPropertyBinding(i)}}))}})),r.length>0&&this.updateInstructionChainWithAdvance(e,rr.property,r)},e.prototype.instructionFn=function(e,t,n,r,i){void 0===i&&(i=!1),e[i?"unshift":"push"]((function(){var e=Array.isArray(r)?r:r();return ql(t,n,e).toStmt()}))},e.prototype.processStylingUpdateInstruction=function(e,t){var n=this,r=0;if(t){var i=[];t.calls.forEach((function(e){r+=e.allocateBindingSlots,i.push({sourceSpan:e.sourceSpan,value:function(){return e.params((function(t){return e.supportsInterpolation&&t instanceof ps?n.getUpdateInstructionArguments(t):n.convertPropertyBinding(t)}))}})})),this.updateInstructionChainWithAdvance(e,t.reference,i)}return r},e.prototype.creationInstruction=function(e,t,n,r){this.instructionFn(this._creationCodeFns,e,t,n||[],r)},e.prototype.creationInstructionChain=function(e,t){var n=t.length?t[0].sourceSpan:null;this._creationCodeFns.push((function(){return io(e,t.map((function(e){return e.params()})),n).toStmt()}))},e.prototype.updateInstructionWithAdvance=function(e,t,n,r){this.addAdvanceInstructionIfNecessary(e,t),this.updateInstruction(t,n,r)},e.prototype.updateInstruction=function(e,t,n){this.instructionFn(this._updateCodeFns,e,t,n||[])},e.prototype.updateInstructionChain=function(e,t){var n=t.length?t[0].sourceSpan:null;this._updateCodeFns.push((function(){var r=t.map((function(e){var t=e.value(),n=Array.isArray(t)?t:[t];return e.params&&n.push.apply(n,s(e.params)),e.name&&n.unshift(Ut(e.name)),n}));return io(e,r,n).toStmt()}))},e.prototype.updateInstructionChainWithAdvance=function(e,t,n){this.addAdvanceInstructionIfNecessary(e,n.length?n[0].sourceSpan:null),this.updateInstructionChain(t,n)},e.prototype.addAdvanceInstructionIfNecessary=function(e,t){if(e!==this._currentIndex){var n=e-this._currentIndex;if(n<1)throw new Error("advance instruction can only go forwards");this.instructionFn(this._updateCodeFns,t,rr.advance,[Ut(n)]),this._currentIndex=e}},e.prototype.allocatePureFunctionSlots=function(e){var t=this._pureFunctionSlots;return this._pureFunctionSlots+=e,t},e.prototype.allocateBindingSlots=function(e){this._bindingSlots+=e instanceof ps?e.expressions.length:1},e.prototype.getImplicitReceiverExpr=function(){return this._implicitReceiverExpr?this._implicitReceiverExpr:this._implicitReceiverExpr=0===this.level?It("ctx"):this._bindingScope.getOrCreateSharedContextVar(0)},e.prototype.convertPropertyBinding=function(e){var t,n=Ds(this,this.getImplicitReceiverExpr(),e,this.bindingContext(),ks.Expression,(function(){return vn("Unexpected interpolation")})),r=n.currValExpr;return(t=this._tempVariables).push.apply(t,s(n.stmts)),r},e.prototype.getUpdateInstructionArguments=function(e){var t,n=function r(e,t,n,i){var o=new Hs(e,t,i,void 0),s=n.visit(o,Os.Expression);o.usesImplicitReceiver&&e.notifyImplicitReceiverUse();var a=Fs(o,i),u=s.args.slice(1);if(n instanceof ps){var p=n.strings;3===u.length&&""===p[0]&&""===p[1]?u=[u[1]]:u.length>=19&&(u=[Ft(u)])}return{stmts:a,args:u}}(this,this.getImplicitReceiverExpr(),e,this.bindingContext()),i=n.args;return(t=this._tempVariables).push.apply(t,s(n.stmts)),i},e.prototype.matchDirectives=function(e,t){var n=this;if(this.directiveMatcher){var r=Xl(e,ro(t));this.directiveMatcher.match(r,(function(e,t){n.directives.add(t)}))}},e.prototype.getAttributeExpressions=function(e,t,n,r,o,a,u){var p,l;void 0===a&&(a=[]),void 0===u&&(u=[]);var c,h=new Set,f=[];try{for(var d=i(t),v=d.next();!v.done;v=d.next()){var m=v.value;if("ngProjectAs"===m.name&&(c=m),m.i18n){var y=this._constants.i18nVarRefsCache,g=void 0;y.has(m.i18n)?g=y.get(m.i18n):(g=this.i18nTranslate(m.i18n),y.set(m.i18n,g)),f.push(Ut(m.name),g)}else f.push.apply(f,s(Kl(m.name),[ec(e,m)]))}}catch(e){p={error:e}}finally{try{v&&!v.done&&(l=d.return)&&l.call(d)}finally{if(p)throw p.error}}function E(e,t){"string"==typeof e?h.has(e)||(f.push.apply(f,s(Kl(e))),void 0!==t&&f.push(t),h.add(e)):f.push(Ut(e))}if(c&&f.push.apply(f,s(function _(e){var t=J(e.value)[0];return[Ut(5),Gi(t)]}(c))),o&&o.populateInitialStylingAttrs(f),n.length||r.length){for(var S=f.length,x=0;x<n.length;x++){var w=n[x];4!==w.type&&1!==w.type&&E(w.name)}for(x=0;x<r.length;x++){var C=r[x];1!==C.type&&E(C.name)}f.length!==S&&f.splice(S,0,Ut(3))}return a.length&&(f.push(Ut(4)),a.forEach((function(e){return E(e.name)}))),u.length&&(f.push(Ut(6)),u.forEach((function(e){return E(e.name)}))),f},e.prototype.addToConsts=function(e){if(Ht(e))return st;for(var t=this._constants.constExpressions,n=0;n<t.length;n++)if(t[n].isEquivalent(e))return Ut(n);return Ut(t.push(e)-1)},e.prototype.addAttrsToConsts=function(e){return e.length>0?this.addToConsts(Ft(e)):st},e.prototype.prepareRefsArray=function(e){var t=this;return e&&0!==e.length?Gi($n(e.map((function(e){var n=t.allocateDataSlot(),r=t._bindingScope.freshReferenceName(),i=t.level,o=It(r);return t._bindingScope.set(i,e.name,o,0,(function(e,t){var r=t>0?[Wl(t).toStmt()]:[],i=o.set(kt(rr.reference).callFn([Ut(n)]));return r.concat(i.toConstDecl())}),!0),[e.name,e.value]})))):st},e.prototype.prepareListenerParameter=function(e,t,n){var r=this;return function(){var i=t.name,o=1===t.type?_r(i,t.phase):An(i),s=r.templateName+"_"+e+"_"+o+"_"+n+"_listener",a=r._bindingScope.nestedScope(r._bindingScope.bindingLevel,Rl);return Bl(t,s,a)}},e}(),jl=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o.constantPool=t,o.allocateSlot=n,o.allocatePureFunctionSlots=r,o.definePipe=i,o._pipeBindExprs=[],o}return r(t,e),t.prototype.visitPipe=function(e,t){var n=this.allocateSlot(),r="PIPE:"+n,i=this.allocatePureFunctionSlots(2+e.args.length),o=new es(e.span,e.sourceSpan,e.nameSpan,new $o(e.span,e.sourceSpan),r),a=function u(e){var t=Ul[e.length];return{identifier:t||rr.pipeBindV,isVarLength:!t}}(e.args),p=a.isVarLength;this.definePipe(e.name,r,n,kt(a.identifier));var l=s([e.exp],e.args),c=this.visitAll(p?[new as(e.span,e.sourceSpan,l)]:l),h=new ms(e.span,e.sourceSpan,o,s([new ss(e.span,e.sourceSpan,n),new ss(e.span,e.sourceSpan,i)],c));return this._pipeBindExprs.push(h),h},t.prototype.updatePipeSlotOffsets=function(e){this._pipeBindExprs.forEach((function(t){t.args[1].value+=e}))},t.prototype.visitLiteralArray=function(e,t){var n=this;return new Ws(e.span,e.sourceSpan,this.visitAll(e.expressions),(function(e){var t=Ft(e);return zl(n.constantPool,t,n.allocatePureFunctionSlots)}))},t.prototype.visitLiteralMap=function(e,t){var n=this;return new Ws(e.span,e.sourceSpan,this.visitAll(e.values),(function(t){var r=Lt(t.map((function(t,n){return{key:e.keys[n].key,value:t,quoted:e.keys[n].quoted}})));return zl(n.constantPool,r,n.allocatePureFunctionSlots)}))},t}(ws),Ul=[rr.pipeBind1,rr.pipeBind2,rr.pipeBind3,rr.pipeBind4],Hl=[rr.pureFunction0,rr.pureFunction1,rr.pureFunction2,rr.pureFunction3,rr.pureFunction4,rr.pureFunction5,rr.pureFunction6,rr.pureFunction7,rr.pureFunction8];function ql(e,t,n){return kt(t,null,e).callFn(n,e)}function Wl(e){return kt(rr.nextContext).callFn(e>1?[Ut(e)]:[])}function zl(e,t,n){var r=e.getLiteralFactory(t),i=r.literalFactory,o=r.literalFactoryArguments,a=n(1+o.length),u=function p(e){var t=Hl[e.length];return{identifier:t||rr.pureFunctionV,isVarLength:!t}}(o),l=u.identifier,c=u.isVarLength,h=[Ut(a),i];return c?h.push(Ft(o)):h.push.apply(h,s(o)),kt(l).callFn(h)}function Kl(e){var t=o(a(e),2),n=t[0],r=Ut(t[1]);return n?[Ut(0),Ut(n),r]:[r]}var Ql=function(){function e(e,t,n){var r,o;if(void 0===e&&(e=0),void 0===t&&(t=null),this.bindingLevel=e,this.parent=t,this.globals=n,this.map=new Map,this.referenceNameIndex=0,this.restoreViewVariable=null,void 0!==n)try{for(var s=i(n),a=s.next();!a.done;a=s.next()){var u=a.value;this.set(0,u,It(u))}}catch(e){r={error:e}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}}return e.createRootScope=function(){return new e},e.prototype.get=function(e){for(var t=this;t;){var n=t.map.get(e);if(null!=n)return t!==this&&(this.map.set(e,n={retrievalLevel:n.retrievalLevel,lhs:n.lhs,declareLocalCallback:n.declareLocalCallback,declare:!1,priority:n.priority,localRef:n.localRef}),this.maybeGenerateSharedContextVar(n),this.maybeRestoreView(n.retrievalLevel,n.localRef)),n.declareLocalCallback&&!n.declare&&(n.declare=!0),n.lhs;t=t.parent}return 0===this.bindingLevel?null:this.getComponentProperty(e)},e.prototype.set=function(e,t,n,r,i,o){if(void 0===r&&(r=0),this.map.has(t)){if(o)return this;vn("The name "+t+" is already defined in scope to be "+this.map.get(t))}return this.map.set(t,{retrievalLevel:e,lhs:n,declare:!1,declareLocalCallback:i,priority:r,localRef:o||!1}),this},e.prototype.getLocal=function(e){return this.get(e)},e.prototype.notifyImplicitReceiverUse=function(){0!==this.bindingLevel&&(this.map.get("$$shared_ctx$$0").declare=!0)},e.prototype.nestedScope=function(t,n){var r=new e(t,this,n);return t>0&&r.generateSharedContextVar(0),r},e.prototype.getOrCreateSharedContextVar=function(e){var t="$$shared_ctx$$"+e;return this.map.has(t)||this.generateSharedContextVar(e),this.map.get(t).lhs},e.prototype.getSharedContextName=function(e){var t=this.map.get("$$shared_ctx$$"+e);return t&&t.declare?t.lhs:null},e.prototype.maybeGenerateSharedContextVar=function(e){if(1===e.priority&&e.retrievalLevel<this.bindingLevel){var t=this.map.get("$$shared_ctx$$"+e.retrievalLevel);t?t.declare=!0:this.generateSharedContextVar(e.retrievalLevel)}},e.prototype.generateSharedContextVar=function(e){var t=It("ctx"+this.freshReferenceName());this.map.set("$$shared_ctx$$"+e,{retrievalLevel:e,lhs:t,declareLocalCallback:function(e,n){return[t.set(Wl(n)).toConstDecl()]},declare:!1,priority:2,localRef:!1})},e.prototype.getComponentProperty=function(e){var t=this.map.get("$$shared_ctx$$0");return t.declare=!0,this.maybeRestoreView(0,!1),t.lhs.prop(e)},e.prototype.maybeRestoreView=function(e,t){this.isListenerScope()&&(e<this.bindingLevel||t)&&(this.parent.restoreViewVariable||(this.parent.restoreViewVariable=It(this.parent.freshReferenceName())),this.restoreViewVariable=this.parent.restoreViewVariable)},e.prototype.restoreViewStatement=function(){return this.restoreViewVariable?[ql(null,rr.restoreView,[this.restoreViewVariable]).toStmt()]:[]},e.prototype.viewSnapshotStatements=function(){var e=ql(null,rr.getCurrentView,[]);return this.restoreViewVariable?[this.restoreViewVariable.set(e).toConstDecl()]:[]},e.prototype.isListenerScope=function(){return this.parent&&this.parent.bindingLevel===this.bindingLevel},e.prototype.variableDeclarations=function(){var e=this,t=0;return Array.from(this.map.values()).filter((function(e){return e.declare})).sort((function(e,t){return t.retrievalLevel-e.retrievalLevel||t.priority-e.priority})).reduce((function(n,r){var i=e.bindingLevel-r.retrievalLevel,o=r.declareLocalCallback(e,i-t);return t=i,n.concat(o)}),[])},e.prototype.freshReferenceName=function(){for(var e=this;e.parent;)e=e.parent;return"_r"+e.referenceNameIndex++},e}();function Xl(e,t){var n=new S,r=a(e)[1];return n.setElement(r),Object.getOwnPropertyNames(t).forEach((function(e){var r=a(e)[1],i=t[e];n.addAttribute(r,i),"class"===e.toLowerCase()&&i.trim().split(/\s+/).forEach((function(e){return n.addClassName(e)}))})),n}function Gl(e){switch(oo(e)){case 1:return rr.propertyInterpolate;case 3:return rr.propertyInterpolate1;case 5:return rr.propertyInterpolate2;case 7:return rr.propertyInterpolate3;case 9:return rr.propertyInterpolate4;case 11:return rr.propertyInterpolate5;case 13:return rr.propertyInterpolate6;case 15:return rr.propertyInterpolate7;case 17:return rr.propertyInterpolate8;default:return rr.propertyInterpolateV}}function $l(e,t,n){var r;void 0===n&&(n={});var i=n.interpolationConfig,o=n.preserveWhitespaces,a=n.enableI18nLegacyMessageIdFormat,u=null!==(r=n.isInline)&&void 0!==r&&r,p=Jl(i),l=(new iu).parse(e,t,Object.assign(Object.assign({leadingTriviaChars:Fl},n),{tokenizeExpansionForms:!0}));if(!n.alwaysAttemptHtmlToR3AstConversion&&l.errors&&l.errors.length>0){var c={interpolationConfig:i,preserveWhitespaces:o,template:e,templateUrl:t,isInline:u,errors:l.errors,nodes:[],styleUrls:[],styles:[],ngContentSelectors:[]};return n.collectCommentNodes&&(c.commentNodes=[]),c}var h=l.rootNodes,f=new Pl(i,!o,a),d=f.visitAllWithErrors(h);if(!n.alwaysAttemptHtmlToR3AstConversion&&d.errors&&d.errors.length>0){var v={interpolationConfig:i,preserveWhitespaces:o,template:e,templateUrl:t,isInline:u,errors:d.errors,nodes:[],styleUrls:[],styles:[],ngContentSelectors:[]};return n.collectCommentNodes&&(v.commentNodes=[]),v}h=d.rootNodes,o||(h=Oa(new pu,h),f.hasI18nMeta&&(h=Oa(new Pl(i,!1),h)));var m=function y(e,t,n){var r=new al(t,n),i={nodes:Oa(r,e),errors:t.errors.concat(r.errors),styleUrls:r.styleUrls,styles:r.styles,ngContentSelectors:r.ngContentSelectors};return n.collectCommentNodes&&(i.commentNodes=r.commentNodes),i}(h,p,{collectCommentNodes:!!n.collectCommentNodes}),g=m.nodes,E=m.errors,_=m.styleUrls,S=m.styles,x=m.ngContentSelectors,w=m.commentNodes;E.push.apply(E,s(l.errors,d.errors));var C={interpolationConfig:i,preserveWhitespaces:o,errors:E.length>0?E:null,template:e,templateUrl:t,isInline:u,nodes:g,styleUrls:_,styles:S,ngContentSelectors:x};return n.collectCommentNodes&&(C.commentNodes=w),C}var Yl=new Zp;function Jl(e){return void 0===e&&(e=yo),new Xu(new Up(new bp),e,Yl,null,[])}function Zl(e,t){switch(e){case O.HTML:return kt(rr.sanitizeHtml);case O.SCRIPT:return kt(rr.sanitizeScript);case O.STYLE:return t?kt(rr.sanitizeStyle):null;case O.URL:return kt(rr.sanitizeUrl);case O.RESOURCE_URL:return kt(rr.sanitizeResourceUrl);default:return null}}function ec(e,t){var n=Gi(t.value);if(!tl(e,t.name))return n;switch(Yl.securityContext(e,t.name,!0)){case O.HTML:return jt(kt(rr.trustConstantHtml),new Oe([new Re(t.value)],[]),void 0,t.valueSpan);case O.RESOURCE_URL:return jt(kt(rr.trustConstantResourceUrl),new Oe([new Re(t.value)],[]),void 0,t.valueSpan);default:return n}}function tc(e){return e instanceof wr||e instanceof Cr||e instanceof Or}function nc(e){return e.every(tc)}function rc(){return Dt(It("ngI18nClosureMode")).notIdentical(Ut("undefined",fe)).and(It("ngI18nClosureMode"))}var ic=/attr\.([^\]]+)/;function oc(e,t,n){var r=new no,o=J(e.selector);return r.set("type",e.internalType),o.length>0&&r.set("selectors",Gi(o)),e.queries.length>0&&r.set("contentQueries",function a(e,t,n){var r,o,a=[],u=[],p=Ki(u,"_t");try{for(var l=i(e),c=l.next();!c.done;c=l.next()){var h=c.value;a.push(kt(rr.contentQuery).callFn(s([It("dirIndex")],cc(h,t))).toStmt());var f=p(),d=kt(rr.loadQuery).callFn([]),v=kt(rr.queryRefresh).callFn([f.set(d)]),m=It("ctx").prop(h.propertyName).set(h.first?f.prop("first"):f);u.push(v.and(m).toStmt())}}catch(e){r={error:e}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}var y=n?n+"_ContentQueries":null;return Bt([new Ge("rf",he),new Ge("ctx",null),new Ge("dirIndex",null)],[Ll(1,a),Ll(2,u)],le,null,y)}(e.queries,t,e.name)),e.viewQueries.length&&r.set("viewQuery",function u(e,t,n){var r=[],i=[],o=Ki(i,"_t");e.forEach((function(e){var n=kt(rr.viewQuery).callFn(cc(e,t));r.push(n.toStmt());var s=o(),a=kt(rr.loadQuery).callFn([]),u=kt(rr.queryRefresh).callFn([s.set(a)]),p=It("ctx").prop(e.propertyName).set(e.first?s.prop("first"):s);i.push(u.and(p).toStmt())}));var s=n?n+"_Query":null;return Bt([new Ge("rf",he),new Ge("ctx",null)],[Ll(1,r),Ll(2,i)],le,null,s)}(e.viewQueries,t,e.name)),r.set("hostBindings",function p(e,t,n,r,o,a,u){var p=It("ctx"),l=new _p(p),c=e.specialAttributes,h=c.styleAttr,f=c.classAttr;void 0!==h&&l.registerStyleAttr(h),void 0!==f&&l.registerClassAttr(f);var d=[],v=[],m=t,y=gc(e),g=n.createDirectiveHostEventAsts(y,m);if(g&&g.length){var E=function _(e,t){var n=[],r=[],i=[];return e.forEach((function(e){var i=e.name&&An(e.name),o=1===e.type?_r(i,e.targetOrPhase):i,s=t&&i?t+"_"+o+"_HostBindingHandler":null,a=Bl(Mr.fromParsedEvent(e),s);1==e.type?r.push(a):n.push(a)})),r.length>0&&i.push(io(rr.syntheticHostListener,r).toStmt()),n.length>0&&i.push(io(rr.listener,n).toStmt()),i}(g,a);d.push.apply(d,s(E))}var S,x=n.createBoundHostProperties(y,m),w=[],C=0;x&&x.forEach((function(e){l.registerInputBasedOnName(e.name,e.expression,m)?C+=2:(w.push(e),C++)}));var b=function(){return S||(S=new jl(r,(function(){return vn("Unexpected node")}),(function(e){var t=C;return C+=e,t}),(function(){return vn("Unexpected pipe")}))),S},T=[],M=[],P=[];w.forEach((function(e){var t=e.expression.visit(b()),r=yc(p,t),i=function a(e){var t,n=e.name,r=n.match(ic);return r?(n=r[1],t=rr.attribute):e.isAnimation?(n=gr(n),t=rr.syntheticHostProperty):t=rr.hostProperty,{bindingName:n,instruction:t,isAttribute:!!r}}(e),u=i.bindingName,l=i.instruction,c=i.isAttribute,h=n.calcPossibleSecurityContexts(o,u,c).filter((function(e){return e!==O.NONE})),f=null;h.length&&(f=2===h.length&&h.indexOf(O.URL)>-1&&h.indexOf(O.RESOURCE_URL)>-1?kt(rr.sanitizeUrlOrResourceUrl):Zl(h[0],c));var d=[Ut(u),r.currValExpr];f&&d.push(f),v.push.apply(v,s(r.stmts)),l===rr.hostProperty?T.push(d):l===rr.attribute?M.push(d):l===rr.syntheticHostProperty?P.push(d):v.push(kt(l).callFn(d).toStmt())})),T.length>0&&v.push(io(rr.hostProperty,T).toStmt()),M.length>0&&v.push(io(rr.attribute,M).toStmt()),P.length>0&&v.push(io(rr.syntheticHostProperty,P).toStmt());var N=function A(e){var t,n,r=[];try{for(var o=i(Object.getOwnPropertyNames(e)),s=o.next();!s.done;s=o.next()){var a=s.value,u=e[a];r.push(Ut(a),u)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r}(e.attributes);if(l.assignHostAttrs(N,u),l.hasBindings&&l.buildUpdateLevelInstructions(b()).forEach((function(e){if(e.calls.length>0){var t=[];e.calls.forEach((function(e){C+=Math.max(e.allocateBindingSlots-2,0),t.push(function n(e,t,r){return e.params((function(e){return r(t,e).currValExpr}))}(e,p,yc))})),v.push(io(e.reference,t).toStmt())}})),C&&u.set("hostVars",Ut(C)),d.length>0||v.length>0){var I=a?a+"_HostBindings":null,k=[];return d.length>0&&k.push(Ll(1,d)),v.length>0&&k.push(Ll(2,v)),Bt([new Ge("rf",he),new Ge("ctx",null)],k,le,null,I)}return null}(e.host,e.typeSourceSpan,n,t,e.selector||"",e.name,r)),r.set("inputs",$i(e.inputs,!0)),r.set("outputs",$i(e.outputs)),null!==e.exportAs&&r.set("exportAs",Ft(e.exportAs.map((function(e){return Ut(e)})))),r}function sc(e,t){var n=[],r=t.providers,i=t.viewProviders;if(r||i){var o=[r||new tt([])];i&&o.push(i),n.push(kt(rr.ProvidersFeature).callFn(o))}t.usesInheritance&&n.push(kt(rr.InheritDefinitionFeature)),t.fullInheritance&&n.push(kt(rr.CopyDefinitionFeature)),t.lifecycle.usesOnChanges&&n.push(kt(rr.NgOnChangesFeature)),n.length&&e.set("features",Ft(n))}function ac(e,t,n){var r=oc(e,t,n);return sc(r,e),{expression:kt(rr.defineDirective).callFn([r.toLiteralMap()]),type:mc(e)}}function uc(e,t,n){var r,o,a=oc(e,t,n);sc(a,e);var u=e.selector&&S.parse(e.selector),p=u&&u[0];if(p){var l=p.getAttrs();l.length&&a.set("attrs",t.getConstLiteral(Ft(l.map((function(e){return Ut(null!=e?e:void 0)}))),!0))}var c=null;if(e.directives.length>0){var h=new x;try{for(var f=i(e.directives),d=f.next();!d.done;d=f.next()){var v=d.value,m=v.type;h.addSelectables(S.parse(v.selector),m)}}catch(e){r={error:e}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(r)throw r.error}}c=h}var y=e.name,_=y?y+"_Template":null,w=new Set,C=new Set,b=e.changeDetection,T=e.template,M=new Vl(t,Ql.createRootScope(),0,y,null,null,_,c,w,e.pipes,C,rr.namespaceHTML,e.relativeContextFilePath,e.i18nUseExternalIds),P=M.buildTemplateFunction(T.nodes,[]),N=M.getNgContentSelectors();N&&a.set("ngContentSelectors",N),a.set("decls",Ut(M.getConstCount())),a.set("vars",Ut(M.getVarCount()));var A=M.getConsts(),I=A.constExpressions,k=A.prepareStatements;if(I.length>0){var O=Ft(I);k.length>0&&(O=Bt([],s(k,[new ft(O)]))),a.set("consts",O)}if(a.set("template",P),w.size){var R=lc(Ft(Array.from(w)),e.declarationListEmitMode);a.set("directives",R)}if(C.size){var D=lc(Ft(Array.from(C)),e.declarationListEmitMode);a.set("pipes",D)}if(null===e.encapsulation&&(e.encapsulation=g.Emulated),e.styles&&e.styles.length){var F=(e.encapsulation==g.Emulated?function L(e,t,n){var r=new zs;return e.map((function(e){return r.shimCssText(e,t,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.styles,"_ngcontent-%COMP%","_nghost-%COMP%"):e.styles).map((function(e){return t.getConstLiteral(Ut(e))}));a.set("styles",Ft(F))}else e.encapsulation===g.Emulated&&(e.encapsulation=g.None);return e.encapsulation!==g.Emulated&&a.set("encapsulation",Ut(e.encapsulation)),null!==e.animations&&a.set("data",Lt([{key:"animation",value:e.animations,quoted:!1}])),null!=b&&b!==E.Default&&a.set("changeDetection",Ut(b)),{expression:kt(rr.defineComponent).callFn([a.toLiteralMap()]),type:pc(e)}}function pc(e){var t=vc(e);return t.push(dc(e.template.ngContentSelectors)),Rt(kt(rr.ComponentDefWithMeta,t))}function lc(e,t){switch(t){case 0:return e;case 1:return Bt([],[new ft(e)]);case 2:var n=e.callMethod("map",[kt(rr.resolveForwardRef)]);return Bt([],[new ft(n)])}}function cc(e,t){var n=[Ji(e,t),Ut(hc(e))];return e.read&&n.push(e.read),n}function hc(e){return(e.descendants?1:0)|(e.static?2:0)|(e.emitDistinctChangesOnly?4:0)}function fc(e){return Rt(Lt(Object.keys(e).map((function(t){return{key:t,value:Ut(Array.isArray(e[t])?e[t][0]:e[t]),quoted:!0}}))))}function dc(e){return e.length>0?Rt(Ft(e.map((function(e){return Ut(e)})))):de}function vc(e){var t,n=null!==e.selector?e.selector.replace(/\n/g,""):null;return[yr(e.type.type,e.typeArgumentCount),null!==n?(t=n,Rt(Ut(t))):de,null!==e.exportAs?dc(e.exportAs):de,fc(e.inputs),fc(e.outputs),dc(e.queries.map((function(e){return e.propertyName})))]}function mc(e){var t=vc(e);return Rt(kt(rr.DirectiveDefWithMeta,t))}function yc(e,t){return Ds(null,e,t,"b",ks.Expression,(function(){return vn("Unexpected interpolation")}))}function gc(e){return{hostAttributes:{},hostListeners:e.listeners,hostProperties:e.properties}}var Ec=/^(?:\[([^\]]+)\])|(?:\(([^\)]+)\))$/;function _c(e){var t,n,r={},o={},s={},a={};try{for(var u=i(Object.keys(e)),p=u.next();!p.done;p=u.next()){var l=p.value,c=e[l],h=l.match(Ec);if(null===h)switch(l){case"class":if("string"!=typeof c)throw new Error("Class binding must be string");a.classAttr=c;break;case"style":if("string"!=typeof c)throw new Error("Style binding must be string");a.styleAttr=c;break;default:r[l]="string"==typeof c?Ut(c):c}else if(null!=h[1]){if("string"!=typeof c)throw new Error("Property binding must be string");s[h[1]]=c}else if(null!=h[2]){if("string"!=typeof c)throw new Error("Event binding must be string");o[h[2]]=c}}}catch(e){t={error:e}}finally{try{p&&!p.done&&(n=u.return)&&n.call(u)}finally{if(t)throw t.error}}return{attributes:r,listeners:o,properties:s,specialAttributes:a}}function Sc(e,t){var n=gc(e),r=Jl();return r.createDirectiveHostEventAsts(n,t),r.createBoundHostProperties(n,t),r.errors}var xc=function(){function e(){}return e.prototype.get=function(e){return""},e}(),wc=function(){function t(t){void 0===t&&(t=new xo),this.jitEvaluator=t,this.R3ResolvedDependencyType=e.R3ResolvedDependencyType,this.R3FactoryTarget=e.R3FactoryTarget,this.ResourceLoader=xc,this.elementSchemaRegistry=new Zp}return t.prototype.compilePipe=function(e,t,n){var r=Uo({name:n.name,type:Pc(n.type),internalType:new we(n.type),typeArgumentCount:n.typeArgumentCount,deps:jc(n.deps),pipeName:n.pipeName,pure:n.pure});return this.jitExpression(r.expression,e,t,[])},t.prototype.compilePipeDeclaration=function(e,t,n){var r=Uo(function i(e){var t;return{name:e.type.name,type:Pc(e.type),internalType:new we(e.type),typeArgumentCount:0,pipeName:e.name,deps:null,pure:null===(t=e.pure)||void 0===t||t}}(n));return this.jitExpression(r.expression,e,t,[])},t.prototype.compileInjectable=function(e,t,n){var r,i=po({name:n.name,type:Pc(n.type),internalType:new we(n.type),typeArgumentCount:n.typeArgumentCount,providedIn:(r=n.providedIn,null==r||"string"==typeof r?new ke(r):new we(r)),useClass:Bc(n,Cc),useFactory:Bc(n,bc),useValue:Bc(n,Tc),useExisting:Bc(n,Mc),userDeps:jc(n.userDeps)||void 0});return this.jitExpression(i.expression,e,t,i.statements)},t.prototype.compileInjector=function(e,t,n){var r=Bo({name:n.name,type:Pc(n.type),internalType:new we(n.type),providers:new we(n.providers),imports:n.imports.map((function(e){return new we(e)}))});return this.jitExpression(r.expression,e,t,[])},t.prototype.compileNgModule=function(e,t,n){var r=Lo({type:Pc(n.type),internalType:new we(n.type),adjacentType:new we(n.type),bootstrap:n.bootstrap.map(Pc),declarations:n.declarations.map(Pc),imports:n.imports.map(Pc),exports:n.exports.map(Pc),emitInline:!0,containsForwardDecls:!1,schemas:n.schemas?n.schemas.map(Pc):null,id:n.id?new we(n.id):null});return this.jitExpression(r.expression,e,t,[])},t.prototype.compileDirective=function(e,t,n){var r=Ic(n);return this.compileDirectiveFromMeta(e,t,r)},t.prototype.compileDirectiveDeclaration=function(e,t,n){var r=kc(n,this.createParseSourceSpan("Directive",n.type.name,t));return this.compileDirectiveFromMeta(e,t,r)},t.prototype.compileDirectiveFromMeta=function(e,t,n){var r=new Qt,i=ac(n,r,Jl());return this.jitExpression(i.expression,e,t,r.statements)},t.prototype.compileComponent=function(e,t,n){var r=Lc(n.template,n.name,t,n.preserveWhitespaces,n.interpolation),i=r.template,o=r.interpolation,a=Object.assign(Object.assign(Object.assign({},n),Ic(n)),{selector:n.selector||this.elementSchemaRegistry.getDefaultComponentElementName(),template:i,declarationListEmitMode:0,styles:s(n.styles,i.styles),encapsulation:n.encapsulation,interpolation:o,changeDetection:n.changeDetection,animations:null!=n.animations?new we(n.animations):null,viewProviders:null!=n.viewProviders?new we(n.viewProviders):null,relativeContextFilePath:"",i18nUseExternalIds:!0});return this.compileComponentFromMeta(e,"ng:///"+n.name+".js",a)},t.prototype.compileComponentDeclaration=function(e,t,n){var r=function i(e,t,n){var r,i,o,s,a,u=Lc(e.template,e.type.name,n,null!==(r=e.preserveWhitespaces)&&void 0!==r&&r,e.interpolation),p=u.template,l=u.interpolation;return Object.assign(Object.assign({},kc(e,t)),{template:p,styles:null!==(i=e.styles)&&void 0!==i?i:[],directives:(null!==(o=e.directives)&&void 0!==o?o:[]).map(Dc),pipes:Fc(e.pipes),viewProviders:void 0!==e.viewProviders?new we(e.viewProviders):null,animations:void 0!==e.animations?new we(e.animations):null,changeDetection:null!==(s=e.changeDetection)&&void 0!==s?s:E.Default,encapsulation:null!==(a=e.encapsulation)&&void 0!==a?a:g.Emulated,interpolation:l,declarationListEmitMode:2,relativeContextFilePath:"",i18nUseExternalIds:!0})}(n,this.createParseSourceSpan("Component",n.type.name,t),t);return this.compileComponentFromMeta(e,t,r)},t.prototype.compileComponentFromMeta=function(e,t,n){var r=new Qt,i=uc(n,r,Jl(n.interpolation));return this.jitExpression(i.expression,e,t,r.statements)},t.prototype.compileFactory=function(e,t,n){var r=so({name:n.name,type:Pc(n.type),internalType:new we(n.type),typeArgumentCount:n.typeArgumentCount,deps:jc(n.deps),injectFn:"directiveInject"===n.injectFn?Jt.directiveInject:Jt.inject,target:n.target});return this.jitExpression(r.factory,e,t,r.statements)},t.prototype.createParseSourceSpan=function(e,t,n){return Do(e,t,n)},t.prototype.jitExpression=function(t,n,r,i){var o=s(i,[new lt("$def",t,void 0,[e.StmtModifier.Exported])]);return this.jitEvaluator.evaluateStatements(r,o,new Fo(n),!0).$def},t}(),Cc=Object.keys({useClass:null})[0],bc=Object.keys({useFactory:null})[0],Tc=Object.keys({useValue:null})[0],Mc=Object.keys({useExisting:null})[0],Pc=function(e){var t=new we(e);return{value:t,type:t}};function Nc(e){return Object.assign(Object.assign({},e),{predicate:Array.isArray(e.predicate)?e.predicate:new we(e.predicate),read:e.read?new we(e.read):null,static:e.static,emitDistinctChangesOnly:e.emitDistinctChangesOnly})}function Ac(e){var t,n,r,i;return{propertyName:e.propertyName,first:null!==(t=e.first)&&void 0!==t&&t,predicate:Array.isArray(e.predicate)?e.predicate:new we(e.predicate),descendants:null!==(n=e.descendants)&&void 0!==n&&n,read:e.read?new we(e.read):null,static:null!==(r=e.static)&&void 0!==r&&r,emitDistinctChangesOnly:null===(i=e.emitDistinctChangesOnly)||void 0===i||i}}function Ic(e){var t=Hc(e.inputs||[]),n=Hc(e.outputs||[]),r=e.propMetadata,i={},o={},s=function(e){r.hasOwnProperty(e)&&r[e].forEach((function(t){!function n(e){return"Input"===e.ngMetadataName}(t)?function r(e){return"Output"===e.ngMetadataName}(t)&&(o[e]=t.bindingPropertyName||e):i[e]=t.bindingPropertyName?[t.bindingPropertyName,e]:e}))};for(var a in r)s(a);return Object.assign(Object.assign({},e),{typeSourceSpan:e.typeSourceSpan,type:Pc(e.type),internalType:new we(e.type),deps:jc(e.deps),host:Uc(e.propMetadata,e.typeSourceSpan,e.host),inputs:Object.assign(Object.assign({},t),i),outputs:Object.assign(Object.assign({},n),o),queries:e.queries.map(Nc),providers:null!=e.providers?new we(e.providers):null,viewQueries:e.viewQueries.map(Nc),fullInheritance:!1})}function kc(e,t){var n,r,i,o,s,a,u,p;return{name:e.type.name,type:Pc(e.type),typeSourceSpan:t,internalType:new we(e.type),selector:null!==(n=e.selector)&&void 0!==n?n:null,inputs:null!==(r=e.inputs)&&void 0!==r?r:{},outputs:null!==(i=e.outputs)&&void 0!==i?i:{},host:Oc(e.host),queries:(null!==(o=e.queries)&&void 0!==o?o:[]).map(Ac),viewQueries:(null!==(s=e.viewQueries)&&void 0!==s?s:[]).map(Ac),providers:void 0!==e.providers?new we(e.providers):null,exportAs:null!==(a=e.exportAs)&&void 0!==a?a:null,usesInheritance:null!==(u=e.usesInheritance)&&void 0!==u&&u,lifecycle:{usesOnChanges:null!==(p=e.usesOnChanges)&&void 0!==p&&p},deps:null,typeArgumentCount:0,fullInheritance:!1}}function Oc(e){var t,n,r;return void 0===e&&(e={}),{attributes:Rc(null!==(t=e.attributes)&&void 0!==t?t:{}),listeners:null!==(n=e.listeners)&&void 0!==n?n:{},properties:null!==(r=e.properties)&&void 0!==r?r:{},specialAttributes:{classAttr:e.classAttribute,styleAttr:e.styleAttribute}}}function Rc(e){var t,n,r={};try{for(var o=i(Object.keys(e)),s=o.next();!s.done;s=o.next()){var a=s.value;r[a]=new we(e[a])}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r}function Dc(e){var t,n,r;return{selector:e.selector,type:new we(e.type),inputs:null!==(t=e.inputs)&&void 0!==t?t:[],outputs:null!==(n=e.outputs)&&void 0!==n?n:[],exportAs:null!==(r=e.exportAs)&&void 0!==r?r:null}}function Fc(e){var t,n,r=new Map;if(void 0===e)return r;try{for(var o=i(Object.keys(e)),s=o.next();!s.done;s=o.next()){var a=s.value;r.set(a,new we(e[a]))}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r}function Lc(e,t,n,r,i){var o=i?mo.fromArray(i):yo,s=$l(e,n,{preserveWhitespaces:r,interpolationConfig:o});if(null!==s.errors){var a=s.errors.map((function(e){return e.toString()})).join(", ");throw new Error("Errors during JIT compilation of template for "+t+": "+a)}return{template:s,interpolation:o}}function Bc(e,t){return e.hasOwnProperty(t)?new we(e[t]):void 0}function Vc(t){return{token:null===t.token?new ke(null):t.resolved===e.R3ResolvedDependencyType.Attribute?new ke(t.token):new we(t.token),attribute:null,resolved:t.resolved,host:t.host,optional:t.optional,self:t.self,skipSelf:t.skipSelf}}function jc(e){return null==e?null:e.map(Vc)}function Uc(e,t,n){var r=_c(n||{}),i=Sc(r,t);if(i.length)throw new Error(i.map((function(e){return e.msg})).join("\n"));var o=function(t){e.hasOwnProperty(t)&&e[t].forEach((function(e){!function n(e){return"HostBinding"===e.ngMetadataName}(e)?function i(e){return"HostListener"===e.ngMetadataName}(e)&&(r.listeners[e.eventName||t]=t+"("+(e.args||[]).join(",")+")"):r.properties[e.hostPropertyName||t]=Er("this",t)}))};for(var s in e)o(s);return r}function Hc(e){return e.reduce((function(e,t){var n=o(t.split(",").map((function(e){return e.trim()})),2),r=n[0];return e[r]=n[1]||r,e}),{})}function qc(e){(e.ng||(e.ng={})).ɵcompilerFacade=new wc}
/**
     * @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 Wc=new Cn("11.2.14"),zc=function zc(e){var t=void 0===e?{}:e,n=t.defaultEncapsulation,r=t.useJit,i=void 0===r||r,o=t.jitDevMode,s=void 0!==o&&o,a=t.missingTranslation,u=void 0===a?null:a,p=t.preserveWhitespaces,l=t.strictInjectionParameters;this.defaultEncapsulation=void 0===n?g.Emulated:n,this.useJit=!!i,this.jitDevMode=!!s,this.missingTranslation=u,this.preserveWhitespaces=Kc(ln(p)),this.strictInjectionParameters=!0===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
     */function Kc(e,t){return void 0===t&&(t=!1),null===e?t:e}var Qc=function(){function e(e,t,n,r){this._resourceLoader=e,this._urlResolver=t,this._htmlParser=n,this._config=r,this._resourceLoaderCache=new Map}return e.prototype.clearCache=function(){this._resourceLoaderCache.clear()},e.prototype.clearCacheFor=function(e){var t=this;if(e.isComponent){var n=e.template;this._resourceLoaderCache.delete(n.templateUrl),n.externalStylesheets.forEach((function(e){t._resourceLoaderCache.delete(e.moduleUrl)}))}},e.prototype._fetch=function(e){var t=this._resourceLoaderCache.get(e);return t||(t=this._resourceLoader.get(e),this._resourceLoaderCache.set(e,t)),t},e.prototype.normalizeTemplate=function(e){var t=this;if(pn(e.template)){if(pn(e.templateUrl))throw mn("'"+Sn(e.componentType)+"' component cannot define both template and templateUrl");if("string"!=typeof e.template)throw mn("The template specified for component "+Sn(e.componentType)+" is not a string")}else{if(!pn(e.templateUrl))throw mn("No template specified for component "+Sn(e.componentType));if("string"!=typeof e.templateUrl)throw mn("The templateUrl specified for component "+Sn(e.componentType)+" is not a string")}if(pn(e.preserveWhitespaces)&&"boolean"!=typeof e.preserveWhitespaces)throw mn("The preserveWhitespaces option for component "+Sn(e.componentType)+" must be a boolean");return fn(this._preParseTemplate(e),(function(n){return t._normalizeTemplateMetadata(e,n)}))},e.prototype._preParseTemplate=function(e){var t,n,r=this;return null!=e.template?(t=e.template,n=e.moduleUrl):(n=this._urlResolver.resolve(e.moduleUrl,e.templateUrl),t=this._fetch(n)),fn(t,(function(t){return r._preparseLoadedTemplate(e,t,n)}))},e.prototype._preparseLoadedTemplate=function(e,t,n){var r=!!e.template,i=mo.fromArray(e.interpolation),o=Jn({reference:e.ngModuleType},{type:{reference:e.componentType}},{isInline:r,templateUrl:n}),s=this._htmlParser.parse(t,o,{tokenizeExpansionForms:!0,interpolationConfig:i});if(s.errors.length>0)throw mn("Template parse errors:\n"+s.errors.join("\n"));var a=this._normalizeStylesheet(new Un({styles:e.styles,moduleUrl:e.moduleUrl})),u=new Xc;Oa(u,s.rootNodes);var p=this._normalizeStylesheet(new Un({styles:u.styles,styleUrls:u.styleUrls,moduleUrl:n}));return{template:t,templateUrl:n,isInline:r,htmlAst:s,styles:a.styles.concat(p.styles),inlineStyleUrls:a.styleUrls.concat(p.styleUrls),styleUrls:this._normalizeStylesheet(new Un({styleUrls:e.styleUrls,moduleUrl:e.moduleUrl})).styleUrls,ngContentSelectors:u.ngContentSelectors}},e.prototype._normalizeTemplateMetadata=function(e,t){var n=this;return fn(this._loadMissingExternalStylesheets(t.styleUrls.concat(t.inlineStyleUrls)),(function(r){return n._normalizeLoadedTemplateMetadata(e,t,r)}))},e.prototype._normalizeLoadedTemplateMetadata=function(e,t,n){var r=this,i=s(t.styles);this._inlineStyles(t.inlineStyleUrls,n,i);var o=t.styleUrls,a=o.map((function(e){var t=n.get(e),i=s(t.styles);return r._inlineStyles(t.styleUrls,n,i),new Un({moduleUrl:e,styles:i})})),u=e.encapsulation;return null==u&&(u=this._config.defaultEncapsulation),u===g.Emulated&&0===i.length&&0===o.length&&(u=g.None),new Hn({encapsulation:u,template:t.template,templateUrl:t.templateUrl,htmlAst:t.htmlAst,styles:i,styleUrls:o,ngContentSelectors:t.ngContentSelectors,animations:e.animations,interpolation:e.interpolation,isInline:t.isInline,externalStylesheets:a,preserveWhitespaces:Kc(e.preserveWhitespaces,this._config.preserveWhitespaces)})},e.prototype._inlineStyles=function(e,t,n){var r=this;e.forEach((function(e){var i=t.get(e);i.styles.forEach((function(e){return n.push(e)})),r._inlineStyles(i.styleUrls,t,n)}))},e.prototype._loadMissingExternalStylesheets=function(e,t){var n=this;return void 0===t&&(t=new Map),fn(dn(e.filter((function(e){return!t.has(e)})).map((function(e){return fn(n._fetch(e),(function(r){var i=n._normalizeStylesheet(new Un({styles:[r],moduleUrl:e}));return t.set(e,i),n._loadMissingExternalStylesheets(i.styleUrls,t)}))}))),(function(e){return t}))},e.prototype._normalizeStylesheet=function(e){var t=this,n=e.moduleUrl,r=e.styleUrls.filter(qu).map((function(e){return t._urlResolver.resolve(n,e)})),i=e.styles.map((function(e){var i=function o(e,t,n){var r=[],i=n.replace(Ku,"").replace(zu,(function(){for(var n=[],i=0;i<arguments.length;i++)n[i]=arguments[i];var o=n[1]||n[2];return qu(o)?(r.push(e.resolve(t,o)),""):n[0]}));return new Hu(i,r)}(t._urlResolver,n,e);return r.push.apply(r,s(i.styleUrls)),i.style}));return new Un({styles:i,styleUrls:r,moduleUrl:n})},e}(),Xc=function(){function e(){this.ngContentSelectors=[],this.styles=[],this.styleUrls=[],this.ngNonBindableStackCount=0}return e.prototype.visitElement=function(e,t){var n=Zu(e);switch(n.type){case Wu.NG_CONTENT:0===this.ngNonBindableStackCount&&this.ngContentSelectors.push(n.selectAttr);break;case Wu.STYLE:var r="";e.children.forEach((function(e){e instanceof Ma&&(r+=e.value)})),this.styles.push(r);break;case Wu.STYLESHEET:this.styleUrls.push(n.hrefAttr)}return n.nonBindable&&this.ngNonBindableStackCount++,Oa(this,e.children),n.nonBindable&&this.ngNonBindableStackCount--,null},e.prototype.visitExpansion=function(e,t){Oa(this,e.cases)},e.prototype.visitExpansionCase=function(e,t){Oa(this,e.expression)},e.prototype.visitComment=function(e,t){return null},e.prototype.visitAttribute=function(e,t){return null},e.prototype.visitText=function(e,t){return null},e}(),Gc=[I,A,N,P],$c=function(){function e(e){this._reflector=e}return e.prototype.isDirective=function(e){var t=this._reflector.annotations(xn(e));return t&&t.some(Yc)},e.prototype.resolve=function(e,t){void 0===t&&(t=!0);var n=this._reflector.annotations(xn(e));if(n){var r=Jc(n,Yc);if(r){var i=this._reflector.propMetadata(e),o=this._reflector.guards(e);return this._mergeWithPropertyMetadata(r,i,o,e)}}if(t)throw new Error("No Directive annotation found on "+Sn(e));return null},e.prototype._mergeWithPropertyMetadata=function(e,t,n,r){var i=[],o=[],s={},a={};return Object.keys(t).forEach((function(e){var n=Jc(t[e],(function(e){return L.isTypeOf(e)}));n&&i.push(n.bindingPropertyName?e+": "+n.bindingPropertyName:e);var r=Jc(t[e],(function(e){return B.isTypeOf(e)}));r&&o.push(r.bindingPropertyName?e+": "+r.bindingPropertyName:e),t[e].filter((function(e){return V.isTypeOf(e)})).forEach((function(t){if(t.hostPropertyName){var n=t.hostPropertyName[0];if("("===n)throw new Error("@HostBinding can not bind to events. Use @HostListener instead.");if("["===n)throw new Error("@HostBinding parameter should be a property name, 'class.<name>', or 'attr.<name>'.");s["["+t.hostPropertyName+"]"]=e}else s["["+e+"]"]=e})),t[e].filter((function(e){return j.isTypeOf(e)})).forEach((function(t){s["("+t.eventName+")"]=e+"("+(t.args||[]).join(",")+")"}));var u=Jc(t[e],(function(e){return Gc.some((function(t){return t.isTypeOf(e)}))}));u&&(a[e]=u)})),this._merge(e,i,o,s,a,n,r)},e.prototype._extractPublicName=function(e){return sn(e,[null,e])[1].trim()},e.prototype._dedupeBindings=function(e){for(var t=new Set,n=new Set,r=[],i=e.length-1;i>=0;i--){var o=e[i],s=this._extractPublicName(o);n.add(s),t.has(s)||(t.add(s),r.push(o))}return r.reverse()},e.prototype._merge=function(e,t,n,r,i,o,s){var a=this._dedupeBindings(e.inputs?e.inputs.concat(t):t),u=this._dedupeBindings(e.outputs?e.outputs.concat(n):n),p=e.host?Object.assign(Object.assign({},e.host),r):r,l=e.queries?Object.assign(Object.assign({},e.queries),i):i;return D.isTypeOf(e)?D({selector:e.selector,inputs:a,outputs:u,host:p,exportAs:e.exportAs,moduleId:e.moduleId,queries:l,changeDetection:e.changeDetection,providers:e.providers,viewProviders:e.viewProviders,entryComponents:e.entryComponents,template:e.template,templateUrl:e.templateUrl,styles:e.styles,styleUrls:e.styleUrls,encapsulation:e.encapsulation,animations:e.animations,interpolation:e.interpolation,preserveWhitespaces:e.preserveWhitespaces}):k({selector:e.selector,inputs:a,outputs:u,host:p,exportAs:e.exportAs,queries:l,providers:e.providers,guards:o})},e}();function Yc(e){return k.isTypeOf(e)||D.isTypeOf(e)}function Jc(e,t){for(var n=e.length-1;n>=0;n--)if(t(e[n]))return e[n];return null}var Zc,eh=/^i18n:?/,th=!1,nh=function nh(e,t){this.messages=e,this.errors=t};!function(e){e[e.Extract=0]="Extract",e[e.Merge=1]="Merge"}(Zc||(Zc={}));var rh=function(){function e(e,t){this._implicitTags=e,this._implicitAttrs=t}return e.prototype.extract=function(e,t){var n=this;return this._init(Zc.Extract,t),e.forEach((function(e){return e.visit(n,null)})),this._inI18nBlock&&this._reportError(e[e.length-1],"Unclosed block"),new nh(this._messages,this._errors)},e.prototype.merge=function(e,t,n){this._init(Zc.Merge,n),this._translations=t;var r=new Ia("wrapper",[],e,void 0,void 0,void 0).visit(this,null);return this._inI18nBlock&&this._reportError(e[e.length-1],"Unclosed block"),new eu(r.children,this._errors)},e.prototype.visitExpansionCase=function(e,t){var n=Oa(this,e.expression,t);if(this._mode===Zc.Merge)return new Na(e.value,n,e.sourceSpan,e.valueSourceSpan,e.expSourceSpan)},e.prototype.visitExpansion=function(e,t){this._mayBeAddBlockChildren(e);var n=this._inIcu;this._inIcu||(this._isInTranslatableSection&&this._addMessage([e]),this._inIcu=!0);var r=Oa(this,e.cases,t);return this._mode===Zc.Merge&&(e=new Pa(e.switchValue,e.type,r,e.sourceSpan,e.switchValueSourceSpan)),this._inIcu=n,e},e.prototype.visitComment=function(e,t){var n=function r(e){return!!(e instanceof ka&&e.value&&e.value.startsWith("i18n"))}(e);if(n&&this._isInTranslatableSection)this._reportError(e,"Could not start a block inside a translatable section");else{var i=function o(e){return!!(e instanceof ka&&e.value&&"/i18n"===e.value)}(e);if(!i||this._inI18nBlock){if(!this._inI18nNode&&!this._inIcu)if(this._inI18nBlock){if(i){if(this._depth==this._blockStartDepth){this._closeTranslatableSection(e,this._blockChildren),this._inI18nBlock=!1;var s=this._addMessage(this._blockChildren,this._blockMeaningAndDesc);return Oa(this,this._translateMessage(e,s))}return void this._reportError(e,"I18N blocks should not cross element boundaries")}}else n&&(!th&&console&&console.warn&&(th=!0,console.warn("I18n comments are deprecated, use an <ng-container> element instead ("+e.sourceSpan.start+(e.sourceSpan.details?", "+e.sourceSpan.details:"")+")")),this._inI18nBlock=!0,this._blockStartDepth=this._depth,this._blockChildren=[],this._blockMeaningAndDesc=e.value.replace(eh,"").trim(),this._openTranslatableSection(e))}else this._reportError(e,"Trying to close an unopened block")}},e.prototype.visitText=function(e,t){return this._isInTranslatableSection&&this._mayBeAddBlockChildren(e),e},e.prototype.visitElement=function(e,t){var n=this;this._mayBeAddBlockChildren(e),this._depth++;var r=this._inI18nNode,i=this._inImplicitNode,o=[],s=void 0,a=function u(e){return e.attrs.find((function(e){return"i18n"===e.name}))||null}(e),p=a?a.value:"",l=this._implicitTags.some((function(t){return e.name===t}))&&!this._inIcu&&!this._isInTranslatableSection,c=!i&&l;if(this._inImplicitNode=i||l,this._isInTranslatableSection||this._inIcu)(a||c)&&this._reportError(e,"Could not mark an element as translatable inside a translatable section"),this._mode==Zc.Extract&&Oa(this,e.children);else{if(a||c){this._inI18nNode=!0;var h=this._addMessage(e.children,p);s=this._translateMessage(e,h)}if(this._mode==Zc.Extract){var f=a||c;f&&this._openTranslatableSection(e),Oa(this,e.children),f&&this._closeTranslatableSection(e,e.children)}}if(this._mode===Zc.Merge&&(s||e.children).forEach((function(e){var r=e.visit(n,t);r&&!n._isInTranslatableSection&&(o=o.concat(r))})),this._visitAttributesOf(e),this._depth--,this._inI18nNode=r,this._inImplicitNode=i,this._mode===Zc.Merge){var d=this._translateAttributes(e);return new Ia(e.name,d,o,e.sourceSpan,e.startSourceSpan,e.endSourceSpan)}return null},e.prototype.visitAttribute=function(e,t){throw new Error("unreachable code")},e.prototype._init=function(e,t){this._mode=e,this._inI18nBlock=!1,this._inI18nNode=!1,this._depth=0,this._inIcu=!1,this._msgCountAtSectionStart=void 0,this._errors=[],this._messages=[],this._inImplicitNode=!1,this._createI18nMessage=Sl(t)},e.prototype._visitAttributesOf=function(e){var t=this,n={},r=this._implicitAttrs[e.name]||[];e.attrs.filter((function(e){return e.name.startsWith("i18n-")})).forEach((function(e){return n[e.name.slice("i18n-".length)]=e.value})),e.attrs.forEach((function(e){e.name in n?t._addMessage([e],n[e.name]):r.some((function(t){return e.name===t}))&&t._addMessage([e])}))},e.prototype._addMessage=function(e,t){if(0==e.length||1==e.length&&e[0]instanceof Aa&&!e[0].value)return null;var n=ih(t),r=this._createI18nMessage(e,n.meaning,n.description,n.id);return this._messages.push(r),r},e.prototype._translateMessage=function(e,t){if(t&&this._mode===Zc.Merge){var n=this._translations.get(t);if(n)return n;this._reportError(e,'Translation unavailable for message id="'+this._translations.digest(t)+'"')}return[]},e.prototype._translateAttributes=function(e){var t=this,n=e.attrs,r={};n.forEach((function(e){e.name.startsWith("i18n-")&&(r[e.name.slice("i18n-".length)]=ih(e.value))}));var i=[];return n.forEach((function(n){if("i18n"!==n.name&&!n.name.startsWith("i18n-"))if(n.value&&""!=n.value&&r.hasOwnProperty(n.name)){var o=r[n.name],s=o.id,a=t._createI18nMessage([n],o.meaning,o.description,s),u=t._translations.get(a);u?0==u.length?i.push(new Aa(n.name,"",n.sourceSpan,void 0,void 0,void 0)):u[0]instanceof Ma?i.push(new Aa(n.name,u[0].value,n.sourceSpan,void 0,void 0,void 0)):t._reportError(e,'Unexpected translation for attribute "'+n.name+'" (id="'+(s||t._translations.digest(a))+'")'):t._reportError(e,'Translation unavailable for attribute "'+n.name+'" (id="'+(s||t._translations.digest(a))+'")')}else i.push(n)})),i},e.prototype._mayBeAddBlockChildren=function(e){this._inI18nBlock&&!this._inIcu&&this._depth==this._blockStartDepth&&this._blockChildren.push(e)},e.prototype._openTranslatableSection=function(e){this._isInTranslatableSection?this._reportError(e,"Unexpected section start"):this._msgCountAtSectionStart=this._messages.length},Object.defineProperty(e.prototype,"_isInTranslatableSection",{get:function(){return void 0!==this._msgCountAtSectionStart},enumerable:!1,configurable:!0}),e.prototype._closeTranslatableSection=function(e,t){if(this._isInTranslatableSection){var n=this._msgCountAtSectionStart;if(1==t.reduce((function(e,t){return e+(t instanceof ka?0:1)}),0))for(var r=this._messages.length-1;r>=n;r--){var i=this._messages[r].nodes;if(!(1==i.length&&i[0]instanceof Br)){this._messages.splice(r,1);break}}this._msgCountAtSectionStart=void 0}else this._reportError(e,"Unexpected section end")},e.prototype._reportError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}();function ih(e){if(!e)return{meaning:"",description:"",id:""};var t=e.indexOf("@@"),n=e.indexOf("|"),r=o(t>-1?[e.slice(0,t),e.slice(t+2)]:[e,""],2),i=r[0],s=r[1],a=o(n>-1?[i.slice(0,n),i.slice(n+1)]:["",i],2);return{meaning:a[0],description:a[1],id:s.trim()}}
/**
     * @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 oh=new(function(){function t(){this.closedByParent=!1,this.isVoid=!1,this.ignoreFirstLf=!1,this.canSelfClose=!0,this.preventNamespaceInheritance=!1}return t.prototype.requireExtraParent=function(e){return!1},t.prototype.isClosedByChild=function(e){return!1},t.prototype.getContentType=function(){return e.TagContentType.PARSABLE_DATA},t}());function sh(e){return oh}var ah=function(e){function t(){return e.call(this,sh)||this}return r(t,e),t.prototype.parse=function(t,n,r){return e.prototype.parse.call(this,t,n,r)},t}(tu),uh=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.write=function(e,t){var n=new ph,r=[];e.forEach((function(e){var t,i=[];e.sources.forEach((function(e){var t=new Si("context-group",{purpose:"location"});t.children.push(new wi(10),new Si("context",{"context-type":"sourcefile"},[new xi(e.filePath)]),new wi(10),new Si("context",{"context-type":"linenumber"},[new xi(""+e.startLine)]),new wi(8)),i.push(new wi(8),t)}));var o=new Si("trans-unit",{id:e.id,datatype:"html"});(t=o.children).push.apply(t,s([new wi(8),new Si("source",{},n.serialize(e.nodes))],i)),e.description&&o.children.push(new wi(8),new Si("note",{priority:"1",from:"description"},[new xi(e.description)])),e.meaning&&o.children.push(new wi(8),new Si("note",{priority:"1",from:"meaning"},[new xi(e.meaning)])),o.children.push(new wi(6)),r.push(new wi(6),o)}));var i=new Si("body",{},s(r,[new wi(4)])),o=new Si("file",{"source-language":t||"en",datatype:"plaintext",original:"ng2.template"},[new wi(4),i,new wi(2)]),a=new Si("xliff",{version:"1.2",xmlns:"urn:oasis:names:tc:xliff:document:1.2"},[new wi(2),o,new wi]);return gi([new Ei({version:"1.0",encoding:"UTF-8"}),new wi,a,new wi])},t.prototype.load=function(e,t){var n=(new lh).parse(e,t),r=n.locale,i=n.msgIdToHtml,o=n.errors,a={},u=new ch;if(Object.keys(i).forEach((function(e){var n=u.convert(i[e],t),r=n.i18nNodes;o.push.apply(o,s(n.errors)),a[e]=r})),o.length)throw new Error("xliff parse errors:\n"+o.join("\n"));return{locale:r,i18nNodesByMsgId:a}},t.prototype.digest=function(e){return Gr(e)},t}(vi),ph=function(){function e(){}return e.prototype.visitText=function(e,t){return[new xi(e.value)]},e.prototype.visitContainer=function(e,t){var n=this,r=[];return e.children.forEach((function(e){return r.push.apply(r,s(e.visit(n)))})),r},e.prototype.visitIcu=function(e,t){var n=this,r=[new xi("{"+e.expressionPlaceholder+", "+e.type+", ")];return Object.keys(e.cases).forEach((function(t){r.push.apply(r,s([new xi(t+" {")],e.cases[t].visit(n),[new xi("} ")]))})),r.push(new xi("}")),r},e.prototype.visitTagPlaceholder=function(e,t){var n=function r(e){switch(e.toLowerCase()){case"br":return"lb";case"img":return"image";default:return"x-"+e}}(e.tag);if(e.isVoid)return[new Si("x",{id:e.startName,ctype:n,"equiv-text":"<"+e.tag+"/>"})];var i=new Si("x",{id:e.startName,ctype:n,"equiv-text":"<"+e.tag+">"}),o=new Si("x",{id:e.closeName,ctype:n,"equiv-text":"</"+e.tag+">"});return s([i],this.serialize(e.children),[o])},e.prototype.visitPlaceholder=function(e,t){return[new Si("x",{id:e.name,"equiv-text":"{{"+e.value+"}}"})]},e.prototype.visitIcuPlaceholder=function(e,t){var n="{"+e.value.expression+", "+e.value.type+", "+Object.keys(e.value.cases).map((function(e){return e+" {...}"})).join(" ")+"}";return[new Si("x",{id:e.name,"equiv-text":n})]},e.prototype.serialize=function(e){var t=this;return[].concat.apply([],s(e.map((function(e){return e.visit(t)}))))},e}(),lh=function(){function e(){this._locale=null}return e.prototype.parse=function(e,t){this._unitMlString=null,this._msgIdToHtml={};var n=(new ah).parse(e,t);return this._errors=n.errors,Oa(this,n.rootNodes,null),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},e.prototype.visitElement=function(e,t){switch(e.name){case"trans-unit":this._unitMlString=null;var n=e.attrs.find((function(e){return"id"===e.name}));if(n){var r=n.value;this._msgIdToHtml.hasOwnProperty(r)?this._addError(e,"Duplicated translations for msg "+r):(Oa(this,e.children,null),"string"==typeof this._unitMlString?this._msgIdToHtml[r]=this._unitMlString:this._addError(e,"Message "+r+" misses a translation"))}else this._addError(e,'<trans-unit> misses the "id" attribute');break;case"source":case"seg-source":case"alt-trans":break;case"target":var i=e.startSourceSpan.start.file.content.slice(e.startSourceSpan.end.offset,e.endSourceSpan.start.offset);this._unitMlString=i;break;case"file":var o=e.attrs.find((function(e){return"target-language"===e.name}));o&&(this._locale=o.value),Oa(this,e.children,null);break;default:Oa(this,e.children,null)}},e.prototype.visitAttribute=function(e,t){},e.prototype.visitText=function(e,t){},e.prototype.visitComment=function(e,t){},e.prototype.visitExpansion=function(e,t){},e.prototype.visitExpansionCase=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),ch=function(){function e(){}return e.prototype.convert=function(e,t){var n=(new ah).parse(e,t,{tokenizeExpansionForms:!0});return this._errors=n.errors,{i18nNodes:this._errors.length>0||0==n.rootNodes.length?[]:[].concat.apply([],s(Oa(this,n.rootNodes))),errors:this._errors}},e.prototype.visitText=function(e,t){return new Br(e.value,e.sourceSpan)},e.prototype.visitElement=function(e,t){if("x"===e.name){var n=e.attrs.find((function(e){return"id"===e.name}));return n?new Hr("",n.value,e.sourceSpan):(this._addError(e,'<x> misses the "id" attribute'),null)}return"mrk"===e.name?[].concat.apply([],s(Oa(this,e.children))):(this._addError(e,"Unexpected tag"),null)},e.prototype.visitExpansion=function(e,t){var n={};return Oa(this,e.cases).forEach((function(t){n[t.value]=new Vr(t.nodes,e.sourceSpan)})),new jr(e.switchValue,e.type,n,e.sourceSpan)},e.prototype.visitExpansionCase=function(e,t){return{value:e.value,nodes:Oa(this,e.expression)}},e.prototype.visitComment=function(e,t){},e.prototype.visitAttribute=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),hh=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.write=function(e,t){var n=new fh,r=[];e.forEach((function(e){var t=new Si("unit",{id:e.id}),i=new Si("notes");(e.description||e.meaning)&&(e.description&&i.children.push(new wi(8),new Si("note",{category:"description"},[new xi(e.description)])),e.meaning&&i.children.push(new wi(8),new Si("note",{category:"meaning"},[new xi(e.meaning)]))),e.sources.forEach((function(e){i.children.push(new wi(8),new Si("note",{category:"location"},[new xi(e.filePath+":"+e.startLine+(e.endLine!==e.startLine?","+e.endLine:""))]))})),i.children.push(new wi(6)),t.children.push(new wi(6),i);var o=new Si("segment");o.children.push(new wi(8),new Si("source",{},n.serialize(e.nodes)),new wi(6)),t.children.push(new wi(6),o,new wi(4)),r.push(new wi(4),t)}));var i=new Si("file",{original:"ng.template",id:"ngi18n"},s(r,[new wi(2)])),o=new Si("xliff",{version:"2.0",xmlns:"urn:oasis:names:tc:xliff:document:2.0",srcLang:t||"en"},[new wi(2),i,new wi]);return gi([new Ei({version:"1.0",encoding:"UTF-8"}),new wi,o,new wi])},t.prototype.load=function(e,t){var n=(new dh).parse(e,t),r=n.locale,i=n.msgIdToHtml,o=n.errors,a={},u=new vh;if(Object.keys(i).forEach((function(e){var n=u.convert(i[e],t),r=n.i18nNodes;o.push.apply(o,s(n.errors)),a[e]=r})),o.length)throw new Error("xliff2 parse errors:\n"+o.join("\n"));return{locale:r,i18nNodesByMsgId:a}},t.prototype.digest=function(e){return Yr(e)},t}(vi),fh=function(){function e(){}return e.prototype.visitText=function(e,t){return[new xi(e.value)]},e.prototype.visitContainer=function(e,t){var n=this,r=[];return e.children.forEach((function(e){return r.push.apply(r,s(e.visit(n)))})),r},e.prototype.visitIcu=function(e,t){var n=this,r=[new xi("{"+e.expressionPlaceholder+", "+e.type+", ")];return Object.keys(e.cases).forEach((function(t){r.push.apply(r,s([new xi(t+" {")],e.cases[t].visit(n),[new xi("} ")]))})),r.push(new xi("}")),r},e.prototype.visitTagPlaceholder=function(e,t){var n=this,r=function i(e){switch(e.toLowerCase()){case"br":case"b":case"i":case"u":return"fmt";case"img":return"image";case"a":return"link";default:return"other"}}(e.tag);if(e.isVoid)return[new Si("ph",{id:(this._nextPlaceholderId++).toString(),equiv:e.startName,type:r,disp:"<"+e.tag+"/>"})];var o=new Si("pc",{id:(this._nextPlaceholderId++).toString(),equivStart:e.startName,equivEnd:e.closeName,type:r,dispStart:"<"+e.tag+">",dispEnd:"</"+e.tag+">"}),a=[].concat.apply([],s(e.children.map((function(e){return e.visit(n)}))));return a.length?a.forEach((function(e){return o.children.push(e)})):o.children.push(new xi("")),[o]},e.prototype.visitPlaceholder=function(e,t){var n=(this._nextPlaceholderId++).toString();return[new Si("ph",{id:n,equiv:e.name,disp:"{{"+e.value+"}}"})]},e.prototype.visitIcuPlaceholder=function(e,t){var n=Object.keys(e.value.cases).map((function(e){return e+" {...}"})).join(" "),r=(this._nextPlaceholderId++).toString();return[new Si("ph",{id:r,equiv:e.name,disp:"{"+e.value.expression+", "+e.value.type+", "+n+"}"})]},e.prototype.serialize=function(e){var t=this;return this._nextPlaceholderId=0,[].concat.apply([],s(e.map((function(e){return e.visit(t)}))))},e}(),dh=function(){function e(){this._locale=null}return e.prototype.parse=function(e,t){this._unitMlString=null,this._msgIdToHtml={};var n=(new ah).parse(e,t);return this._errors=n.errors,Oa(this,n.rootNodes,null),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},e.prototype.visitElement=function(e,t){switch(e.name){case"unit":this._unitMlString=null;var n=e.attrs.find((function(e){return"id"===e.name}));if(n){var r=n.value;this._msgIdToHtml.hasOwnProperty(r)?this._addError(e,"Duplicated translations for msg "+r):(Oa(this,e.children,null),"string"==typeof this._unitMlString?this._msgIdToHtml[r]=this._unitMlString:this._addError(e,"Message "+r+" misses a translation"))}else this._addError(e,'<unit> misses the "id" attribute');break;case"source":break;case"target":var i=e.startSourceSpan.start.file.content.slice(e.startSourceSpan.end.offset,e.endSourceSpan.start.offset);this._unitMlString=i;break;case"xliff":var o=e.attrs.find((function(e){return"trgLang"===e.name}));o&&(this._locale=o.value);var s=e.attrs.find((function(e){return"version"===e.name}));if(s){var a=s.value;"2.0"!==a?this._addError(e,"The XLIFF file version "+a+" is not compatible with XLIFF 2.0 serializer"):Oa(this,e.children,null)}break;default:Oa(this,e.children,null)}},e.prototype.visitAttribute=function(e,t){},e.prototype.visitText=function(e,t){},e.prototype.visitComment=function(e,t){},e.prototype.visitExpansion=function(e,t){},e.prototype.visitExpansionCase=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),vh=function(){function e(){}return e.prototype.convert=function(e,t){var n=(new ah).parse(e,t,{tokenizeExpansionForms:!0});return this._errors=n.errors,{i18nNodes:this._errors.length>0||0==n.rootNodes.length?[]:[].concat.apply([],s(Oa(this,n.rootNodes))),errors:this._errors}},e.prototype.visitText=function(e,t){return new Br(e.value,e.sourceSpan)},e.prototype.visitElement=function(e,t){var n=this;switch(e.name){case"ph":var r=e.attrs.find((function(e){return"equiv"===e.name}));if(r)return[new Hr("",r.value,e.sourceSpan)];this._addError(e,'<ph> misses the "equiv" attribute');break;case"pc":var i=e.attrs.find((function(e){return"equivStart"===e.name})),o=e.attrs.find((function(e){return"equivEnd"===e.name}));if(i){if(o){var a=o.value,u=[];return u.concat.apply(u,s([new Hr("",i.value,e.sourceSpan)],e.children.map((function(e){return e.visit(n,null)})),[new Hr("",a,e.sourceSpan)]))}this._addError(e,'<ph> misses the "equivEnd" attribute')}else this._addError(e,'<ph> misses the "equivStart" attribute');break;case"mrk":return[].concat.apply([],s(Oa(this,e.children)));default:this._addError(e,"Unexpected tag")}return null},e.prototype.visitExpansion=function(e,t){var n={};return Oa(this,e.cases).forEach((function(t){n[t.value]=new Vr(t.nodes,e.sourceSpan)})),new jr(e.switchValue,e.type,n,e.sourceSpan)},e.prototype.visitExpansionCase=function(e,t){return{value:e.value,nodes:[].concat.apply([],s(Oa(this,e.expression)))}},e.prototype.visitComment=function(e,t){},e.prototype.visitAttribute=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),mh=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.write=function(e,t){throw new Error("Unsupported")},t.prototype.load=function(e,t){var n=(new yh).parse(e,t),r=n.locale,i=n.msgIdToHtml,o=n.errors,s={},a=new gh;if(Object.keys(i).forEach((function(e){!function n(e,t,r){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){var n=r();return Object.defineProperty(e,t,{enumerable:!0,value:n}),n},set:function(e){throw new Error("Could not overwrite an XTB translation")}})}(s,e,(function(){var n=a.convert(i[e],t),r=n.i18nNodes,o=n.errors;if(o.length)throw new Error("xtb parse errors:\n"+o.join("\n"));return r}))})),o.length)throw new Error("xtb parse errors:\n"+o.join("\n"));return{locale:r,i18nNodesByMsgId:s}},t.prototype.digest=function(e){return Pi(e)},t.prototype.createNameMapper=function(e){return new mi(e,Ai)},t}(vi),yh=function(){function e(){this._locale=null}return e.prototype.parse=function(e,t){this._bundleDepth=0,this._msgIdToHtml={};var n=(new ah).parse(e,t);return this._errors=n.errors,Oa(this,n.rootNodes),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},e.prototype.visitElement=function(e,t){switch(e.name){case"translationbundle":this._bundleDepth++,this._bundleDepth>1&&this._addError(e,"<translationbundle> elements can not be nested");var n=e.attrs.find((function(e){return"lang"===e.name}));n&&(this._locale=n.value),Oa(this,e.children,null),this._bundleDepth--;break;case"translation":var r=e.attrs.find((function(e){return"id"===e.name}));if(r){var i=r.value;if(this._msgIdToHtml.hasOwnProperty(i))this._addError(e,"Duplicated translations for msg "+i);else{var o=e.startSourceSpan.start.file.content.slice(e.startSourceSpan.end.offset,e.endSourceSpan.start.offset);this._msgIdToHtml[i]=o}}else this._addError(e,'<translation> misses the "id" attribute');break;default:this._addError(e,"Unexpected tag")}},e.prototype.visitAttribute=function(e,t){},e.prototype.visitText=function(e,t){},e.prototype.visitComment=function(e,t){},e.prototype.visitExpansion=function(e,t){},e.prototype.visitExpansionCase=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),gh=function(){function e(){}return e.prototype.convert=function(e,t){var n=(new ah).parse(e,t,{tokenizeExpansionForms:!0});return this._errors=n.errors,{i18nNodes:this._errors.length>0||0==n.rootNodes.length?[]:Oa(this,n.rootNodes),errors:this._errors}},e.prototype.visitText=function(e,t){return new Br(e.value,e.sourceSpan)},e.prototype.visitExpansion=function(e,t){var n={};return Oa(this,e.cases).forEach((function(t){n[t.value]=new Vr(t.nodes,e.sourceSpan)})),new jr(e.switchValue,e.type,n,e.sourceSpan)},e.prototype.visitExpansionCase=function(e,t){return{value:e.value,nodes:Oa(this,e.expression)}},e.prototype.visitElement=function(e,t){if("ph"===e.name){var n=e.attrs.find((function(e){return"name"===e.name}));if(n)return new Hr("",n.value,e.sourceSpan);this._addError(e,'<ph> misses the "name" attribute')}else this._addError(e,"Unexpected tag");return null},e.prototype.visitComment=function(e,t){},e.prototype.visitAttribute=function(e,t){},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),Eh=function(){function e(e,t,n,r,i,o){void 0===e&&(e={}),void 0===i&&(i=R.Warning),this._i18nNodesByMsgId=e,this.digest=n,this.mapperFactory=r,this._i18nToHtml=new _h(e,t,n,r,i,o)}return e.load=function(t,n,r,i,o){var s=r.load(t,n);return new e(s.i18nNodesByMsgId,s.locale,(function(e){return r.digest(e)}),(function(e){return r.createNameMapper(e)}),i,o)},e.prototype.get=function(e){var t=this._i18nToHtml.convert(e);if(t.errors.length)throw new Error(t.errors.join("\n"));return t.nodes},e.prototype.has=function(e){return this.digest(e)in this._i18nNodesByMsgId},e}(),_h=function(){function e(e,t,n,r,i,o){void 0===e&&(e={}),this._i18nNodesByMsgId=e,this._locale=t,this._digest=n,this._mapperFactory=r,this._missingTranslationStrategy=i,this._console=o,this._contextStack=[],this._errors=[]}return e.prototype.convert=function(e){this._contextStack.length=0,this._errors.length=0;var t=this._convertToText(e),n=e.nodes[0].sourceSpan.start.file.url,r=(new iu).parse(t,n,{tokenizeExpansionForms:!0});return{nodes:r.rootNodes,errors:s(this._errors,r.errors)}},e.prototype.visitText=function(e,t){return bi(e.value)},e.prototype.visitContainer=function(e,t){var n=this;return e.children.map((function(e){return e.visit(n)})).join("")},e.prototype.visitIcu=function(e,t){var n=this,r=Object.keys(e.cases).map((function(t){return t+" {"+e.cases[t].visit(n)+"}"}));return"{"+(this._srcMsg.placeholders.hasOwnProperty(e.expression)?this._srcMsg.placeholders[e.expression].text:e.expression)+", "+e.type+", "+r.join(" ")+"}"},e.prototype.visitPlaceholder=function(e,t){var n=this._mapper(e.name);return this._srcMsg.placeholders.hasOwnProperty(n)?this._srcMsg.placeholders[n].text:this._srcMsg.placeholderToMessage.hasOwnProperty(n)?this._convertToText(this._srcMsg.placeholderToMessage[n]):(this._addError(e,'Unknown placeholder "'+e.name+'"'),"")},e.prototype.visitTagPlaceholder=function(e,t){var n=this,r=""+e.tag,i=Object.keys(e.attrs).map((function(t){return t+'="'+e.attrs[t]+'"'})).join(" ");return e.isVoid?"<"+r+" "+i+"/>":"<"+r+" "+i+">"+e.children.map((function(e){return e.visit(n)})).join("")+"</"+r+">"},e.prototype.visitIcuPlaceholder=function(e,t){return this._convertToText(this._srcMsg.placeholderToMessage[e.name])},e.prototype._convertToText=function(e){var t,n=this,r=this._digest(e),i=this._mapperFactory?this._mapperFactory(e):null;this._contextStack.push({msg:this._srcMsg,mapper:this._mapper}),this._srcMsg=e,this._i18nNodesByMsgId.hasOwnProperty(r)?(t=this._i18nNodesByMsgId[r],this._mapper=function(e){return i?i.toInternalName(e):e}):(this._missingTranslationStrategy===R.Error?this._addError(e.nodes[0],'Missing translation for message "'+r+'"'+(this._locale?' for locale "'+this._locale+'"':"")):this._console&&this._missingTranslationStrategy===R.Warning&&this._console.warn('Missing translation for message "'+r+'"'+(this._locale?' for locale "'+this._locale+'"':"")),t=e.nodes,this._mapper=function(e){return e});var o=t.map((function(e){return e.visit(n)})).join(""),s=this._contextStack.pop();return this._srcMsg=s.msg,this._mapper=s.mapper,o},e.prototype._addError=function(e,t){this._errors.push(new Tl(e.sourceSpan,t))},e}(),Sh=function(){function e(e,t,n,r,i){if(void 0===r&&(r=R.Warning),this._htmlParser=e,t){var o=function s(e){switch(e=(e||"xlf").toLowerCase()){case"xmb":return new Ti;case"xtb":return new mh;case"xliff2":case"xlf2":return new hh;case"xliff":case"xlf":default:return new uh}}
/**
     * @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
     */(n);this._translationBundle=Eh.load(t,"i18n",o,r,i)}else this._translationBundle=new Eh({},null,Gr,void 0,r,i)}return e.prototype.parse=function(e,t,n){void 0===n&&(n={});var r=n.interpolationConfig||yo,i=this._htmlParser.parse(e,t,Object.assign({interpolationConfig:r},n));return i.errors.length?new eu(i.rootNodes,i.errors):function o(e,t,n,r,i){return new rh(r,i).merge(e,t,n)}(i.rootNodes,this._translationBundle,r,[],{})},e}();function xh(e,t,n){return void 0===n&&(n=null),un(t,new wh(e),n)}var wh=function(){function e(e){this.ctx=e}return e.prototype.visitArray=function(e,t){for(var n=[],r=0;r<e.length;++r)n.push(un(e[r],this,null));return Ft(n,t)},e.prototype.visitStringMap=function(e,t){var n=this,r=[],i=new Set(e&&e.$quoted$);return Object.keys(e).forEach((function(t){r.push(new nt(t,un(e[t],n,null),i.has(t)))})),new rt(r,t)},e.prototype.visitPrimitive=function(e,t){return Ut(e,t)},e.prototype.visitOther=function(e,t){return e instanceof Ee?e:this.ctx.importExpr(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
     */function Ch(e,t){return{key:e,value:t,quoted:!1}}var bh=function(){function t(e,t){this.reflector=e,this.alwaysGenerateDef=t,this.tokenInjector=e.resolveExternalReference(Jt.Injector)}return t.prototype.depsArray=function(e,t){var n=this;return e.map((function(e){var r,i,o=e,s=0;if(Array.isArray(e))for(var a=0;a<e.length;a++){var u=e[a];u&&("Optional"===u.ngMetadataName?s|=8:"SkipSelf"===u.ngMetadataName?s|=4:"Self"===u.ngMetadataName?s|=2:o="Inject"===u.ngMetadataName?u.token:u)}return r="string"==typeof o?Ut(o):o===n.tokenInjector?kt(Jt.INJECTOR):t.importExpr(o),i=0!==s?[r,Ut(s)]:[r],kt(Jt.inject).callFn(i)}))},t.prototype.factoryFor=function(e,t){var n;if(e.useExisting)n=kt(Jt.inject).callFn([t.importExpr(e.useExisting)]);else if(e.useFactory){var r=e.deps||[];if(!(r.length>0))return t.importExpr(e.useFactory);n=t.importExpr(e.useFactory).callFn(this.depsArray(r,t))}else if(e.useValue)n=xh(t,e.useValue);else{var i=e.useClass||e.symbol,o=this.depsArray(this.reflector.parameters(i),t);n=new Ie(t.importExpr(i),o)}return Bt([],[new ft(n)],void 0,void 0,e.symbol.name+"_Factory")},t.prototype.injectableDef=function(e,t){var n=ot;void 0!==e.providedIn&&(n=null===e.providedIn?ot:"string"==typeof e.providedIn?Ut(e.providedIn):t.importExpr(e.providedIn));var r=[Ch("factory",this.factoryFor(e,t)),Ch("token",t.importExpr(e.type.reference)),Ch("providedIn",n)];return kt(Jt.ɵɵdefineInjectable).callFn([Lt(r)])},t.prototype.compile=function(t,n){if(this.alwaysGenerateDef||void 0!==t.providedIn){var r=On(t.type),i=new gt(r,null,[new vt("ɵprov",le,[e.StmtModifier.Static],this.injectableDef(t,n))],[],new mt(null,[],[]),[]);n.statements.push(i)}},t}(),Th=/(\.ts|\.d\.ts|\.js|\.jsx|\.tsx)$/,Mh=/\.ngfactory\.|\.ngsummary\./,Ph=/\.ngsummary\./,Nh=/NgSummary$/;
/**
     * @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 Ah(e,t){void 0===t&&(t=!1);var n=kh(e,t);return n[0]+".ngfactory"+Oh(n[1])}function Ih(e){return e.replace(Mh,".")}function kh(e,t){if(void 0===t&&(t=!1),e.endsWith(".d.ts"))return[e.slice(0,-5),t?".ts":".d.ts"];var n=e.lastIndexOf(".");return-1!==n?[e.substring(0,n),e.substring(n)]:[e,""]}function Oh(e){return".tsx"===e?".ts":e}function Rh(e){return e.replace(Th,"")+".ngsummary.json"}function Dh(e,t){void 0===t&&(t=!1);var n=kh(Ih(e),t);return n[0]+".ngsummary"+n[1]}function Fh(e){return e+"NgSummary"}var Lh,Bh=/\u0275\d+/;function Vh(e){return Bh.test(e)}!function(e){e[e.OnInit=0]="OnInit",e[e.OnDestroy=1]="OnDestroy",e[e.DoCheck=2]="DoCheck",e[e.OnChanges=3]="OnChanges",e[e.AfterContentInit=4]="AfterContentInit",e[e.AfterContentChecked=5]="AfterContentChecked",e[e.AfterViewInit=6]="AfterViewInit",e[e.AfterViewChecked=7]="AfterViewChecked"}(Lh||(Lh={}));var jh=[Lh.OnInit,Lh.OnDestroy,Lh.DoCheck,Lh.OnChanges,Lh.AfterContentInit,Lh.AfterContentChecked,Lh.AfterViewInit,Lh.AfterViewChecked],Uh=function(){function t(e,t,n,r,i,o,s,a,u,p,l,c){this._config=e,this._htmlParser=t,this._ngModuleResolver=n,this._directiveResolver=r,this._pipeResolver=i,this._summaryResolver=o,this._schemaRegistry=s,this._directiveNormalizer=a,this._console=u,this._staticSymbolCache=p,this._reflector=l,this._errorCollector=c,this._nonNormalizedDirectiveCache=new Map,this._directiveCache=new Map,this._summaryCache=new Map,this._pipeCache=new Map,this._ngModuleCache=new Map,this._ngModuleOfTypes=new Map,this._shallowModuleCache=new Map}return t.prototype.getReflector=function(){return this._reflector},t.prototype.clearCacheFor=function(e){var t=this._directiveCache.get(e);this._directiveCache.delete(e),this._nonNormalizedDirectiveCache.delete(e),this._summaryCache.delete(e),this._pipeCache.delete(e),this._ngModuleOfTypes.delete(e),this._ngModuleCache.clear(),t&&this._directiveNormalizer.clearCacheFor(t)},t.prototype.clearCache=function(){this._directiveCache.clear(),this._nonNormalizedDirectiveCache.clear(),this._summaryCache.clear(),this._pipeCache.clear(),this._ngModuleCache.clear(),this._ngModuleOfTypes.clear(),this._directiveNormalizer.clearCache()},t.prototype._createProxyClass=function(e,t){var n=null,r=function(){if(!n)throw new Error("Illegal state: Class "+t+" for type "+Sn(e)+" is not compiled yet!");return n.apply(this,arguments)};return r.setDelegate=function(e){n=e,r.prototype=e.prototype},r.overriddenName=t,r},t.prototype.getGeneratedClass=function(e,t){return e instanceof nn?this._staticSymbolCache.get(Ah(e.filePath),t):this._createProxyClass(e,t)},t.prototype.getComponentViewClass=function(e){return this.getGeneratedClass(e,Dn(e,0))},t.prototype.getHostComponentViewClass=function(e){return this.getGeneratedClass(e,Ln(e))},t.prototype.getHostComponentType=function(e){var t=On({reference:e})+"_Host";return e instanceof nn?this._staticSymbolCache.get(e.filePath,t):this._createProxyClass(e,t)},t.prototype.getRendererType=function(e){return e instanceof nn?this._staticSymbolCache.get(Ah(e.filePath),Fn(e)):{}},t.prototype.getComponentFactory=function(e,t,n,r){if(t instanceof nn)return this._staticSymbolCache.get(Ah(t.filePath),Bn(t));var i=this.getHostComponentViewClass(t);return this._reflector.resolveExternalReference(Jt.createComponentFactory)(e,t,i,n,r,[])},t.prototype.initComponentFactory=function(e,t){var n;e instanceof nn||(n=e.ngContentSelectors).push.apply(n,s(t))},t.prototype._loadSummary=function(e,t){var n=this._summaryCache.get(e);if(!n){var r=this._summaryResolver.resolveSummary(e);this._summaryCache.set(e,(n=r?r.type:null)||null)}return n&&n.summaryKind===t?n:null},t.prototype.getHostComponentMetadata=function(e,t){var n=this.getHostComponentType(e.type.reference);t||(t=this.getHostComponentViewClass(n));var r=S.parse(e.selector)[0].getMatchingElementTemplate(),i=this._htmlParser.parse(r,"");return qn.create({isHost:!0,type:{reference:n,diDeps:[],lifecycleHooks:[]},template:new Hn({encapsulation:g.None,template:r,templateUrl:"",htmlAst:i,styles:[],styleUrls:[],ngContentSelectors:[],animations:[],isInline:!0,externalStylesheets:[],interpolation:null,preserveWhitespaces:!1}),exportAs:null,changeDetection:E.Default,inputs:[],outputs:[],host:{},isComponent:!0,selector:"*",providers:[],viewProviders:[],queries:[],guards:{},viewQueries:[],componentViewType:t,rendererType:{id:"__Host__",encapsulation:g.None,styles:[],data:{}},entryComponents:[],componentFactory:null})},t.prototype.loadDirectiveMetadata=function(e,t,n){var r=this;if(this._directiveCache.has(t))return null;t=xn(t);var i=this.getNonNormalizedDirectiveMetadata(t),o=i.metadata,s=function(e){var n=new qn({isHost:!1,type:o.type,isComponent:o.isComponent,selector:o.selector,exportAs:o.exportAs,changeDetection:o.changeDetection,inputs:o.inputs,outputs:o.outputs,hostListeners:o.hostListeners,hostProperties:o.hostProperties,hostAttributes:o.hostAttributes,providers:o.providers,viewProviders:o.viewProviders,queries:o.queries,guards:o.guards,viewQueries:o.viewQueries,entryComponents:o.entryComponents,componentViewType:o.componentViewType,rendererType:o.rendererType,componentFactory:o.componentFactory,template:e});return e&&r.initComponentFactory(o.componentFactory,e.ngContentSelectors),r._directiveCache.set(t,n),r._summaryCache.set(t,n.toSummary()),null};if(o.isComponent){var a=o.template,u=this._directiveNormalizer.normalizeTemplate({ngModuleType:e,componentType:t,moduleUrl:this._reflector.componentModuleUrl(t,i.annotation),encapsulation:a.encapsulation,template:a.template,templateUrl:a.templateUrl,styles:a.styles,styleUrls:a.styleUrls,animations:a.animations,interpolation:a.interpolation,preserveWhitespaces:a.preserveWhitespaces});return wn(u)&&n?(this._reportError(function p(e){var t=Error("Can't compile synchronously as "+Sn(e)+" is still being loaded!");return t.ngComponentType=e,t}
/**
     * @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
     */(t),t),null):fn(u,s)}return s(null),null},t.prototype.getNonNormalizedDirectiveMetadata=function(e){var t=this;if(!(e=xn(e)))return null;var n=this._nonNormalizedDirectiveCache.get(e);if(n)return n;var r=this._directiveResolver.resolve(e,!1);if(!r)return null;var i=void 0;if(D.isTypeOf(r)){co("styles",(s=r).styles),co("styleUrls",s.styleUrls),fo("interpolation",s.interpolation);var o=s.animations;i=new Hn({encapsulation:ln(s.encapsulation),template:ln(s.template),templateUrl:ln(s.templateUrl),htmlAst:null,styles:s.styles||[],styleUrls:s.styleUrls||[],animations:o||[],interpolation:ln(s.interpolation),isInline:!!s.template,externalStylesheets:[],ngContentSelectors:[],preserveWhitespaces:ln(r.preserveWhitespaces)})}var s,a=null,u=[],p=[],l=r.selector;D.isTypeOf(r)?(a=(s=r).changeDetection,s.viewProviders&&(u=this._getProvidersMetadata(s.viewProviders,p,'viewProviders for "'+zh(e)+'"',[],e)),s.entryComponents&&(p=Hh(s.entryComponents).map((function(e){return t._getEntryComponentMetadata(e)})).concat(p)),l||(l=this._schemaRegistry.getDefaultComponentElementName())):l||(l=null);var c=[];null!=r.providers&&(c=this._getProvidersMetadata(r.providers,p,'providers for "'+zh(e)+'"',[],e));var h=[],f=[];null!=r.queries&&(h=this._getQueriesMetadata(r.queries,!1,e),f=this._getQueriesMetadata(r.queries,!0,e));var d=qn.create({isHost:!1,selector:l,exportAs:ln(r.exportAs),isComponent:!!i,type:this._getTypeMetadata(e),template:i,changeDetection:a,inputs:r.inputs||[],outputs:r.outputs||[],host:r.host||{},providers:c||[],viewProviders:u||[],queries:h||[],guards:r.guards||{},viewQueries:f||[],entryComponents:p,componentViewType:i?this.getComponentViewClass(e):null,rendererType:i?this.getRendererType(e):null,componentFactory:null});return i&&(d.componentFactory=this.getComponentFactory(l,e,d.inputs,d.outputs)),this._nonNormalizedDirectiveCache.set(e,n={metadata:d,annotation:r}),n},t.prototype.getDirectiveMetadata=function(e){var t=this._directiveCache.get(e);return t||this._reportError(mn("Illegal state: getDirectiveMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Directive "+zh(e)+"."),e),t},t.prototype.getDirectiveSummary=function(t){var n=this._loadSummary(t,e.CompileSummaryKind.Directive);return n||this._reportError(mn("Illegal state: Could not load the summary for directive "+zh(t)+"."),t),n},t.prototype.isDirective=function(t){return!!this._loadSummary(t,e.CompileSummaryKind.Directive)||this._directiveResolver.isDirective(t)},t.prototype.isAbstractDirective=function(t){var n=this._loadSummary(t,e.CompileSummaryKind.Directive);if(n&&!n.isComponent)return!n.selector;var r=this._directiveResolver.resolve(t,!1);return!(!r||D.isTypeOf(r)||r.selector)},t.prototype.isPipe=function(t){return!!this._loadSummary(t,e.CompileSummaryKind.Pipe)||this._pipeResolver.isPipe(t)},t.prototype.isNgModule=function(t){return!!this._loadSummary(t,e.CompileSummaryKind.NgModule)||this._ngModuleResolver.isNgModule(t)},t.prototype.getNgModuleSummary=function(t,n){void 0===n&&(n=null);var r=this._loadSummary(t,e.CompileSummaryKind.NgModule);if(!r){var i=this.getNgModuleMetadata(t,!1,n);(r=i?i.toSummary():null)&&this._summaryCache.set(t,r)}return r},t.prototype.loadNgModuleDirectiveAndPipeMetadata=function(e,t,n){var r=this;void 0===n&&(n=!0);var i=this.getNgModuleMetadata(e,n),o=[];return i&&(i.declaredDirectives.forEach((function(n){var i=r.loadDirectiveMetadata(e,n.reference,t);i&&o.push(i)})),i.declaredPipes.forEach((function(e){return r._loadPipeMetadata(e.reference)}))),Promise.all(o)},t.prototype.getShallowModuleMetadata=function(e){var t=this._shallowModuleCache.get(e);if(t)return t;var n=Jc(this._reflector.shallowAnnotations(e),U.isTypeOf);return t={type:this._getTypeMetadata(e),rawExports:n.exports,rawImports:n.imports,rawProviders:n.providers},this._shallowModuleCache.set(e,t),t},t.prototype.getNgModuleMetadata=function(e,t,n){var r=this;void 0===t&&(t=!0),void 0===n&&(n=null),e=xn(e);var i=this._ngModuleCache.get(e);if(i)return i;var o=this._ngModuleResolver.resolve(e,t);if(!o)return null;var a=[],u=[],p=[],l=[],c=[],h=[],f=[],d=[],v=[];o.imports&&Hh(o.imports).forEach((function(t){var i=void 0;if(qh(t)?i=t:t&&t.ngModule&&(i=t.ngModule,t.providers&&h.push.apply(h,s(r._getProvidersMetadata(t.providers,f,"provider for the NgModule '"+zh(i)+"'",[],t)))),i){if(!r._checkSelfImport(e,i))if(n||(n=new Set),n.has(i))r._reportError(mn(r._getTypeDescriptor(i)+" '"+zh(t)+"' is imported recursively by the module '"+zh(e)+"'."),e);else{n.add(i);var o=r.getNgModuleSummary(i,n);if(n.delete(i),!o){var a=mn("Unexpected "+r._getTypeDescriptor(t)+" '"+zh(t)+"' imported by the module '"+zh(e)+"'. Please add a @NgModule annotation.");return t instanceof nn&&(a.ngMissingNgModuleMetadataErrorData={fileName:t.filePath,className:t.name}),void r._reportError(a,e)}l.push(o)}}else r._reportError(mn("Unexpected value '"+zh(t)+"' imported by the module '"+zh(e)+"'"),e)})),o.exports&&Hh(o.exports).forEach((function(t){if(qh(t))if(n||(n=new Set),n.has(t))r._reportError(mn(r._getTypeDescriptor(t)+" '"+Sn(t)+"' is exported recursively by the module '"+zh(e)+"'"),e);else{n.add(t);var i=r.getNgModuleSummary(t,n);n.delete(t),i?c.push(i):u.push(r._getIdentifierMetadata(t))}else r._reportError(mn("Unexpected value '"+zh(t)+"' exported by the module '"+zh(e)+"'"),e)}));var m=this._getTransitiveNgModuleMetadata(l,c);o.declarations&&Hh(o.declarations).forEach((function(t){if(qh(t)){var n=r._getIdentifierMetadata(t);if(r.isDirective(t))r.isAbstractDirective(t)&&r._reportError(mn("Directive "+zh(t)+" has no selector, please add it!"),t),m.addDirective(n),a.push(n),r._addTypeToModule(t,e);else{if(!r.isPipe(t))return void r._reportError(mn("Unexpected "+r._getTypeDescriptor(t)+" '"+zh(t)+"' declared by the module '"+zh(e)+"'. Please add a @Pipe/@Directive/@Component annotation."),e);m.addPipe(n),m.pipes.push(n),p.push(n),r._addTypeToModule(t,e)}}else r._reportError(mn("Unexpected value '"+zh(t)+"' declared by the module '"+zh(e)+"'"),e)}));var y=[],g=[];return u.forEach((function(t){if(m.directivesSet.has(t.reference))y.push(t),m.addExportedDirective(t);else{if(!m.pipesSet.has(t.reference))return void r._reportError(mn("Can't export "+r._getTypeDescriptor(t.reference)+" "+zh(t.reference)+" from "+zh(e)+" as it was neither declared nor imported!"),e);g.push(t),m.addExportedPipe(t)}})),o.providers&&h.push.apply(h,s(this._getProvidersMetadata(o.providers,f,"provider for the NgModule '"+zh(e)+"'",[],e))),o.entryComponents&&f.push.apply(f,s(Hh(o.entryComponents).map((function(e){return r._getEntryComponentMetadata(e)})))),o.bootstrap&&Hh(o.bootstrap).forEach((function(t){qh(t)?d.push(r._getIdentifierMetadata(t)):r._reportError(mn("Unexpected value '"+zh(t)+"' used in the bootstrap property of module '"+zh(e)+"'"),e)})),f.push.apply(f,s(d.map((function(e){return r._getEntryComponentMetadata(e.reference)})))),o.schemas&&v.push.apply(v,s(Hh(o.schemas))),i=new Kn({type:this._getTypeMetadata(e),providers:h,entryComponents:f,bootstrapComponents:d,schemas:v,declaredDirectives:a,exportedDirectives:y,declaredPipes:p,exportedPipes:g,importedModules:l,exportedModules:c,transitiveModule:m,id:o.id||null}),f.forEach((function(e){return m.addEntryComponent(e)})),h.forEach((function(e){return m.addProvider(e,i.type)})),m.addModule(i.type),this._ngModuleCache.set(e,i),i},t.prototype._checkSelfImport=function(e,t){return e===t&&(this._reportError(mn("'"+zh(e)+"' module can't import itself"),e),!0)},t.prototype._getTypeDescriptor=function(e){if(qh(e)){if(this.isDirective(e))return"directive";if(this.isPipe(e))return"pipe";if(this.isNgModule(e))return"module"}return e.provide?"provider":"value"},t.prototype._addTypeToModule=function(e,t){var n=this._ngModuleOfTypes.get(e);n&&n!==t?this._reportError(mn("Type "+zh(e)+" is part of the declarations of 2 modules: "+zh(n)+" and "+zh(t)+"! Please consider moving "+zh(e)+" to a higher module that imports "+zh(n)+" and "+zh(t)+". You can also create a new NgModule that exports and includes "+zh(e)+" then import that NgModule in "+zh(n)+" and "+zh(t)+"."),t):this._ngModuleOfTypes.set(e,t)},t.prototype._getTransitiveNgModuleMetadata=function(e,t){var n=new Qn,r=new Map;return e.concat(t).forEach((function(e){e.modules.forEach((function(e){return n.addModule(e)})),e.entryComponents.forEach((function(e){return n.addEntryComponent(e)}));var t=new Set;e.providers.forEach((function(e){var i=jn(e.provider.token),o=r.get(i);o||(o=new Set,r.set(i,o));var s=e.module.reference;!t.has(i)&&o.has(s)||(o.add(s),t.add(i),n.addProvider(e.provider,e.module))}))})),t.forEach((function(e){e.exportedDirectives.forEach((function(e){return n.addExportedDirective(e)})),e.exportedPipes.forEach((function(e){return n.addExportedPipe(e)}))})),e.forEach((function(e){e.exportedDirectives.forEach((function(e){return n.addDirective(e)})),e.exportedPipes.forEach((function(e){return n.addPipe(e)}))})),n},t.prototype._getIdentifierMetadata=function(e){return{reference:e=xn(e)}},t.prototype.isInjectable=function(e){return this._reflector.tryAnnotations(e).some((function(e){return H.isTypeOf(e)}))},t.prototype.getInjectableSummary=function(t){return{summaryKind:e.CompileSummaryKind.Injectable,type:this._getTypeMetadata(t,null,!1)}},t.prototype.getInjectableMetadata=function(t,n,r){void 0===n&&(n=null),void 0===r&&(r=!0);var i=this._loadSummary(t,e.CompileSummaryKind.Injectable),o=i?i.type:this._getTypeMetadata(t,n,r),s=this._reflector.annotations(t).filter((function(e){return H.isTypeOf(e)}));if(0===s.length)return null;var a=s[s.length-1];return{symbol:t,type:o,providedIn:a.providedIn,useValue:a.useValue,useClass:a.useClass,useExisting:a.useExisting,useFactory:a.useFactory,deps:a.deps}},t.prototype._getTypeMetadata=function(e,t,n){void 0===t&&(t=null),void 0===n&&(n=!0);var r,i,o=this._getIdentifierMetadata(e);return{reference:o.reference,diDeps:this._getDependenciesMetadata(o.reference,t,n),lifecycleHooks:(r=this._reflector,i=o.reference,jh.filter((function(e){return function t(e,n,r){return e.hasLifecycleHook(r,function i(e){switch(e){case Lh.OnInit:return"ngOnInit";case Lh.OnDestroy:return"ngOnDestroy";case Lh.DoCheck:return"ngDoCheck";case Lh.OnChanges:return"ngOnChanges";case Lh.AfterContentInit:return"ngAfterContentInit";case Lh.AfterContentChecked:return"ngAfterContentChecked";case Lh.AfterViewInit:return"ngAfterViewInit";case Lh.AfterViewChecked:return"ngAfterViewChecked";default:throw new Error("unexpected "+e)}}(n))}(r,e,i)})))}},t.prototype._getFactoryMetadata=function(e,t){return void 0===t&&(t=null),{reference:e=xn(e),diDeps:this._getDependenciesMetadata(e,t)}},t.prototype.getPipeMetadata=function(e){var t=this._pipeCache.get(e);return t||this._reportError(mn("Illegal state: getPipeMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Pipe "+zh(e)+"."),e),t||null},t.prototype.getPipeSummary=function(t){var n=this._loadSummary(t,e.CompileSummaryKind.Pipe);return n||this._reportError(mn("Illegal state: Could not load the summary for pipe "+zh(t)+"."),t),n},t.prototype.getOrLoadPipeMetadata=function(e){var t=this._pipeCache.get(e);return t||(t=this._loadPipeMetadata(e)),t},t.prototype._loadPipeMetadata=function(e){e=xn(e);var t=this._pipeResolver.resolve(e),n=new Wn({type:this._getTypeMetadata(e),name:t.name,pure:!!t.pure});return this._pipeCache.set(e,n),this._summaryCache.set(e,n.toSummary()),n},t.prototype._getDependenciesMetadata=function(e,t,n){var r=this;void 0===n&&(n=!0);var i=!1,o=(t||this._reflector.parameters(e)||[]).map((function(e){var t=!1,n=!1,o=!1,s=!1,a=!1,u=null;return Array.isArray(e)?e.forEach((function(e){X.isTypeOf(e)?n=!0:K.isTypeOf(e)?o=!0:Q.isTypeOf(e)?s=!0:z.isTypeOf(e)?a=!0:M.isTypeOf(e)?(t=!0,u=e.attributeName):b.isTypeOf(e)?u=e.token:(T.isTypeOf(e)||e instanceof nn||qh(e)&&null==u)&&(u=e)})):u=e,null==u?(i=!0,{}):{isAttribute:t,isHost:n,isSelf:o,isSkipSelf:s,isOptional:a,token:r._getTokenMetadata(u)}}));if(i){var s=o.map((function(e){return e.token?zh(e.token):"?"})).join(", "),a="Can't resolve all parameters for "+zh(e)+": ("+s+").";(n||this._config.strictInjectionParameters)&&this._reportError(mn(a),e)}return o},t.prototype._getTokenMetadata=function(e){return"string"==typeof(e=xn(e))?{value:e}:{identifier:{reference:e}}},t.prototype._getProvidersMetadata=function(e,t,n,r,i){var o=this;return void 0===r&&(r=[]),e.forEach((function(a,u){if(Array.isArray(a))o._getProvidersMetadata(a,t,n,r);else{var p=void 0;if((a=xn(a))&&"object"==typeof a&&a.hasOwnProperty("provide"))o._validateProvider(a),p=new Gn(a.provide,a);else{if(!qh(a)){if(void 0===a)return void o._reportError(mn("Encountered undefined provider! Usually this means you have a circular dependencies. This might be caused by using 'barrel' index.ts files."));var l=e.reduce((function(e,t,n){return n<u?e.push(""+zh(t)):n==u?e.push("?"+zh(t)+"?"):n==u+1&&e.push("..."),e}),[]).join(", ");return void o._reportError(mn("Invalid "+(n||"provider")+" - only instances of Provider and Type are allowed, got: ["+l+"]"),i)}p=new Gn(a,{useClass:a})}p.token===o._reflector.resolveExternalReference(Jt.ANALYZE_FOR_ENTRY_COMPONENTS)?t.push.apply(t,s(o._getEntryComponentsFromProvider(p,i))):r.push(o.getProviderMetadata(p))}})),r},t.prototype._validateProvider=function(e){e.hasOwnProperty("useClass")&&null==e.useClass&&this._reportError(mn("Invalid provider for "+zh(e.provide)+". useClass cannot be "+e.useClass+".\n           Usually it happens when:\n           1. There's a circular dependency (might be caused by using index.ts (barrel) files).\n           2. Class was used before it was declared. Use forwardRef in this case."))},t.prototype._getEntryComponentsFromProvider=function(e,t){var n=this,r=[],i=[];return e.useFactory||e.useExisting||e.useClass?(this._reportError(mn("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!"),t),[]):e.multi?(function o(e,t){un(e,new Wh,t)}(e.useValue,i),i.forEach((function(e){var t=n._getEntryComponentMetadata(e.reference,!1);t&&r.push(t)})),r):(this._reportError(mn("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!"),t),[])},t.prototype._getEntryComponentMetadata=function(t,n){void 0===n&&(n=!0);var r=this.getNonNormalizedDirectiveMetadata(t);if(r&&r.metadata.isComponent)return{componentType:t,componentFactory:r.metadata.componentFactory};var i=this._loadSummary(t,e.CompileSummaryKind.Directive);if(i&&i.isComponent)return{componentType:t,componentFactory:i.componentFactory};if(n)throw mn(t.name+" cannot be used as an entry component.");return null},t.prototype._getInjectableTypeMetadata=function(t,n){void 0===n&&(n=null);var r=this._loadSummary(t,e.CompileSummaryKind.Injectable);return r?r.type:this._getTypeMetadata(t,n)},t.prototype.getProviderMetadata=function(e){var t=void 0,n=null,r=null,i=this._getTokenMetadata(e.token);return e.useClass?(t=(n=this._getInjectableTypeMetadata(e.useClass,e.dependencies)).diDeps,e.token===e.useClass&&(i={identifier:n})):e.useFactory&&(t=(r=this._getFactoryMetadata(e.useFactory,e.dependencies)).diDeps),{token:i,useClass:n,useValue:e.useValue,useFactory:r,useExisting:e.useExisting?this._getTokenMetadata(e.useExisting):void 0,deps:t,multi:e.multi}},t.prototype._getQueriesMetadata=function(e,t,n){var r=this,i=[];return Object.keys(e).forEach((function(o){var s=e[o];s.isViewQuery===t&&i.push(r._getQueryMetadata(s,o,n))})),i},t.prototype._queryVarBindings=function(e){return e.split(/\s*,\s*/)},t.prototype._getQueryMetadata=function(e,t,n){var r,i=this;return"string"==typeof e.selector?r=this._queryVarBindings(e.selector).map((function(e){return i._getTokenMetadata(e)})):e.selector?r=[this._getTokenMetadata(e.selector)]:(this._reportError(mn("Can't construct a query for the property \""+t+'" of "'+zh(n)+"\" since the query selector wasn't defined."),n),r=[]),{selectors:r,first:e.first,descendants:e.descendants,emitDistinctChangesOnly:e.emitDistinctChangesOnly,propertyName:t,read:e.read?this._getTokenMetadata(e.read):null,static:e.static}},t.prototype._reportError=function(e,t,n){if(!this._errorCollector)throw e;this._errorCollector(e,t),n&&this._errorCollector(e,n)},t}();function Hh(e){return function t(e){return e?Array.from(new Set(e)):[]}(function e(t,n){if(void 0===n&&(n=[]),t)for(var r=0;r<t.length;r++){var i=xn(t[r]);Array.isArray(i)?e(i,n):n.push(i)}return n}(e))}function qh(e){return e instanceof nn||e instanceof G}var Wh=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.visitOther=function(e,t){t.push({reference:e})},t}(cn);function zh(e){return e instanceof nn?e.name+" in "+e.filePath:Sn(e)}function Kh(t,n){var r=0;n.eager||(r|=4096),n.providerType===e.ProviderAstType.PrivateService&&(r|=8192),n.isModule&&(r|=1073741824),n.lifecycleHooks.forEach((function(t){t!==Lh.OnDestroy&&n.providerType!==e.ProviderAstType.Directive&&n.providerType!==e.ProviderAstType.Component||(r|=$h(t))}));var i=n.multiProvider?function o(e,t,n){var r=[],i=[],o=n.map((function(t,n){var r;if(t.useClass){var i=s(n,t.deps||t.useClass.diDeps);r=e.importExpr(t.useClass.reference).instantiate(i)}else t.useFactory?(i=s(n,t.deps||t.useFactory.diDeps),r=e.importExpr(t.useFactory.reference).callFn(i)):r=t.useExisting?(i=s(n,[{token:t.useExisting}]))[0]:xh(e,t.useValue);return r}));return{providerExpr:Bt(i,[new ft(Ft(o))],le),flags:1024|t,depsExpr:Ft(r)};function s(t,n){return n.map((function(n,o){var s="p"+t+"_"+o;return i.push(new Ge(s,pe)),r.push(Gh(e,n)),It(s)}))}}(t,r,n.providers):Qh(t,r,n.providerType,n.providers[0]);return{providerExpr:i.providerExpr,flags:i.flags,depsExpr:i.depsExpr,tokenExpr:Xh(t,n.token)}}function Qh(t,n,r,i){var o,s;return r===e.ProviderAstType.Directive||r===e.ProviderAstType.Component?(o=t.importExpr(i.useClass.reference),n|=16384,s=i.deps||i.useClass.diDeps):i.useClass?(o=t.importExpr(i.useClass.reference),n|=512,s=i.deps||i.useClass.diDeps):i.useFactory?(o=t.importExpr(i.useFactory.reference),n|=1024,s=i.deps||i.useFactory.diDeps):i.useExisting?(o=ot,n|=2048,s=[{token:i.useExisting}]):(o=xh(t,i.useValue),n|=256,s=[]),{providerExpr:o,flags:n,depsExpr:Ft(s.map((function(e){return Gh(t,e)})))}}function Xh(e,t){return t.identifier?e.importExpr(t.identifier.reference):Ut(t.value)}function Gh(e,t){var n=t.isValue?xh(e,t.value):Xh(e,t.token),r=0;return t.isSkipSelf&&(r|=1),t.isOptional&&(r|=2),t.isSelf&&(r|=4),t.isValue&&(r|=8),0===r?n:Ft([Ut(r),n])}function $h(e){var t=0;switch(e){case Lh.AfterContentChecked:t=2097152;break;case Lh.AfterContentInit:t=1048576;break;case Lh.AfterViewChecked:t=8388608;break;case Lh.AfterViewInit:t=4194304;break;case Lh.DoCheck:t=262144;break;case Lh.OnChanges:t=524288;break;case Lh.OnDestroy:t=131072;break;case Lh.OnInit:t=65536}return t}function Yh(t,n,r,i){var o=i.map((function(e){return n.importExpr(e.componentFactory)})),s=tn(t,Jt.ComponentFactoryResolver),a={diDeps:[{isValue:!0,value:Ft(o)},{token:s,isSkipSelf:!0,isOptional:!0},{token:tn(t,Jt.NgModuleRef)}],lifecycleHooks:[],reference:t.resolveExternalReference(Jt.CodegenComponentFactoryResolver)},u=Qh(n,r,e.ProviderAstType.PrivateService,{token:s,multi:!1,useClass:a});return{providerExpr:u.providerExpr,flags:u.flags,depsExpr:u.depsExpr,tokenExpr:Xh(n,s)}}
/**
     * @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 Jh=function Jh(e){this.ngModuleFactoryVar=e},Zh=It("_l"),ef=function(){function t(e){this.reflector=e}return t.prototype.compile=function(e,t,n){var r=Ro("NgModule",t.type),i=t.transitiveModule.entryComponents,o=t.bootstrapComponents,s=new Lu(this.reflector,t,n,r),a=[Yh(this.reflector,e,0,i)].concat(s.parse().map((function(t){return Kh(e,t)}))).map((function(e){var t=e.providerExpr,n=e.depsExpr,r=e.flags,i=e.tokenExpr;return kt(Jt.moduleProviderDef).callFn([Ut(r),i,t,n])})),u=kt(Jt.moduleDef).callFn([Ft(a)]),p=Bt([new Ge(Zh.name)],[new ft(u)],le),l=On(t.type)+"NgFactory";if(this._createNgModuleFactory(e,t.type.reference,kt(Jt.createModuleFactory).callFn([e.importExpr(t.type.reference),Ft(o.map((function(t){return e.importExpr(t.reference)}))),p])),t.id){var c="string"==typeof t.id?Ut(t.id):e.importExpr(t.id),h=kt(Jt.RegisterModuleFactoryFn).callFn([c,It(l)]).toStmt();e.statements.push(h)}return new Jh(l)},t.prototype.createStub=function(e,t){this._createNgModuleFactory(e,t,ot)},t.prototype._createNgModuleFactory=function(t,n,r){var i=It(On({reference:n})+"NgFactory").set(r).toDeclStmt(Ot(Jt.NgModuleFactory,[Rt(t.importExpr(n))],[Z.Const]),[e.StmtModifier.Final,e.StmtModifier.Exported]);t.statements.push(i)},t}(),tf=function(){function e(e){this._reflector=e}return e.prototype.isNgModule=function(e){return this._reflector.annotations(e).some(U.isTypeOf)},e.prototype.resolve=function(e,t){void 0===t&&(t=!0);var n=Jc(this._reflector.annotations(e),U.isTypeOf);if(n)return n;if(t)throw new Error("No NgModule metadata found for '"+Sn(e)+"'.");return null},e}();function nf(e){var t=new of,n=hr.createRoot();return(Array.isArray(e)?e:[e]).forEach((function(e){if(e instanceof pt)e.visitStatement(t,n);else if(e instanceof Ee)e.visitExpression(t,n);else{if(!(e instanceof ne))throw new Error("Don't know how to print debug info for "+e);e.visitType(t,n)}})),n.toSource()}var rf=function(){function e(){}return e.prototype.emitStatementsAndContext=function(e,t,n,r,i,o){void 0===n&&(n=""),void 0===r&&(r=!0);var a=new of(i,o),u=hr.createRoot();a.visitAllStatements(t,u);var p=n?n.split("\n"):[];a.reexports.forEach((function(e,t){var n=e.map((function(e){return e.name+" as "+e.as})).join(",");p.push("export {"+n+"} from '"+t+"';")})),a.importsWithPrefixes.forEach((function(e,t){p.push("import * as "+e+" from '"+t+"';")}));var l=r?u.toSourceMapGenerator(e,p.length).toJsComment():"",c=s(p,[u.toSource(),l]);return l&&c.push(""),u.setPreambleLineCount(p.length),{sourceText:c.join("\n"),context:u}},e.prototype.emitStatements=function(e,t,n){return void 0===n&&(n=""),this.emitStatementsAndContext(e,t,n).sourceText},e}(),of=function(t){function n(e,n){var r=t.call(this,!1)||this;return r.referenceFilter=e,r.importFilter=n,r.typeExpression=0,r.importsWithPrefixes=new Map,r.reexports=new Map,r}return r(n,t),n.prototype.visitType=function(e,t,n){void 0===n&&(n="any"),e?(this.typeExpression++,e.visitType(this,t),this.typeExpression--):t.print(null,n)},n.prototype.visitLiteralExpr=function(e,n){var r=e.value;return null==r&&e.type!=le?(n.print(e,"("+r+" as any)"),null):t.prototype.visitLiteralExpr.call(this,e,n)},n.prototype.visitLiteralArrayExpr=function(e,n){0===e.entries.length&&n.print(e,"(");var r=t.prototype.visitLiteralArrayExpr.call(this,e,n);return 0===e.entries.length&&n.print(e," as any[])"),r},n.prototype.visitExternalExpr=function(e,t){return this._visitIdentifier(e.value,e.typeParams,t),null},n.prototype.visitAssertNotNullExpr=function(e,n){var r=t.prototype.visitAssertNotNullExpr.call(this,e,n);return n.print(e,"!"),r},n.prototype.visitDeclareVarStmt=function(t,n){if(t.hasModifier(e.StmtModifier.Exported)&&t.value instanceof qe&&!t.type){var r=t.value.value,i=r.name,o=r.moduleName;if(o){var s=this.reexports.get(o);return s||this.reexports.set(o,s=[]),s.push({name:i,as:t.name}),null}}return t.hasModifier(e.StmtModifier.Exported)&&n.print(t,"export "),t.hasModifier(e.StmtModifier.Final)?n.print(t,"const"):n.print(t,"var"),n.print(t," "+t.name),this._printColonType(t.type,n),t.value&&(n.print(t," = "),t.value.visitExpression(this,n)),n.println(t,";"),null},n.prototype.visitWrappedNodeExpr=function(e,t){throw new Error("Cannot visit a WrappedNodeExpr when outputting Typescript.")},n.prototype.visitCastExpr=function(e,t){return t.print(e,"(<"),e.type.visitType(this,t),t.print(e,">"),e.value.visitExpression(this,t),t.print(e,")"),null},n.prototype.visitInstantiateExpr=function(e,t){return t.print(e,"new "),this.typeExpression++,e.classExpr.visitExpression(this,t),this.typeExpression--,t.print(e,"("),this.visitAllExpressions(e.args,t,","),t.print(e,")"),null},n.prototype.visitDeclareClassStmt=function(t,n){var r=this;return n.pushClass(t),t.hasModifier(e.StmtModifier.Exported)&&n.print(t,"export "),n.print(t,"class "+t.name),null!=t.parent&&(n.print(t," extends "),this.typeExpression++,t.parent.visitExpression(this,n),this.typeExpression--),n.println(t," {"),n.incIndent(),t.fields.forEach((function(e){return r._visitClassField(e,n)})),null!=t.constructorMethod&&this._visitClassConstructor(t,n),t.getters.forEach((function(e){return r._visitClassGetter(e,n)})),t.methods.forEach((function(e){return r._visitClassMethod(e,n)})),n.decIndent(),n.println(t,"}"),n.popClass(),null},n.prototype._visitClassField=function(t,n){t.hasModifier(e.StmtModifier.Private)&&n.print(null,"/*private*/ "),t.hasModifier(e.StmtModifier.Static)&&n.print(null,"static "),n.print(null,t.name),this._printColonType(t.type,n),t.initializer&&(n.print(null," = "),t.initializer.visitExpression(this,n)),n.println(null,";")},n.prototype._visitClassGetter=function(t,n){t.hasModifier(e.StmtModifier.Private)&&n.print(null,"private "),n.print(null,"get "+t.name+"()"),this._printColonType(t.type,n),n.println(null," {"),n.incIndent(),this.visitAllStatements(t.body,n),n.decIndent(),n.println(null,"}")},n.prototype._visitClassConstructor=function(e,t){t.print(e,"constructor("),this._visitParams(e.constructorMethod.params,t),t.println(e,") {"),t.incIndent(),this.visitAllStatements(e.constructorMethod.body,t),t.decIndent(),t.println(e,"}")},n.prototype._visitClassMethod=function(t,n){t.hasModifier(e.StmtModifier.Private)&&n.print(null,"private "),n.print(null,t.name+"("),this._visitParams(t.params,n),n.print(null,")"),this._printColonType(t.type,n,"void"),n.println(null," {"),n.incIndent(),this.visitAllStatements(t.body,n),n.decIndent(),n.println(null,"}")},n.prototype.visitFunctionExpr=function(e,t){return e.name&&(t.print(e,"function "),t.print(e,e.name)),t.print(e,"("),this._visitParams(e.params,t),t.print(e,")"),this._printColonType(e.type,t,"void"),e.name||t.print(e," => "),t.println(e,"{"),t.incIndent(),this.visitAllStatements(e.statements,t),t.decIndent(),t.print(e,"}"),null},n.prototype.visitDeclareFunctionStmt=function(t,n){return t.hasModifier(e.StmtModifier.Exported)&&n.print(t,"export "),n.print(t,"function "+t.name+"("),this._visitParams(t.params,n),n.print(t,")"),this._printColonType(t.type,n,"void"),n.println(t," {"),n.incIndent(),this.visitAllStatements(t.statements,n),n.decIndent(),n.println(t,"}"),null},n.prototype.visitTryCatchStmt=function(t,n){n.println(t,"try {"),n.incIndent(),this.visitAllStatements(t.bodyStmts,n),n.decIndent(),n.println(t,"} catch ("+pr.name+") {"),n.incIndent();var r=[lr.set(pr.prop("stack",null)).toDeclStmt(null,[e.StmtModifier.Final])].concat(t.catchStmts);return this.visitAllStatements(r,n),n.decIndent(),n.println(t,"}"),null},n.prototype.visitBuiltinType=function(t,n){var r;switch(t.name){case e.BuiltinTypeName.Bool:r="boolean";break;case e.BuiltinTypeName.Dynamic:r="any";break;case e.BuiltinTypeName.Function:r="Function";break;case e.BuiltinTypeName.Number:case e.BuiltinTypeName.Int:r="number";break;case e.BuiltinTypeName.String:r="string";break;case e.BuiltinTypeName.None:r="never";break;default:throw new Error("Unsupported builtin type "+t.name)}return n.print(null,r),null},n.prototype.visitExpressionType=function(e,t){var n=this;return e.value.visitExpression(this,t),null!==e.typeParams&&(t.print(null,"<"),this.visitAllObjects((function(e){return n.visitType(e,t)}),e.typeParams,t,","),t.print(null,">")),null},n.prototype.visitArrayType=function(e,t){return this.visitType(e.of,t),t.print(null,"[]"),null},n.prototype.visitMapType=function(e,t){return t.print(null,"{[key: string]:"),this.visitType(e.valueType,t),t.print(null,"}"),null},n.prototype.getBuiltinMethodName=function(t){var n;switch(t){case e.BuiltinMethod.ConcatArray:n="concat";break;case e.BuiltinMethod.SubscribeObservable:n="subscribe";break;case e.BuiltinMethod.Bind:n="bind";break;default:throw new Error("Unknown builtin method: "+t)}return n},n.prototype._visitParams=function(e,t){var n=this;this.visitAllObjects((function(e){t.print(null,e.name),n._printColonType(e.type,t)}),e,t,",")},n.prototype._visitIdentifier=function(e,t,n){var r=this,i=e.name,o=e.moduleName;if(this.referenceFilter&&this.referenceFilter(e))n.print(null,"(null as any)");else{if(o&&(!this.importFilter||!this.importFilter(e))){var s=this.importsWithPrefixes.get(o);null==s&&this.importsWithPrefixes.set(o,s="i"+this.importsWithPrefixes.size),n.print(null,s+".")}n.print(null,i),this.typeExpression>0&&(t||[]).length>0&&(n.print(null,"<"),this.visitAllObjects((function(e){return e.visitType(r,n)}),t,n,","),n.print(null,">"))}},n.prototype._printColonType=function(e,t,n){e!==le&&(t.print(null,":"),this.visitType(e,t,n))},n}(fr),sf=function(){function e(e){this._reflector=e}return e.prototype.isPipe=function(e){var t=this._reflector.annotations(xn(e));return t&&t.some(F.isTypeOf)},e.prototype.resolve=function(e,t){void 0===t&&(t=!0);var n=this._reflector.annotations(xn(e));if(n){var r=Jc(n,F.isTypeOf);if(r)return r}if(t)throw new Error("No Pipe decorator found on "+Sn(e));return null},e}(),af=function(){function e(e,t){this.options=e,this.reflector=t}return e.prototype.compileComponent=function(e,t,n,r,i,o){var s=this,a=new Map;r.forEach((function(e){return a.set(e.name,e.type.reference)}));var u=0,p=function(e,n){var r=u++;return new pf(s.options,s.reflector,i,e,t.type.reference,t.isHost,r,a,n,o,p)},l=p(null,[]);return l.visitAll([],n),l.build(e)},e}(),uf=new(function(){function e(){}return e.prototype.notifyImplicitReceiverUse=function(){},e.prototype.getLocal=function(e){return e===bs.event.name?It("_any"):null},e}()),pf=function(){function t(e,t,n,r,i,o,s,a,u,p,l){this.options=e,this.reflector=t,this.externalReferenceVars=n,this.parent=r,this.component=i,this.isHostComponent=o,this.embeddedViewIndex=s,this.pipes=a,this.guards=u,this.ctx=p,this.viewBuilderFactory=l,this.refOutputVars=new Map,this.variables=[],this.children=[],this.updates=[],this.actions=[]}return t.prototype.getOutputVar=function(e){var t;if(!(t=e===this.component&&this.isHostComponent?"_any":e instanceof nn?this.externalReferenceVars.get(e):"_any"))throw new Error("Illegal State: referring to a type without a variable "+JSON.stringify(e));return t},t.prototype.getTypeGuardExpressions=function(e){var t,n,r,o,a=s(this.guards);try{for(var u=i(e.directives),p=u.next();!p.done;p=u.next()){var l=p.value;try{for(var c=(r=void 0,i(l.inputs)),h=c.next();!h.done;h=c.next()){var f=h.value,d=l.directive.guards[f.directiveName];d&&a.push({guard:d,useIf:"UseIf"===d,expression:{context:this.component,value:f.value,sourceSpan:f.sourceSpan}})}}catch(e){r={error:e}}finally{try{h&&!h.done&&(o=c.return)&&o.call(c)}finally{if(r)throw r.error}}}}catch(e){t={error:e}}finally{try{p&&!p.done&&(n=u.return)&&n.call(u)}finally{if(t)throw t.error}}return a},t.prototype.visitAll=function(e,t){this.variables=e,Ou(this,t)},t.prototype.build=function(e,t){var n,r,o=this;void 0===t&&(t=[]),this.children.forEach((function(n){return n.build(e,t)}));var a=[It("_any").set(ot).toDeclStmt(pe)],u=0;if(this.updates.forEach((function(e){var t=o.preprocessUpdateExpression(e),n=t.sourceSpan,r=t.context,i=t.value,p=""+u++,l=Ds(r===o.component?o:uf,It(o.getOutputVar(r)),i,p,ks.General),c=l.stmts;c.push(new ht(l.currValExpr)),a.push.apply(a,s(c.map((function(e){return Mt(e,n)}))))})),this.actions.forEach((function(e){var t=e.sourceSpan,n=e.context,r=e.value,i=""+u++,p=As(n===o.component?o:uf,It(o.getOutputVar(n)),r,i).stmts;a.push.apply(a,s(p.map((function(e){return Mt(e,t)}))))})),this.guards.length){var p=void 0;try{for(var l=i(this.guards),c=l.next();!c.done;c=l.next()){var h=c.value,f=this.preprocessUpdateExpression(h.expression),d=f.context,v=f.value,m=""+u++,y=Ds(d===this.component?this:uf,It(this.getOutputVar(d)),v,m,ks.TrySimple),g=y.currValExpr;if(0==y.stmts.length){var E=h.useIf?g:this.ctx.importExpr(h.guard).callFn([g]);p=p?p.and(E):E}}}catch(e){n={error:e}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(n)throw n.error}}p&&(a=[new Et(p,a)])}var _=new ct("_View_"+e+"_"+this.embeddedViewIndex,[],a);return t.push(_),t},t.prototype.visitBoundText=function(e,t){var n=this;e.value.ast.expressions.forEach((function(t){return n.updates.push({context:n.component,value:t,sourceSpan:e.sourceSpan})}))},t.prototype.visitEmbeddedTemplate=function(e,t){if(this.visitElementOrTemplate(e),this.options.fullTemplateTypeCheck){var n=this.getTypeGuardExpressions(e),r=this.viewBuilderFactory(this,n);this.children.push(r),r.visitAll(e.variables,e.children)}},t.prototype.visitElement=function(e,t){var n=this;this.visitElementOrTemplate(e),e.inputs.forEach((function(e){n.updates.push({context:n.component,value:e.value,sourceSpan:e.sourceSpan})})),Ou(this,e.children)},t.prototype.visitElementOrTemplate=function(t){var n=this;t.directives.forEach((function(e){n.visitDirective(e)})),t.references.forEach((function(t){n.refOutputVars.set(t.name,t.value&&t.value.identifier&&n.options.fullTemplateTypeCheck?t.value.identifier.reference:e.BuiltinTypeName.Dynamic)})),t.outputs.forEach((function(e){n.actions.push({context:n.component,value:e.handler,sourceSpan:e.sourceSpan})}))},t.prototype.visitDirective=function(e){var t=this,n=e.directive.type.reference;e.inputs.forEach((function(e){return t.updates.push({context:t.component,value:e.value,sourceSpan:e.sourceSpan})})),this.options.fullTemplateTypeCheck&&(e.hostProperties.forEach((function(e){return t.updates.push({context:n,value:e.value,sourceSpan:e.sourceSpan})})),e.hostEvents.forEach((function(e){return t.actions.push({context:n,value:e.handler,sourceSpan:e.sourceSpan})})))},t.prototype.notifyImplicitReceiverUse=function(){},t.prototype.getLocal=function(t){if(t==bs.event.name)return It(this.getOutputVar(e.BuiltinTypeName.Dynamic));for(var n=this;n;n=n.parent){var r=void 0;if(null==(r=n.refOutputVars.get(t))&&n.variables.find((function(e){return e.name===t}))&&(r=e.BuiltinTypeName.Dynamic),null!=r)return It(this.getOutputVar(r))}return null},t.prototype.pipeOutputVar=function(e){var t=this.pipes.get(e);if(!t)throw new Error("Illegal State: Could not find pipe "+e+" in template of "+this.component);return this.getOutputVar(t)},t.prototype.preprocessUpdateExpression=function(t){var n=this;return{sourceSpan:t.sourceSpan,context:t.context,value:Is({createLiteralArrayConverter:function(e){return function(e){var t=Ft(e);return n.options.fullTemplateTypeCheck?t:t.cast(pe)}},createLiteralMapConverter:function(e){return function(t){var r=Lt(e.map((function(e,n){return{key:e.key,value:t[n],quoted:e.quoted}})));return n.options.fullTemplateTypeCheck?r:r.cast(pe)}},createPipeConverter:function(t,r){return function(r){return It(n.options.fullTemplateTypeCheck?n.pipeOutputVar(t):n.getOutputVar(e.BuiltinTypeName.Dynamic)).callMethod("transform",r)}}},t.value)}},t.prototype.visitNgContent=function(e,t){},t.prototype.visitText=function(e,t){},t.prototype.visitDirectiveProperty=function(e,t){},t.prototype.visitReference=function(e,t){},t.prototype.visitVariable=function(e,t){},t.prototype.visitEvent=function(e,t){},t.prototype.visitElementProperty=function(e,t){},t.prototype.visitAttr=function(e,t){},t}(),lf=function lf(e,t){this.viewClassVar=e,this.rendererTypeVar=t},cf=function(){function t(e){this._reflector=e}return t.prototype.compileComponent=function(t,n,r,i,o){var a,u=this,p=0,l=void 0;if(!n.isHost){var c=n.template,h=[];c.animations&&c.animations.length&&h.push(new nt("animation",xh(t,c.animations),!0));var f=It(Fn(n.type.reference));l=f.name,t.statements.push(f.set(kt(Jt.createRendererType2).callFn([new rt([new nt("encapsulation",Ut(c.encapsulation),!1),new nt("styles",i,!1),new nt("data",new rt(h),!1)])])).toDeclStmt(Ot(Jt.RendererType2),[e.StmtModifier.Final,e.StmtModifier.Exported]))}var d=function(e){var r=p++;return new gf(u._reflector,t,e,n,r,o,d)},v=d(null);return v.visitAll([],r),(a=t.statements).push.apply(a,s(v.build())),new lf(v.viewName,l)},t}(),hf=It("_l"),ff=It("_v"),df=It("_ck"),vf=It("_co"),mf=It("en"),yf=It("ad"),gf=function(){function t(e,t,n,r,i,o,s){this.reflector=e,this.outputCtx=t,this.parent=n,this.component=r,this.embeddedViewIndex=i,this.usedPipes=o,this.viewBuilderFactory=s,this.nodes=[],this.purePipeNodeIndices=Object.create(null),this.refNodeIndices=Object.create(null),this.variables=[],this.children=[],this.compType=this.embeddedViewIndex>0?pe:Rt(t.importExpr(this.component.type.reference)),this.viewName=Dn(this.component.type.reference,this.embeddedViewIndex)}return t.prototype.visitAll=function(e,t){var n=this;this.variables=e,this.parent||this.usedPipes.forEach((function(e){e.pure&&(n.purePipeNodeIndices[e.name]=n._createPipe(null,e))})),this.parent||this.component.viewQueries.forEach((function(e,t){var r=t+1,i=e.first?0:1,o=134217728|xf(e);n.nodes.push((function(){return{sourceSpan:null,nodeFlags:o,nodeDef:kt(Jt.queryDef).callFn([Ut(o),Ut(r),new rt([new nt(e.propertyName,Ut(i),!1)])])}}))})),Ou(this,t),this.parent&&(0===t.length||function e(t){var n=t[t.length-1];return n instanceof Tu?n.hasViewContainer:n instanceof bu?u(n.name)&&n.children.length?e(n.children):n.hasViewContainer:n instanceof Au}(t))&&this.nodes.push((function(){return{sourceSpan:null,nodeFlags:1,nodeDef:kt(Jt.anchorDef).callFn([Ut(0),ot,ot,Ut(0)])}}))},t.prototype.build=function(t){void 0===t&&(t=[]),this.children.forEach((function(e){return e.build(t)}));var n=this._createNodeExpressions(),r=n.updateDirectivesStmts,i=n.nodeDefExprs,o=this._createUpdateFn(n.updateRendererStmts),s=this._createUpdateFn(r),a=0;this.parent||this.component.changeDetection!==E.OnPush||(a|=2);var u=new ct(this.viewName,[new Ge(hf.name)],[new ft(kt(Jt.viewDef).callFn([Ut(a),Ft(i),s,o]))],Ot(Jt.ViewDefinition),0===this.embeddedViewIndex?[e.StmtModifier.Exported]:[]);return t.push(u),t},t.prototype._createUpdateFn=function(e){var t;if(e.length>0){var n=[];!this.component.isHost&&Ct(e).has(vf.name)&&n.push(vf.set(ff.prop("component")).toDeclStmt(this.compType)),t=Bt([new Ge(df.name,le),new Ge(ff.name,le)],s(n,e),le)}else t=ot;return t},t.prototype.visitNgContent=function(e,t){this.nodes.push((function(){return{sourceSpan:e.sourceSpan,nodeFlags:8,nodeDef:kt(Jt.ngContentDef).callFn([Ut(e.ngContentIndex),Ut(e.index)])}}))},t.prototype.visitText=function(e,t){this.nodes.push((function(){return{sourceSpan:e.sourceSpan,nodeFlags:2,nodeDef:kt(Jt.textDef).callFn([Ut(-1),Ut(e.ngContentIndex),Ft([Ut(e.value)])])}}))},t.prototype.visitBoundText=function(e,t){var n=this,r=this.nodes.length;this.nodes.push(null);var i=e.value.ast,o=i.expressions.map((function(t,i){return n._preprocessUpdateExpression({nodeIndex:r,bindingIndex:i,sourceSpan:e.sourceSpan,context:vf,value:t})})),s=r;this.nodes[r]=function(){return{sourceSpan:e.sourceSpan,nodeFlags:2,nodeDef:kt(Jt.textDef).callFn([Ut(s),Ut(e.ngContentIndex),Ft(i.strings.map((function(e){return Ut(e)})))]),updateRenderer:o}}},t.prototype.visitEmbeddedTemplate=function(e,t){var n=this,r=this.nodes.length;this.nodes.push(null);var i=this._visitElementOrTemplate(r,e),o=i.flags,s=i.queryMatchesExpr,a=i.hostEvents,u=this.viewBuilderFactory(this);this.children.push(u),u.visitAll(e.variables,e.children);var p=this.nodes.length-r-1;this.nodes[r]=function(){return{sourceSpan:e.sourceSpan,nodeFlags:1|o,nodeDef:kt(Jt.anchorDef).callFn([Ut(o),s,Ut(e.ngContentIndex),Ut(p),n._createElementHandleEventFn(r,a),It(u.viewName)])}}},t.prototype.visitElement=function(e,t){var n=this,r=this.nodes.length;this.nodes.push(null);var i=u(e.name)?null:e.name,s=this._visitElementOrTemplate(r,e),a=s.flags,p=s.usedEvents,l=s.queryMatchesExpr,c=s.hostBindings,h=s.hostEvents,f=[],d=[],v=[];if(i){var m=e.inputs.map((function(e){return{context:vf,inputAst:e,dirAst:null}})).concat(c);m.length&&(d=m.map((function(e,t){return n._preprocessUpdateExpression({context:e.context,nodeIndex:r,bindingIndex:t,sourceSpan:e.inputAst.sourceSpan,value:e.inputAst.value})})),f=m.map((function(e){return function t(e,n){var r=e.type;switch(r){case 1:return Ft([Ut(1),Ut(e.name),Ut(e.securityContext)]);case 0:return Ft([Ut(8),Ut(e.name),Ut(e.securityContext)]);case 4:return Ft([Ut(8|(n&&n.directive.isComponent?32:16)),Ut("@"+e.name),Ut(e.securityContext)]);case 2:return Ft([Ut(2),Ut(e.name),ot]);case 3:return Ft([Ut(4),Ut(e.name),Ut(e.unit)]);default:throw new Error("unexpected "+r)}}(e.inputAst,e.dirAst)}))),v=p.map((function(e){var t=o(e,2),n=t[1];return Ft([Ut(t[0]),Ut(n)])}))}Ou(this,e.children);var y=this.nodes.length-r-1,g=e.directives.find((function(e){return e.directive.isComponent})),E=ot,_=ot;g&&(_=this.outputCtx.importExpr(g.directive.componentViewType),E=this.outputCtx.importExpr(g.directive.rendererType));var S=r;this.nodes[r]=function(){return{sourceSpan:e.sourceSpan,nodeFlags:1|a,nodeDef:kt(Jt.elementDef).callFn([Ut(S),Ut(a),l,Ut(e.ngContentIndex),Ut(y),Ut(i),i?(t=e,o=Object.create(null),t.attrs.forEach((function(e){o[e.name]=e.value})),t.directives.forEach((function(e){Object.keys(e.directive.hostAttributes).forEach((function(t){var n=e.directive.hostAttributes[t],r=o[t];o[t]=null!=r?function i(e,t,n){return"class"==e||"style"==e?t+" "+n:n}(t,r,n):n}))})),Ft(Object.keys(o).sort().map((function(e){return Ft([Ut(e),Ut(o[e])])})))):ot,f.length?Ft(f):ot,v.length?Ft(v):ot,n._createElementHandleEventFn(r,h),_,E]),updateRenderer:d};var t,o}},t.prototype._visitElementOrTemplate=function(e,t){var n=this,r=0;t.hasViewContainer&&(r|=16777216);var i=new Map;t.outputs.forEach((function(e){var t=Sf(e,null),n=t.name,r=t.target;i.set(wf(r,n),[r,n])})),t.directives.forEach((function(e){e.hostEvents.forEach((function(t){var n=Sf(t,e),r=n.name,o=n.target;i.set(wf(o,r),[o,r])}))}));var o=[],a=[];this._visitComponentFactoryResolverProvider(t.directives),t.providers.forEach((function(e){var r=void 0;if(t.directives.forEach((function(t){t.directive.type.reference===jn(e.token)&&(r=t)})),r){var u=n._visitDirective(e,r,t.references,t.queryMatches,i),p=u.hostEvents;o.push.apply(o,s(u.hostBindings)),a.push.apply(a,s(p))}else n._visitProvider(e,t.queryMatches)}));var u=[];return t.queryMatches.forEach((function(e){var t=void 0;jn(e.value)===n.reflector.resolveExternalReference(Jt.ElementRef)?t=0:jn(e.value)===n.reflector.resolveExternalReference(Jt.ViewContainerRef)?t=3:jn(e.value)===n.reflector.resolveExternalReference(Jt.TemplateRef)&&(t=2),null!=t&&u.push(Ft([Ut(e.queryId),Ut(t)]))})),t.references.forEach((function(t){var r=void 0;t.value?jn(t.value)===n.reflector.resolveExternalReference(Jt.TemplateRef)&&(r=2):r=1,null!=r&&(n.refNodeIndices[t.name]=e,u.push(Ft([Ut(t.name),Ut(r)])))})),t.outputs.forEach((function(e){a.push({context:vf,eventAst:e,dirAst:null})})),{flags:r,usedEvents:Array.from(i.values()),queryMatchesExpr:u.length?Ft(u):ot,hostBindings:o,hostEvents:a}},t.prototype._visitDirective=function(e,t,n,r,i){var o=this,s=this.nodes.length;this.nodes.push(null),t.directive.queries.forEach((function(e,n){var r=t.contentQueryStartId+n,i=67108864|xf(e),s=e.first?0:1;o.nodes.push((function(){return{sourceSpan:t.sourceSpan,nodeFlags:i,nodeDef:kt(Jt.queryDef).callFn([Ut(i),Ut(r),new rt([new nt(e.propertyName,Ut(s),!1)])])}}))}));var a=this.nodes.length-s-1,u=this._visitProviderOrDirective(e,r),p=u.flags,l=u.queryMatchExprs,c=u.providerExpr,h=u.depsExpr;n.forEach((function(t){t.value&&jn(t.value)===jn(e.token)&&(o.refNodeIndices[t.name]=s,l.push(Ft([Ut(t.name),Ut(4)])))})),t.directive.isComponent&&(p|=32768);var f=t.inputs.map((function(e,t){var n=Ft([Ut(t),Ut(e.directiveName)]);return new nt(e.directiveName,n,!1)})),d=[],v=t.directive;Object.keys(v.outputs).forEach((function(e){var t=v.outputs[e];i.has(t)&&d.push(new nt(e,Ut(t),!1))}));var m=[];(t.inputs.length||(327680&p)>0)&&(m=t.inputs.map((function(e,t){return o._preprocessUpdateExpression({nodeIndex:s,bindingIndex:t,sourceSpan:e.sourceSpan,context:vf,value:e.value})})));var y=kt(Jt.nodeValue).callFn([ff,Ut(s)]),g=t.hostProperties.map((function(e){return{context:y,dirAst:t,inputAst:e}})),E=t.hostEvents.map((function(e){return{context:y,eventAst:e,dirAst:t}})),_=s;return this.nodes[s]=function(){return{sourceSpan:t.sourceSpan,nodeFlags:16384|p,nodeDef:kt(Jt.directiveDef).callFn([Ut(_),Ut(p),l.length?Ft(l):ot,Ut(a),c,h,f.length?new rt(f):ot,d.length?new rt(d):ot]),updateDirectives:m,directive:t.directive.type}},{hostBindings:g,hostEvents:E}},t.prototype._visitProvider=function(e,t){this._addProviderNode(this._visitProviderOrDirective(e,t))},t.prototype._visitComponentFactoryResolverProvider=function(e){var t=e.find((function(e){return e.directive.isComponent}));if(t&&t.directive.entryComponents.length){var n=Yh(this.reflector,this.outputCtx,8192,t.directive.entryComponents);this._addProviderNode({providerExpr:n.providerExpr,depsExpr:n.depsExpr,flags:n.flags,tokenExpr:n.tokenExpr,queryMatchExprs:[],sourceSpan:t.sourceSpan})}},t.prototype._addProviderNode=function(e){this.nodes.push((function(){return{sourceSpan:e.sourceSpan,nodeFlags:e.flags,nodeDef:kt(Jt.providerDef).callFn([Ut(e.flags),e.queryMatchExprs.length?Ft(e.queryMatchExprs):ot,e.tokenExpr,e.providerExpr,e.depsExpr])}}))},t.prototype._visitProviderOrDirective=function(e,t){var n=[];t.forEach((function(t){jn(t.value)===jn(e.token)&&n.push(Ft([Ut(t.queryId),Ut(4)]))}));var r=Kh(this.outputCtx,e);return{flags:0|r.flags,queryMatchExprs:n,providerExpr:r.providerExpr,depsExpr:r.depsExpr,tokenExpr:r.tokenExpr,sourceSpan:e.sourceSpan}},t.prototype.getLocal=function(e){if(e==bs.event.name)return bs.event;for(var t=ff,n=this;n;n=n.parent,t=t.prop("parent").cast(pe)){var r=n.refNodeIndices[e];if(null!=r)return kt(Jt.nodeValue).callFn([t,Ut(r)]);var i=n.variables.find((function(t){return t.name===e}));if(i){var o=i.value||"$implicit";return t.prop("context").prop(o)}}return null},t.prototype.notifyImplicitReceiverUse=function(){},t.prototype._createLiteralArrayConverter=function(e,t){if(0===t){var n=kt(Jt.EMPTY_ARRAY);return function(){return n}}var r=this.nodes.length;return this.nodes.push((function(){return{sourceSpan:e,nodeFlags:32,nodeDef:kt(Jt.pureArrayDef).callFn([Ut(r),Ut(t)])}})),function(e){return Ef(r,e)}},t.prototype._createLiteralMapConverter=function(e,t){if(0===t.length){var n=kt(Jt.EMPTY_MAP);return function(){return n}}var r=Lt(t.map((function(e,t){return Object.assign(Object.assign({},e),{value:Ut(t)})}))),i=this.nodes.length;return this.nodes.push((function(){return{sourceSpan:e,nodeFlags:64,nodeDef:kt(Jt.pureObjectDef).callFn([Ut(i),r])}})),function(e){return Ef(i,e)}},t.prototype._createPipeConverter=function(e,t,n){var r=this.usedPipes.find((function(e){return e.name===t}));if(r.pure){var i=this.nodes.length;this.nodes.push((function(){return{sourceSpan:e.sourceSpan,nodeFlags:128,nodeDef:kt(Jt.purePipeDef).callFn([Ut(i),Ut(n)])}}));for(var o=ff,s=this;s.parent;)s=s.parent,o=o.prop("parent").cast(pe);var a=s.purePipeNodeIndices[t],u=kt(Jt.nodeValue).callFn([o,Ut(a)]);return function(t){return _f(e.nodeIndex,e.bindingIndex,Ef(i,[u].concat(t)))}}var p=this._createPipe(e.sourceSpan,r),l=kt(Jt.nodeValue).callFn([ff,Ut(p)]);return function(t){return _f(e.nodeIndex,e.bindingIndex,l.callMethod("transform",t))}},t.prototype._createPipe=function(e,t){var n=this,r=this.nodes.length,i=0;t.type.lifecycleHooks.forEach((function(e){e===Lh.OnDestroy&&(i|=$h(e))}));var o=t.type.diDeps.map((function(e){return Gh(n.outputCtx,e)}));return this.nodes.push((function(){return{sourceSpan:e,nodeFlags:16,nodeDef:kt(Jt.pipeDef).callFn([Ut(i),n.outputCtx.importExpr(t.type.reference),Ft(o)])}})),r},t.prototype._preprocessUpdateExpression=function(e){var t=this;return{nodeIndex:e.nodeIndex,bindingIndex:e.bindingIndex,sourceSpan:e.sourceSpan,context:e.context,value:Is({createLiteralArrayConverter:function(n){return t._createLiteralArrayConverter(e.sourceSpan,n)},createLiteralMapConverter:function(n){return t._createLiteralMapConverter(e.sourceSpan,n)},createPipeConverter:function(n,r){return t._createPipeConverter(e,n,r)}},e.value)}},t.prototype._createNodeExpressions=function(){var e=this,t=0,n=[],r=[],i=this.nodes.map((function(e,t){var i=e(),a=i.nodeDef,u=i.nodeFlags,p=i.updateDirectives,l=i.updateRenderer,c=i.sourceSpan;return l&&n.push.apply(n,s(o(t,c,l,!1))),p&&r.push.apply(r,s(o(t,c,p,(327680&u)>0))),Pt(3&u?new it([hf.callFn([]).callFn([]),a]):a,c)}));return{updateRendererStmts:n,updateDirectivesStmts:r,nodeDefExprs:i};function o(n,r,i,o){var a=[],u=i.map((function(n){var r=n.sourceSpan,i=n.context,o=""+t++,u=Ds(i===vf?e:null,i,n.value,o,ks.General),p=u.currValExpr;return a.push.apply(a,s(u.stmts.map((function(e){return Mt(e,r)})))),Pt(p,r)}));return(i.length||o)&&a.push(Mt(Ef(n,u).toStmt(),r)),a}},t.prototype._createElementHandleEventFn=function(e,t){var n,r=this,i=[],o=0;if(t.forEach((function(e){var t=e.context,n=e.eventAst,s=e.dirAst,a=""+o++,u=As(t===vf?r:null,t,n.handler,a),p=u.allowDefault,l=u.stmts;p&&l.push(yf.set(p.and(yf)).toStmt());var c=Sf(n,s),h=wf(c.target,c.name);i.push(Mt(new Et(Ut(h).identical(mf),l),n.sourceSpan))})),i.length>0){var a=[yf.set(Ut(!0)).toDeclStmt(ce)];!this.component.isHost&&Ct(i).has(vf.name)&&a.push(vf.set(ff.prop("component")).toDeclStmt(this.compType)),n=Bt([new Ge(ff.name,le),new Ge(mf.name,le),new Ge(bs.event.name,le)],s(a,i,[new ft(yf)]),le)}else n=ot;return n},t.prototype.visitDirective=function(e,t){},t.prototype.visitDirectiveProperty=function(e,t){},t.prototype.visitReference=function(e,t){},t.prototype.visitVariable=function(e,t){},t.prototype.visitEvent=function(e,t){},t.prototype.visitElementProperty=function(e,t){},t.prototype.visitAttr=function(e,t){},t}();function Ef(e,t){return df.callFn(t.length>10?[ff,Ut(e),Ut(1),Ft(t)]:s([ff,Ut(e),Ut(0)],t))}function _f(e,t,n){return kt(Jt.unwrapValue).callFn([ff,Ut(e),Ut(t),n])}function Sf(e,t){return e.isAnimation?{name:"@"+e.name+"."+e.phase,target:t&&t.directive.isComponent?"component":null}:e}function xf(e){var t=0;return t|=e.first&&e.static?268435456:536870912,e.emitDistinctChangesOnly&&(t|=-2147483648),t}function wf(e,t){return e?e+":"+t:t}var Cf=function(){function e(e,t,n,r){void 0===r&&(r=null),this._htmlParser=e,this._implicitTags=t,this._implicitAttrs=n,this._locale=r,this._messages=[]}return e.prototype.updateFromTemplate=function(e,t,n){var r,i=this._htmlParser.parse(e,t,{tokenizeExpansionForms:!0,interpolationConfig:n});if(i.errors.length)return i.errors;var o=function a(e,t,n,r){return new rh(n,r).extract(e,t)}(i.rootNodes,n,this._implicitTags,this._implicitAttrs);return o.errors.length?o.errors:((r=this._messages).push.apply(r,s(o.messages)),[])},e.prototype.getMessages=function(){return this._messages},e.prototype.write=function(e,t){var n={},r=new bf;this._messages.forEach((function(t){var r,i=e.digest(t);n.hasOwnProperty(i)?(r=n[i].sources).push.apply(r,s(t.sources)):n[i]=t}));var i=Object.keys(n).map((function(i){var o=e.createNameMapper(n[i]),s=n[i],a=o?r.convert(s.nodes,o):s.nodes,u=new Lr(a,{},{},s.meaning,s.description,i);return u.sources=s.sources,t&&u.sources.forEach((function(e){return e.filePath=t(e.filePath)})),u}));return e.write(i,this._locale)},e}(),bf=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.convert=function(e,t){var n=this;return t?e.map((function(e){return e.visit(n,t)})):e},t.prototype.visitTagPlaceholder=function(e,t){var n=this,r=t.toPublicName(e.startName),i=e.closeName?t.toPublicName(e.closeName):e.closeName,o=e.children.map((function(e){return e.visit(n,t)}));return new Ur(e.tag,e.attrs,r,i,o,e.isVoid,e.sourceSpan,e.startSourceSpan,e.endSourceSpan)},t.prototype.visitPlaceholder=function(e,t){return new Hr(e.value,t.toPublicName(e.name),e.sourceSpan)},t.prototype.visitIcuPlaceholder=function(e,t){return new qr(e.value,t.toPublicName(e.name),e.sourceSpan)},t}(Wr),Tf=function(){function e(e,t,n){this.srcFileUrl=e,this.genFileUrl=t,"string"==typeof n?(this.source=n,this.stmts=null):(this.source=null,this.stmts=n)}return e.prototype.isEquivalent=function(e){return this.genFileUrl===e.genFileUrl&&(this.source?this.source===e.source:null!=e.stmts&&ye(this.stmts,e.stmts))},e}();function Mf(e,t){var n,r,o,s,a=[];try{for(var u=i(e.transitiveModule.providers),p=u.next();!p.done;p=u.next()){var l=p.value,c=l.provider,h=l.module;if(jn(c.token)===t.ROUTES){var f=Pf(c.useValue);try{for(var d=(o=void 0,i(f)),v=d.next();!v.done;v=d.next())a.push(Nf(v.value,t,h.reference))}catch(e){o={error:e}}finally{try{v&&!v.done&&(s=d.return)&&s.call(d)}finally{if(o)throw o.error}}}}}catch(e){n={error:e}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}return a}function Pf(e,t){var n,r;if(void 0===t&&(t=[]),"string"==typeof e)t.push(e);else if(Array.isArray(e))try{for(var o=i(e),s=o.next();!s.done;s=o.next())Pf(s.value,t)}catch(e){n={error:e}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}else e.loadChildren?Pf(e.loadChildren,t):e.children&&Pf(e.children,t);return t}function Nf(e,t,n){var r=o(e.split("#"),2),i=t.resolveExternalReference({moduleName:r[0],name:r[1]},n?n.filePath:void 0);return{route:e,module:n||i,referencedModule:i}}var Af=/^(?!.*\.d\.ts$).*\.ts$/,If=function If(e,t){this.symbol=e,this.metadata=t},kf=function(){function e(e,t,n,r){this.host=e,this.staticSymbolCache=t,this.summaryResolver=n,this.errorRecorder=r,this.metadataCache=new Map,this.resolvedSymbols=new Map,this.importAs=new Map,this.symbolResourcePaths=new Map,this.symbolFromFile=new Map,this.knownFileNameToModuleNames=new Map}return e.prototype.resolveSymbol=function(e){return e.members.length>0?this._resolveSymbolMembers(e):this._resolveSymbolFromSummary(e)||this.resolvedSymbols.get(e)||(this._createSymbolsOf(e.filePath),this.resolvedSymbols.get(e))},e.prototype.getImportAs=function(e,t){if(void 0===t&&(t=!0),e.members.length){var n=this.getStaticSymbol(e.filePath,e.name);return(o=this.getImportAs(n,t))?this.getStaticSymbol(o.filePath,o.name,e.members):null}var r=function i(e){return e.replace(Ph,".")}(e.filePath);if(r!==e.filePath){var o,s=function a(e){return e.replace(Nh,"")}(e.name);return n=this.getStaticSymbol(r,s,e.members),(o=this.getImportAs(n,t))?this.getStaticSymbol(Dh(o.filePath),Fh(o.name),n.members):null}var u=t&&this.summaryResolver.getImportAs(e)||null;return u||(u=this.importAs.get(e)),u},e.prototype.getResourcePath=function(e){return this.symbolResourcePaths.get(e)||e.filePath},e.prototype.getTypeArity=function(e){if(function t(e){return Mh.test(e)}(e.filePath))return null;for(var n=Rf(this.resolveSymbol(e));n&&n.metadata instanceof nn;)n=Rf(this.resolveSymbol(n.metadata));return n&&n.metadata&&n.metadata.arity||null},e.prototype.getKnownModuleName=function(e){return this.knownFileNameToModuleNames.get(e)||null},e.prototype.recordImportAs=function(e,t){e.assertNoMembers(),t.assertNoMembers(),this.importAs.set(e,t)},e.prototype.recordModuleNameForFileName=function(e,t){this.knownFileNameToModuleNames.set(e,t)},e.prototype.invalidateFile=function(e){var t,n;this.metadataCache.delete(e);var r=this.symbolFromFile.get(e);if(!r)return[];this.symbolFromFile.delete(e);try{for(var o=i(r),s=o.next();!s.done;s=o.next()){var a=s.value;this.resolvedSymbols.delete(a),this.importAs.delete(a),this.symbolResourcePaths.delete(a)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r},e.prototype.ignoreErrorsFor=function(e){var t=this.errorRecorder;this.errorRecorder=function(){};try{return e()}finally{this.errorRecorder=t}},e.prototype._resolveSymbolMembers=function(e){var t=e.members,n=this.resolveSymbol(this.getStaticSymbol(e.filePath,e.name));if(!n)return null;var r=Rf(n.metadata);if(r instanceof nn)return new If(e,this.getStaticSymbol(r.filePath,r.name,t));if(!r||"class"!==r.__symbolic){for(var i=r,o=0;o<t.length&&i;o++)i=i[t[o]];return new If(e,i)}return r.statics&&1===t.length?new If(e,r.statics[t[0]]):null},e.prototype._resolveSymbolFromSummary=function(e){var t=this.summaryResolver.resolveSummary(e);return t?new If(e,t.metadata):null},e.prototype.getStaticSymbol=function(e,t,n){return this.staticSymbolCache.get(e,t,n)},e.prototype.hasDecorators=function(e){var t=this.getModuleMetadata(e);return!!t.metadata&&Object.keys(t.metadata).some((function(e){var n=t.metadata[e];return n&&"class"===n.__symbolic&&n.decorators}))},e.prototype.getSymbolsOf=function(e){return this.summaryResolver.getSymbolsOf(e)||(this._createSymbolsOf(e),this.symbolFromFile.get(e)||[])},e.prototype._createSymbolsOf=function(e){var t,n,r,o,s=this;if(!this.symbolFromFile.has(e)){var a=[],u=this.getModuleMetadata(e);if(u.importAs&&this.knownFileNameToModuleNames.set(e,u.importAs),u.exports){var p=function(t){if(t.export)t.export.forEach((function(n){var r,i=r=Of(r="string"==typeof n?n:n.as);"string"!=typeof n&&(i=Of(n.name));var o=s.resolveModule(t.from,e);if(o){var u=s.getStaticSymbol(o,i),p=s.getStaticSymbol(e,r);a.push(s.createExport(p,u))}}));else{var n=l.resolveModule(t.from,e);n&&n!==e&&l.getSymbolsOf(n).forEach((function(t){var n=s.getStaticSymbol(e,t.name);a.push(s.createExport(n,t))}))}},l=this;try{for(var c=i(u.exports),h=c.next();!h.done;h=c.next())p(h.value)}catch(e){t={error:e}}finally{try{h&&!h.done&&(n=c.return)&&n.call(c)}finally{if(t)throw t.error}}}if(u.metadata){var f=new Set(Object.keys(u.metadata).map(Of)),d=u.origins||{};Object.keys(u.metadata).forEach((function(t){var n=u.metadata[t],r=Of(t),i=s.getStaticSymbol(e,r),o=d.hasOwnProperty(t)&&d[t];if(o){var p=s.resolveModule(o,e);p?s.symbolResourcePaths.set(i,p):s.reportError(new Error("Couldn't resolve original symbol for "+o+" from "+s.host.getOutputName(e)))}a.push(s.createResolvedSymbol(i,e,f,n))}))}var v=new Set;try{for(var m=i(a),y=m.next();!y.done;y=m.next()){var g=y.value;this.resolvedSymbols.set(g.symbol,g),v.add(g.symbol)}}catch(e){r={error:e}}finally{try{y&&!y.done&&(o=m.return)&&o.call(m)}finally{if(r)throw r.error}}this.symbolFromFile.set(e,Array.from(v))}},e.prototype.createResolvedSymbol=function(e,t,n,i){var o,a=this,u=Af.test(e.filePath);if(this.summaryResolver.isLibraryFile(e.filePath)&&!u&&i&&"class"===i.__symbolic)return new If(e,{__symbolic:"class",arity:i.arity});var p=function(){return o||(o=a.host.getOutputName(t.replace(/((\.ts)|(\.d\.ts)|)$/,".ts").replace(/^.*node_modules[/\\]/,""))),o},l=this,c=un(i,new(function(i){function o(){return null!==i&&i.apply(this,arguments)||this}return r(o,i),o.prototype.visitStringMap=function(r,o){var a=r.__symbolic;if("function"===a){var u=o.length;o.push.apply(o,s(r.parameters||[]));var c=i.prototype.visitStringMap.call(this,r,o);return o.length=u,c}if("reference"!==a)return"error"===a?Object.assign(Object.assign({},r),{fileName:p()}):i.prototype.visitStringMap.call(this,r,o);var h=r.module,f=r.name?Of(r.name):r.name;if(!f)return null;var d=void 0;return h?(d=l.resolveModule(h,e.filePath))?{__symbolic:"resolved",symbol:l.getStaticSymbol(d,f),line:r.line,character:r.character,fileName:p()}:{__symbolic:"error",message:"Could not resolve "+h+" relative to "+l.host.getMetadataFor(e.filePath)+".",line:r.line,character:r.character,fileName:p()}:o.indexOf(f)>=0?{__symbolic:"reference",name:f}:n.has(f)?l.getStaticSymbol(t,f):void 0},o}(cn)),[]),h=Rf(c);return h instanceof nn?this.createExport(e,h):new If(e,c)},e.prototype.createExport=function(e,t){return e.assertNoMembers(),t.assertNoMembers(),this.summaryResolver.isLibraryFile(e.filePath)&&this.summaryResolver.isLibraryFile(t.filePath)&&this.importAs.set(t,this.getImportAs(e)||e),new If(e,t)},e.prototype.reportError=function(e,t,n){if(!this.errorRecorder)throw e;this.errorRecorder(e,t&&t.filePath||n)},e.prototype.getModuleMetadata=function(e){var t=this.metadataCache.get(e);if(!t){var n=this.host.getMetadataFor(e);if(n){var r=-1;n.forEach((function(e){e&&e.version>r&&(r=e.version,t=e)}))}if(t||(t={__symbolic:"module",version:4,module:e,metadata:{}}),4!=t.version){var i=2==t.version?"Unsupported metadata version "+t.version+" for module "+e+". This module should be compiled with a newer version of ngc":"Metadata version mismatch for module "+this.host.getOutputName(e)+", found version "+t.version+", expected 4";this.reportError(new Error(i))}this.metadataCache.set(e,t)}return t},e.prototype.getSymbolByModule=function(e,t,n){var r=this.resolveModule(e,n);return r?this.getStaticSymbol(r,t):(this.reportError(new Error("Could not resolve module "+e+(n?" relative to "+this.host.getOutputName(n):""))),this.getStaticSymbol("ERROR:"+e,t))},e.prototype.resolveModule=function(e,t){try{return this.host.moduleNameToFileName(e,t)}catch(n){console.error("Could not resolve module '"+e+"' relative to file "+t),this.reportError(n,void 0,t)}return null},e}();function Of(e){return e.startsWith("___")?e.substr(1):e}function Rf(e){return e&&"resolved"===e.__symbolic?e.symbol:e}function Df(t,n,r){var i=Fh(n.name);t.statements.push(Bt([],[new ft(r)],new ae(pe)).toDeclStmt(i,[e.StmtModifier.Final,e.StmtModifier.Exported]))}var Ff=function(t){function n(e,n,r){var i=t.call(this)||this;return i.symbolResolver=e,i.summaryResolver=n,i.srcFileName=r,i.symbols=[],i.indexBySymbol=new Map,i.reexportedBy=new Map,i.processedSummaryBySymbol=new Map,i.processedSummaries=[],i.unprocessedSymbolSummariesBySymbol=new Map,i.moduleName=e.getKnownModuleName(r),i}return r(n,t),n.prototype.addSummary=function(t){var n=this,r=this.unprocessedSymbolSummariesBySymbol.get(t.symbol),i=this.processedSummaryBySymbol.get(t.symbol);if(r||(this.unprocessedSymbolSummariesBySymbol.set(t.symbol,r={symbol:t.symbol,metadata:void 0}),i={symbol:this.processValue(t.symbol,0)},this.processedSummaries.push(i),this.processedSummaryBySymbol.set(t.symbol,i)),!r.metadata&&t.metadata){var o=t.metadata||{};if("class"===o.__symbolic){var s={};Object.keys(o).forEach((function(e){"decorators"!==e&&(s[e]=o[e])})),o=s}else Vf(o)&&(function a(e){return Vf(e)&&Rf(e.expression)instanceof nn}(o)||function u(e){return Vf(e)&&e.expression&&"select"===e.expression.__symbolic&&Rf(e.expression.expression)instanceof nn}(o)||(o={__symbolic:"error",message:"Complex function calls are not supported."}));if(r.metadata=o,i.metadata=this.processValue(o,1),o instanceof nn&&this.summaryResolver.isLibraryFile(o.filePath)){var p=this.symbols[this.indexBySymbol.get(o)];Vh(p.name)||this.reexportedBy.set(p,t.symbol)}}if(!r.type&&t.type&&(r.type=t.type,i.type=this.processValue(t.type,0),t.type.summaryKind===e.CompileSummaryKind.NgModule)){var l=t.type;l.exportedDirectives.concat(l.exportedPipes).forEach((function(e){var t=e.reference;if(n.summaryResolver.isLibraryFile(t.filePath)&&!n.unprocessedSymbolSummariesBySymbol.has(t)){var r=n.summaryResolver.resolveSummary(t);r&&n.addSummary(r)}}))}},n.prototype.serialize=function(e){var t=this,n=[];return{json:JSON.stringify({moduleName:this.moduleName,summaries:this.processedSummaries,symbols:this.symbols.map((function(r,i){r.assertNoMembers();var o=void 0;if(t.summaryResolver.isLibraryFile(r.filePath)){var s=t.reexportedBy.get(r);if(s)o=t.indexBySymbol.get(s);else if(e){var a=t.unprocessedSymbolSummariesBySymbol.get(r);a&&a.metadata&&"interface"===a.metadata.__symbolic||n.push({symbol:r,exportAs:o=r.name+"_"+i})}}return{__symbol:i,name:r.name,filePath:t.summaryResolver.toSummaryFileName(r.filePath,t.srcFileName),importAs:o}}))}),exportAs:n}},n.prototype.processValue=function(e,t){return un(e,this,t)},n.prototype.visitOther=function(e,t){if(e instanceof nn){var n=this.symbolResolver.getStaticSymbol(e.filePath,e.name);return{__symbol:this.visitStaticSymbol(n,t),members:e.members}}},n.prototype.visitStringMap=function(e,n){return"resolved"===e.__symbolic?un(e.symbol,this,n):("error"===e.__symbolic&&(delete e.line,delete e.character),t.prototype.visitStringMap.call(this,e,n))},n.prototype.visitStaticSymbol=function(e,t){var n=this.indexBySymbol.get(e),r=null;if(1&t&&this.summaryResolver.isLibraryFile(e.filePath)){if(this.unprocessedSymbolSummariesBySymbol.has(e))return n;(r=this.loadSummary(e))&&r.metadata instanceof nn&&(n=this.visitStaticSymbol(r.metadata,t),r=null)}else if(null!=n)return n;return null==n&&(n=this.symbols.length,this.symbols.push(e)),this.indexBySymbol.set(e,n),r&&this.addSummary(r),n},n.prototype.loadSummary=function(e){var t=this.summaryResolver.resolveSummary(e);if(!t){var n=this.symbolResolver.resolveSymbol(e);n&&(t={symbol:n.symbol,metadata:n.metadata})}return t},n}(cn),Lf=function(){function t(e,t,n){this.outputCtx=e,this.symbolResolver=t,this.summaryResolver=n,this.data=[]}return t.prototype.addSourceType=function(e,t){this.data.push({summary:e,metadata:t,isLibrary:!1})},t.prototype.addLibType=function(e){this.data.push({summary:e,metadata:null,isLibrary:!0})},t.prototype.serialize=function(t){var n,r,o,s,a,u,p=this,l=new Map;try{for(var c=i(t),h=c.next();!h.done;h=c.next()){var f=h.value;l.set(f.symbol,f.exportAs)}}catch(e){n={error:e}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(n)throw n.error}}var d=new Set;try{for(var v=i(this.data),m=v.next();!m.done;m=v.next()){var y=m.value,g=y.summary,E=y.metadata,_=y.isLibrary;if(g.summaryKind===e.CompileSummaryKind.NgModule){d.add(g.type.reference);var S=g;try{for(var x=(a=void 0,i(S.modules)),w=x.next();!w.done;w=x.next())d.add(w.value.reference)}catch(e){a={error:e}}finally{try{w&&!w.done&&(u=x.return)&&u.call(x)}finally{if(a)throw a.error}}}_||(Fh(g.type.reference.name),Df(this.outputCtx,g.type.reference,this.serializeSummaryWithDeps(g,E)))}}catch(e){o={error:e}}finally{try{m&&!m.done&&(s=v.return)&&s.call(v)}finally{if(o)throw o.error}}d.forEach((function(t){if(p.summaryResolver.isLibraryFile(t.filePath)){var n=Fh(l.get(t)||t.name);p.outputCtx.statements.push(It(n).set(p.serializeSummaryRef(t)).toDeclStmt(null,[e.StmtModifier.Exported]))}}))},t.prototype.serializeSummaryWithDeps=function(t,n){var r=this,i=[this.serializeSummary(t)],o=[];return n instanceof Kn?(i.push.apply(i,s(n.declaredDirectives.concat(n.declaredPipes).map((function(e){return e.reference})).concat(n.transitiveModule.modules.map((function(e){return e.reference})).filter((function(e){return e!==n.type.reference}))).map((function(e){return r.serializeSummaryRef(e)})))),o=n.providers):t.summaryKind===e.CompileSummaryKind.Directive&&(o=t.providers.concat(t.viewProviders)),i.push.apply(i,s(o.filter((function(e){return!!e.useClass})).map((function(t){return r.serializeSummary({summaryKind:e.CompileSummaryKind.Injectable,type:t.useClass})})))),Ft(i)},t.prototype.serializeSummaryRef=function(e){var t=this.symbolResolver.getStaticSymbol(Dh(e.filePath),Fh(e.name));return this.outputCtx.importExpr(t)},t.prototype.serializeSummary=function(e){var t=this.outputCtx,n=function(){function e(){}return e.prototype.visitArray=function(e,t){var n=this;return Ft(e.map((function(e){return un(e,n,t)})))},e.prototype.visitStringMap=function(e,t){var n=this;return new rt(Object.keys(e).map((function(r){return new nt(r,un(e[r],n,t),!1)})))},e.prototype.visitPrimitive=function(e,t){return Ut(e)},e.prototype.visitOther=function(e,n){if(e instanceof nn)return t.importExpr(e);throw new Error("Illegal State: Encountered value "+e)},e}();return un(e,new n,null)},t}(),Bf=function(e){function t(t,n){var r=e.call(this)||this;return r.symbolCache=t,r.summaryResolver=n,r}return r(t,e),t.prototype.deserialize=function(e,t){var n=this,r=JSON.parse(t),i=[];this.symbols=r.symbols.map((function(t){return n.symbolCache.get(n.summaryResolver.fromSummaryFileName(t.filePath,e),t.name)})),r.symbols.forEach((function(t,r){var o=n.symbols[r],s=t.importAs;"number"==typeof s?i.push({symbol:o,importAs:n.symbols[s]}):"string"==typeof s&&i.push({symbol:o,importAs:n.symbolCache.get(Ah(e),s)})}));var o=un(r.summaries,this,null);return{moduleName:r.moduleName,summaries:o,importAs:i}},t.prototype.visitStringMap=function(t,n){if("__symbol"in t){var r=this.symbols[t.__symbol],i=t.members;return i.length?this.symbolCache.get(r.filePath,r.name,i):r}return e.prototype.visitStringMap.call(this,t,n)},t}(cn);function Vf(e){return e&&"call"===e.__symbolic}var jf=function(){function t(e,t,n,r,i,o,s,a,u,p,l,c,h,f){this._config=e,this._options=t,this._host=n,this.reflector=r,this._metadataResolver=i,this._templateParser=o,this._styleCompiler=s,this._viewCompiler=a,this._typeCheckCompiler=u,this._ngModuleCompiler=p,this._injectableCompiler=l,this._outputEmitter=c,this._summaryResolver=h,this._symbolResolver=f,this._templateAstCache=new Map,this._analyzedFiles=new Map,this._analyzedFilesForInjectables=new Map}return t.prototype.clearCache=function(){this._metadataResolver.clearCache()},t.prototype.analyzeModulesSync=function(e){var t=this,n=zf(e,this._host,this._symbolResolver,this._metadataResolver);return n.ngModules.forEach((function(e){return t._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(e.type.reference,!0)})),n},t.prototype.analyzeModulesAsync=function(e){var t=this,n=zf(e,this._host,this._symbolResolver,this._metadataResolver);return Promise.all(n.ngModules.map((function(e){return t._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(e.type.reference,!1)}))).then((function(){return n}))},t.prototype._analyzeFile=function(e){var t=this._analyzedFiles.get(e);return t||(t=Qf(this._host,this._symbolResolver,this._metadataResolver,e),this._analyzedFiles.set(e,t)),t},t.prototype._analyzeFileForInjectables=function(e){var t=this._analyzedFilesForInjectables.get(e);return t||(t=Xf(0,this._symbolResolver,this._metadataResolver,e),this._analyzedFilesForInjectables.set(e,t)),t},t.prototype.findGeneratedFileNames=function(e){var t=this,n=[],r=this._analyzeFile(e);(this._options.allowEmptyCodegenFiles||r.directives.length||r.pipes.length||r.injectables.length||r.ngModules.length||r.exportsNonSourceFiles)&&(n.push(Ah(r.fileName,!0)),this._options.enableSummariesForJit&&n.push(Dh(r.fileName,!0)));var i=Oh(kh(r.fileName,!0)[1]);return r.directives.forEach((function(e){var o=t._metadataResolver.getNonNormalizedDirectiveMetadata(e).metadata;o.isComponent&&o.template.styleUrls.forEach((function(e){var s=t._host.resourceNameToFileName(e,r.fileName);if(!s)throw mn("Couldn't resolve resource "+e+" relative to "+r.fileName);var a=(o.template.encapsulation||t._config.defaultEncapsulation)===g.Emulated;n.push(qf(s,a,i)),t._options.allowEmptyCodegenFiles&&n.push(qf(s,!a,i))}))})),n},t.prototype.emitBasicStub=function(e,t){var n=this._createOutputContext(e);if(e.endsWith(".ngfactory.ts")){if(!t)throw new Error("Assertion error: require the original file for .ngfactory.ts stubs. File: "+e);var r=this._analyzeFile(t);this._createNgFactoryStub(n,r,1)}else if(e.endsWith(".ngsummary.ts")){if(this._options.enableSummariesForJit){if(!t)throw new Error("Assertion error: require the original file for .ngsummary.ts stubs. File: "+e);r=this._analyzeFile(t),Uf(n),r.ngModules.forEach((function(e){!function t(e,n){Df(e,n,ot)}(n,e.type.reference)}))}}else e.endsWith(".ngstyle.ts")&&Uf(n);return this._codegenSourceModule("unknown",n)},t.prototype.emitTypeCheckStub=function(e,t){var n=this._analyzeFile(t),r=this._createOutputContext(e);return e.endsWith(".ngfactory.ts")&&this._createNgFactoryStub(r,n,2),r.statements.length>0?this._codegenSourceModule(n.fileName,r):null},t.prototype.loadFilesAsync=function(e,t){var n=this,r=e.map((function(e){return n._analyzeFile(e)})),i=[];r.forEach((function(e){return e.ngModules.forEach((function(e){return i.push(n._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(e.type.reference,!1))}))}));var o=t.map((function(e){return n._analyzeFileForInjectables(e)}));return Promise.all(i).then((function(e){return{analyzedModules:$f(r),analyzedInjectables:o}}))},t.prototype.loadFilesSync=function(e,t){var n=this,r=e.map((function(e){return n._analyzeFile(e)}));r.forEach((function(e){return e.ngModules.forEach((function(e){return n._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(e.type.reference,!0)}))}));var i=t.map((function(e){return n._analyzeFileForInjectables(e)}));return{analyzedModules:$f(r),analyzedInjectables:i}},t.prototype._createNgFactoryStub=function(e,t,n){var r=this,i=0;t.ngModules.forEach((function(t,o){r._ngModuleCompiler.createStub(e,t.type.reference);var a=s(t.transitiveModule.directives.map((function(e){return e.reference})),t.transitiveModule.pipes.map((function(e){return e.reference})),t.importedModules.map((function(e){return e.type.reference})),t.exportedModules.map((function(e){return e.type.reference})),r._externalIdentifierReferences([Jt.TemplateRef,Jt.ElementRef])),u=new Map;a.forEach((function(e,t){u.set(e,"_decl"+o+"_"+t)})),u.forEach((function(t,n){e.statements.push(It(t).set(ot.cast(pe)).toDeclStmt(Rt(e.importExpr(n,null,!1))))})),2&n&&t.declaredDirectives.forEach((function(n){var o=r._metadataResolver.getDirectiveMetadata(n.reference);o.isComponent&&(i++,r._createTypeCheckBlock(e,o.type.reference.name+"_Host_"+i,t,r._metadataResolver.getHostComponentMetadata(o),[o.type],u),r._createTypeCheckBlock(e,o.type.reference.name+"_"+i,t,o,t.transitiveModule.directives,u))}))})),0===e.statements.length&&Uf(e)},t.prototype._externalIdentifierReferences=function(e){var t,n,r=[];try{for(var o=i(e),s=o.next();!s.done;s=o.next()){var a=tn(this.reflector,s.value);a.identifier&&r.push(a.identifier.reference)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return r},t.prototype._createTypeCheckBlock=function(e,t,n,r,i,o){var a,u=this._parseTemplate(r,n,i);(a=e.statements).push.apply(a,s(this._typeCheckCompiler.compileComponent(t,r,u.template,u.pipes,o,e)))},t.prototype.emitMessageBundle=function(e,t){var n=this,r=[],i=new iu,o=new Cf(i,[],{},t);if(e.files.forEach((function(e){var t=[];e.directives.forEach((function(e){var r=n._metadataResolver.getDirectiveMetadata(e);r&&r.isComponent&&t.push(r)})),t.forEach((function(e){var t=e.template.template,n=e.template.templateUrl,i=mo.fromArray(e.template.interpolation);r.push.apply(r,s(o.updateFromTemplate(t,n,i)))}))})),r.length)throw new Error(r.map((function(e){return e.toString()})).join("\n"));return o},t.prototype.emitAllPartialModules2=function(e){var t=this;return e.reduce((function(e,n){return e.push.apply(e,s(t._emitPartialModule2(n.fileName,n.injectables))),e}),[])},t.prototype._emitPartialModule2=function(e,t){var n=this,r=this._createOutputContext(e);return t.forEach((function(e){return n._injectableCompiler.compile(e,r)})),r.statements&&r.statements.length>0?[{fileName:e,statements:s(r.constantPool.statements,r.statements)}]:[]},t.prototype.emitAllImpls=function(e){var t=this,n=e.ngModuleByPipeOrDirective;return $n(e.files.map((function(e){return t._compileImplFile(e.fileName,n,e.directives,e.pipes,e.ngModules,e.injectables)})))},t.prototype._compileImplFile=function(e,t,n,r,i,o){var a=this,u=Oh(kh(e,!0)[1]),p=[],l=this._createOutputContext(Ah(e,!0));if(p.push.apply(p,s(this._createSummary(e,n,r,i,o,l))),i.forEach((function(e){return a._compileModule(l,e)})),n.forEach((function(n){var r=a._metadataResolver.getDirectiveMetadata(n);if(r.isComponent){var i=t.get(n);if(!i)throw new Error("Internal Error: cannot determine the module for component "+On(r.type)+"!");var o=a._styleCompiler.compileComponent(l,r);r.template.externalStylesheets.forEach((function(t){var n=a._styleCompiler.needsStyleShim(r);p.push(a._codegenStyles(e,r,t,n,u)),a._options.allowEmptyCodegenFiles&&p.push(a._codegenStyles(e,r,t,!n,u))})),a._compileComponent(l,r,i,i.transitiveModule.directives,o,u),a._compileComponentFactory(l,r,i,u)}})),l.statements.length>0||this._options.allowEmptyCodegenFiles){var c=this._codegenSourceModule(e,l);p.unshift(c)}return p},t.prototype._createSummary=function(t,n,r,i,o,a){var u=this,p=this._symbolResolver.getSymbolsOf(t).map((function(e){return u._symbolResolver.resolveSymbol(e)})),l=s(i.map((function(e){return{summary:u._metadataResolver.getNgModuleSummary(e.type.reference),metadata:u._metadataResolver.getNgModuleMetadata(e.type.reference)}})),n.map((function(e){return{summary:u._metadataResolver.getDirectiveSummary(e),metadata:u._metadataResolver.getDirectiveMetadata(e)}})),r.map((function(e){return{summary:u._metadataResolver.getPipeSummary(e),metadata:u._metadataResolver.getPipeMetadata(e)}})),o.map((function(e){return{summary:u._metadataResolver.getInjectableSummary(e.symbol),metadata:u._metadataResolver.getInjectableSummary(e.symbol).type}}))),c=this._options.enableSummariesForJit?this._createOutputContext(Dh(t,!0)):null,h=function f(e,t,n,r,i,o,s){void 0===s&&(s=!1);var a=new Ff(r,n,e);i.forEach((function(e){return a.addSummary({symbol:e.symbol,metadata:e.metadata})})),o.forEach((function(e){var t=e.summary;a.addSummary({symbol:t.type.reference,metadata:void 0,type:t})}));var u=a.serialize(s),p=u.json,l=u.exportAs;if(t){var c=new Lf(t,r,n);o.forEach((function(e){c.addSourceType(e.summary,e.metadata)})),a.unprocessedSymbolSummariesBySymbol.forEach((function(e){n.isLibraryFile(e.symbol.filePath)&&e.type&&c.addLibType(e.type)})),c.serialize(l)}return{json:p,exportAs:l}}(t,c,this._summaryResolver,this._symbolResolver,p,l,this._options.createExternalSymbolFactoryReexports),d=h.json;h.exportAs.forEach((function(t){a.statements.push(It(t.exportAs).set(a.importExpr(t.symbol)).toDeclStmt(null,[e.StmtModifier.Exported]))}));var v=[new Tf(t,Rh(t),d)];return c&&v.push(this._codegenSourceModule(t,c)),v},t.prototype._compileModule=function(e,t){var n=[];if(this._options.locale){var r=this._options.locale.replace(/_/g,"-");n.push({token:tn(this.reflector,Jt.LOCALE_ID),useValue:r})}this._options.i18nFormat&&n.push({token:tn(this.reflector,Jt.TRANSLATIONS_FORMAT),useValue:this._options.i18nFormat}),this._ngModuleCompiler.compile(e,t,n)},t.prototype._compileComponentFactory=function(t,n,r,i){var o=this._metadataResolver.getHostComponentMetadata(n),s=this._compileComponent(t,o,r,[n.type],null,i).viewClassVar,a=Bn(n.type.reference),u=[];for(var p in n.inputs)u.push(new nt(p,Ut(n.inputs[p]),!1));var l=[];for(var p in n.outputs)l.push(new nt(p,Ut(n.outputs[p]),!1));t.statements.push(It(a).set(kt(Jt.createComponentFactory).callFn([Ut(n.selector),t.importExpr(n.type.reference),It(s),new rt(u),new rt(l),Ft(n.template.ngContentSelectors.map((function(e){return Ut(e)})))])).toDeclStmt(Ot(Jt.ComponentFactory,[Rt(t.importExpr(n.type.reference))],[Z.Const]),[e.StmtModifier.Final,e.StmtModifier.Exported]))},t.prototype._compileComponent=function(e,t,n,r,i,o){var s=this._parseTemplate(t,n,r),a=s.template,u=s.pipes,p=i?It(i.stylesVar):Ft([]),l=this._viewCompiler.compileComponent(e,t,a,p,u);return i&&Hf(this._symbolResolver,i,this._styleCompiler.needsStyleShim(t),o),l},t.prototype._parseTemplate=function(e,t,n){var r=this;if(this._templateAstCache.has(e.type.reference))return this._templateAstCache.get(e.type.reference);var i=e.template.preserveWhitespaces,o=n.map((function(e){return r._metadataResolver.getDirectiveSummary(e.reference)})),s=t.transitiveModule.pipes.map((function(e){return r._metadataResolver.getPipeSummary(e.reference)})),a=this._templateParser.parse(e,e.template.htmlAst,o,s,t.schemas,Jn(t.type,e,e.template),i);return this._templateAstCache.set(e.type.reference,a),a},t.prototype._createOutputContext=function(e){var t=this;return{statements:[],genFilePath:e,importExpr:function(n,r,i){if(void 0===r&&(r=null),void 0===i&&(i=!0),!(n instanceof nn))throw new Error("Internal error: unknown identifier "+JSON.stringify(n));var o=t._symbolResolver.getTypeArity(n)||0,s=t._symbolResolver.getImportAs(n,i)||n,a=s.name,u=s.members,p=t._fileNameToModuleName(s.filePath,e),l=p===t._fileNameToModuleName(e,e)?null:p,c=r||[],h=c.concat(Pn(o-c.length,pe));return u.reduce((function(e,t){return e.prop(t)}),kt(new We(l,a,null),h))},constantPool:new Qt}},t.prototype._fileNameToModuleName=function(e,t){return this._summaryResolver.getKnownModuleName(e)||this._symbolResolver.getKnownModuleName(e)||this._host.fileNameToModuleName(e,t)},t.prototype._codegenStyles=function(e,t,n,r,i){var o=this._createOutputContext(qf(n.moduleUrl,r,i)),s=this._styleCompiler.compileStyles(o,t,n,r);return Hf(this._symbolResolver,s,r,i),this._codegenSourceModule(e,o)},t.prototype._codegenSourceModule=function(e,t){return new Tf(e,t.genFilePath,t.statements)},t.prototype.listLazyRoutes=function(e,t){var n,r,o,s,a=this;if(e)return function e(t,n,r){var o,s;if(void 0===n&&(n=new Set),void 0===r&&(r=[]),n.has(t)||!t.name)return r;n.add(t);var u=Mf(a._metadataResolver.getNgModuleMetadata(t,!0),a.reflector);try{for(var p=i(u),l=p.next();!l.done;l=p.next()){var c=l.value;r.push(c),e(c.referencedModule,n,r)}}catch(e){o={error:e}}finally{try{l&&!l.done&&(s=p.return)&&s.call(p)}finally{if(o)throw o.error}}return r}(Nf(e,this.reflector).referencedModule);if(t){var u=[];try{for(var p=i(t.ngModules),l=p.next();!l.done;l=p.next()){var c=Mf(l.value,this.reflector);try{for(var h=(o=void 0,i(c)),f=h.next();!f.done;f=h.next())u.push(f.value)}catch(e){o={error:e}}finally{try{f&&!f.done&&(s=h.return)&&s.call(h)}finally{if(o)throw o.error}}}}catch(e){n={error:e}}finally{try{l&&!l.done&&(r=p.return)&&r.call(p)}finally{if(n)throw n.error}}return u}throw new Error("Either route or analyzedModules has to be specified!")},t}();function Uf(e){e.statements.push(kt(Jt.ComponentFactory).toStmt())}function Hf(e,t,n,r){t.dependencies.forEach((function(t){t.setValue(e.getStaticSymbol(qf(t.moduleUrl,n,r),t.name))}))}function qf(e,t,n){return e+(t?".shim":"")+".ngstyle"+n}function Wf(e,t,n,r){return Gf(function i(e,t,n,r){var i=new Set,o=[],s=function(e){if(i.has(e)||!t.isSourceFile(e))return!1;i.add(e);var a=Qf(t,n,r,e);o.push(a),a.ngModules.forEach((function(e){e.transitiveModule.modules.forEach((function(e){return s(e.reference.filePath)}))}))};return e.forEach((function(e){return s(e)})),o}(e,t,n,r))}function zf(e,t,n,r){return Kf(Wf(e,t,n,r))}function Kf(e){if(e.symbolsMissingModule&&e.symbolsMissingModule.length)throw mn(e.symbolsMissingModule.map((function(e){return"Cannot determine the module for class "+e.name+" in "+e.filePath+"! Add "+e.name+" to the NgModule to fix it."})).join("\n"));return e}function Qf(e,t,n,r){var i=[],o=[],s=[],a=[],u=[],p=t.hasDecorators(r),l=!1;return r.endsWith(".d.ts")&&!p||t.getSymbolsOf(r).forEach((function(r){var p=t.resolveSymbol(r).metadata;if(p&&"error"!==p.__symbolic){var c=!1;if("class"===p.__symbolic)if(n.isDirective(r))c=!0,n.isAbstractDirective(r)?i.push(r):o.push(r);else if(n.isPipe(r))c=!0,s.push(r);else if(n.isNgModule(r)){var h=n.getNgModuleMetadata(r,!1);h&&(c=!0,u.push(h))}else if(n.isInjectable(r)){c=!0;var f=n.getInjectableMetadata(r,null,!1);f&&a.push(f)}c||(l=l||function d(e,t){var n=!1,r=function(){function t(){}return t.prototype.visitArray=function(e,t){var n=this;e.forEach((function(e){return un(e,n,t)}))},t.prototype.visitStringMap=function(e,t){var n=this;Object.keys(e).forEach((function(r){return un(e[r],n,t)}))},t.prototype.visitPrimitive=function(e,t){},t.prototype.visitOther=function(t,r){t instanceof nn&&!e.isSourceFile(t.filePath)&&(n=!0)},t}();return un(t,new r,null),n}(e,p))}})),{fileName:r,directives:o,abstractDirectives:i,pipes:s,ngModules:u,injectables:a,exportsNonSourceFiles:l}}function Xf(e,t,n,r){var i=[],o=[];return t.hasDecorators(r)&&t.getSymbolsOf(r).forEach((function(e){var r=t.resolveSymbol(e).metadata;if(r&&"error"!==r.__symbolic&&"class"===r.__symbolic)if(n.isInjectable(e)){var s=n.getInjectableMetadata(e,null,!1);s&&i.push(s)}else if(n.isNgModule(e)){var a=n.getShallowModuleMetadata(e);a&&o.push(a)}})),{fileName:r,injectables:i,shallowModules:o}}function Gf(e){var t=[],n=new Map,r=new Set;e.forEach((function(e){e.ngModules.forEach((function(e){t.push(e),e.declaredDirectives.forEach((function(t){return n.set(t.reference,e)})),e.declaredPipes.forEach((function(t){return n.set(t.reference,e)}))})),e.directives.forEach((function(e){return r.add(e)})),e.pipes.forEach((function(e){return r.add(e)}))}));var i=[];return r.forEach((function(e){n.has(e)||i.push(e)})),{ngModules:t,ngModuleByPipeOrDirective:n,symbolsMissingModule:i,files:e}}function $f(e){return Kf(Gf(e))}function Yf(e){var t=mn(function e(t,n){var r,o;if(void 0===n&&(n=0),!t)return"";var s=t.position?t.position.fileName+"("+(t.position.line+1)+","+(t.position.column+1)+")":"",a=(s&&0===n?s+": ":"")+t.message+(s&&0!==n?" at "+s:"");if(t.next)try{for(var u=i(t.next),p=u.next();!p.done;p=u.next())a+="\n"+e(p.value,n+2)}catch(e){r={error:e}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}return""+function e(t){if(t<=0)return"";if(t<6)return[""," ","  ","   ","    ","     "][t];var n=e(Math.floor(t/2));return n+n+(t%2==1?" ":"")}(n)+a}(e)+".");return t.ngFormattedMessage=!0,t.chain=e,t.position=e.position,t}var Jf="@angular/core",Zf=/^\$.*\$$/,ed={__symbolic:"ignore"},td=new Set(["useValue","useFactory","data","id","loadChildren"]);function nd(e){return e&&"ignore"==e.__symbolic}var rd=function(){function t(t,n,r,i,o){var s=this;void 0===r&&(r=[]),void 0===i&&(i=[]),this.summaryResolver=t,this.symbolResolver=n,this.errorRecorder=o,this.annotationCache=new Map,this.shallowAnnotationCache=new Map,this.propertyCache=new Map,this.parameterCache=new Map,this.methodCache=new Map,this.staticCache=new Map,this.conversionMap=new Map,this.resolvedExternalReferences=new Map,this.annotationForParentClassWithSummaryKind=new Map,this.initializeConversionMap(),r.forEach((function(e){return s._registerDecoratorOrConstructor(s.getStaticSymbol(e.filePath,e.name),e.ctor)})),i.forEach((function(e){return s._registerFunction(s.getStaticSymbol(e.filePath,e.name),e.fn)})),this.annotationForParentClassWithSummaryKind.set(e.CompileSummaryKind.Directive,[k,D]),this.annotationForParentClassWithSummaryKind.set(e.CompileSummaryKind.Pipe,[F]),this.annotationForParentClassWithSummaryKind.set(e.CompileSummaryKind.NgModule,[U]),this.annotationForParentClassWithSummaryKind.set(e.CompileSummaryKind.Injectable,[H,F,k,D,U])}return t.prototype.componentModuleUrl=function(e){var t=this.findSymbolDeclaration(e);return this.symbolResolver.getResourcePath(t)},t.prototype.invalidateSymbols=function(e){var t,n;try{for(var r=i(e),o=r.next();!o.done;o=r.next()){var s=o.value;this.annotationCache.delete(s),this.shallowAnnotationCache.delete(s),this.propertyCache.delete(s),this.parameterCache.delete(s),this.methodCache.delete(s),this.staticCache.delete(s),this.conversionMap.delete(s)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(t)throw t.error}}},t.prototype.resolveExternalReference=function(e,t){var n=void 0;if(!t){var r=this.resolvedExternalReferences.get(n=e.moduleName+":"+e.name);if(r)return r}var i=this.symbolResolver.getSymbolByModule(e.moduleName,e.name,t),o=this.findSymbolDeclaration(i);return t||(this.symbolResolver.recordModuleNameForFileName(i.filePath,e.moduleName),this.symbolResolver.recordImportAs(o,i)),n&&this.resolvedExternalReferences.set(n,o),o},t.prototype.findDeclaration=function(e,t,n){return this.findSymbolDeclaration(this.symbolResolver.getSymbolByModule(e,t,n))},t.prototype.tryFindDeclaration=function(e,t,n){var r=this;return this.symbolResolver.ignoreErrorsFor((function(){return r.findDeclaration(e,t,n)}))},t.prototype.findSymbolDeclaration=function(e){var t=this.symbolResolver.resolveSymbol(e);if(t){var n=t.metadata;if(n&&"resolved"===n.__symbolic&&(n=n.symbol),n instanceof nn)return this.findSymbolDeclaration(t.metadata)}return e},t.prototype.tryAnnotations=function(e){var t=this.errorRecorder;this.errorRecorder=function(e,t){};try{return this.annotations(e)}finally{this.errorRecorder=t}},t.prototype.annotations=function(e){var t=this;return this._annotations(e,(function(e,n){return t.simplify(e,n)}),this.annotationCache)},t.prototype.shallowAnnotations=function(e){var t=this;return this._annotations(e,(function(e,n){return t.simplify(e,n,!0)}),this.shallowAnnotationCache)},t.prototype._annotations=function(t,n,r){var i=r.get(t);if(!i){i=[];var o=this.getTypeMetadata(t),a=this.findParentType(t,o);if(a){var u=this.annotations(a);i.push.apply(i,s(u))}var p=[];if(o.decorators&&(p=n(t,o.decorators))&&i.push.apply(i,s(p)),a&&!this.summaryResolver.isLibraryFile(t.filePath)&&this.summaryResolver.isLibraryFile(a.filePath)){var l=this.summaryResolver.resolveSummary(a);if(l&&l.type){var c=this.annotationForParentClassWithSummaryKind.get(l.type.summaryKind);c.some((function(e){return p.some((function(t){return e.isTypeOf(t)}))}))||this.reportError(ld(id("Class "+t.name+" in "+t.filePath+" extends from a "+e.CompileSummaryKind[l.type.summaryKind]+" in another compilation unit without duplicating the decorator",void 0,"Please add a "+c.map((function(e){return e.ngMetadataName})).join(" or ")+" decorator to the class"),t),t)}}r.set(t,i.filter((function(e){return!!e})))}return i},t.prototype.propMetadata=function(e){var t=this,n=this.propertyCache.get(e);if(!n){var r=this.getTypeMetadata(e);n={};var i=this.findParentType(e,r);if(i){var o=this.propMetadata(i);Object.keys(o).forEach((function(e){n[e]=o[e]}))}var a=r.members||{};Object.keys(a).forEach((function(r){var i=a[r].find((function(e){return"property"==e.__symbolic||"method"==e.__symbolic})),o=[];(null==n?void 0:n.hasOwnProperty(r))&&o.push.apply(o,s(n[r])),n[r]=o,i&&i.decorators&&o.push.apply(o,s(t.simplify(e,i.decorators)))})),this.propertyCache.set(e,n)}return n},t.prototype.parameters=function(e){var t=this;if(!(e instanceof nn))return this.reportError(new Error("parameters received "+JSON.stringify(e)+" which is not a StaticSymbol"),e),[];try{var n=this.parameterCache.get(e);if(!n){var r=this.getTypeMetadata(e),i=this.findParentType(e,r),o=r?r.members:null,a=o?o.__ctor__:null;if(a){var u=a.find((function(e){return"constructor"==e.__symbolic})),p=u.parameters||[],l=this.simplify(e,u.parameterDecorators||[]);n=[],p.forEach((function(r,i){var o=[],a=t.trySimplify(e,r);a&&o.push(a);var u=l?l[i]:null;u&&o.push.apply(o,s(u)),n.push(o)}))}else i&&(n=this.parameters(i));n||(n=[]),this.parameterCache.set(e,n)}return n}catch(t){throw console.error("Failed on type "+JSON.stringify(e)+" with error "+t),t}},t.prototype._methodNames=function(e){var t=this.methodCache.get(e);if(!t){var n=this.getTypeMetadata(e);t={};var r=this.findParentType(e,n);if(r){var i=this._methodNames(r);Object.keys(i).forEach((function(e){t[e]=i[e]}))}var o=n.members||{};Object.keys(o).forEach((function(e){var n=o[e].some((function(e){return"method"==e.__symbolic}));t[e]=t[e]||n})),this.methodCache.set(e,t)}return t},t.prototype._staticMembers=function(e){var t=this.staticCache.get(e);if(!t){var n=this.getTypeMetadata(e);t=Object.keys(n.statics||{}),this.staticCache.set(e,t)}return t},t.prototype.findParentType=function(e,t){var n=this.trySimplify(e,t.extends);if(n instanceof nn)return n},t.prototype.hasLifecycleHook=function(e,t){e instanceof nn||this.reportError(new Error("hasLifecycleHook received "+JSON.stringify(e)+" which is not a StaticSymbol"),e);try{return!!this._methodNames(e)[t]}catch(t){throw console.error("Failed on type "+JSON.stringify(e)+" with error "+t),t}},t.prototype.guards=function(e){var t,n;if(!(e instanceof nn))return this.reportError(new Error("guards received "+JSON.stringify(e)+" which is not a StaticSymbol"),e),{};var r=this._staticMembers(e),o={};try{for(var s=i(r),a=s.next();!a.done;a=s.next()){var u=a.value;if(u.endsWith("TypeGuard")){var p=u.substr(0,u.length-"TypeGuard".length),l=void 0;p.endsWith("UseIf")?(p=u.substr(0,p.length-"UseIf".length),l="UseIf"):l=this.getStaticSymbol(e.filePath,e.name,[u]),o[p]=l}}}catch(e){t={error:e}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}return o},t.prototype._registerDecoratorOrConstructor=function(e,t){this.conversionMap.set(e,(function(e,n){return new(t.bind.apply(t,s([void 0],n)))}))},t.prototype._registerFunction=function(e,t){this.conversionMap.set(e,(function(e,n){return t.apply(void 0,n)}))},t.prototype.initializeConversionMap=function(){this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Injectable"),H),this.injectionToken=this.findDeclaration(Jf,"InjectionToken"),this.opaqueToken=this.findDeclaration(Jf,"OpaqueToken"),this.ROUTES=this.tryFindDeclaration("@angular/router","ROUTES"),this.ANALYZE_FOR_ENTRY_COMPONENTS=this.findDeclaration(Jf,"ANALYZE_FOR_ENTRY_COMPONENTS"),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Host"),X),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Self"),K),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"SkipSelf"),Q),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Inject"),b),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Optional"),z),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Attribute"),M),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"ContentChild"),N),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"ContentChildren"),P),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"ViewChild"),I),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"ViewChildren"),A),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Input"),L),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Output"),B),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Pipe"),F),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"HostBinding"),V),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"HostListener"),j),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Directive"),k),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Component"),D),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"NgModule"),U),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Host"),X),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Self"),K),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"SkipSelf"),Q),this._registerDecoratorOrConstructor(this.findDeclaration(Jf,"Optional"),z)},t.prototype.getStaticSymbol=function(e,t,n){return this.symbolResolver.getStaticSymbol(e,t,n)},t.prototype.trySimplify=function(e,t){var n=this.errorRecorder;this.errorRecorder=function(e,t){};var r=this.simplify(e,t);return this.errorRecorder=n,r},t.prototype.simplify=function(e,t,n){void 0===n&&(n=!1);var r,o=this,a=ud.empty,u=new Map;try{r=function e(t,n,r,p){function l(e){var t=o.symbolResolver.resolveSymbol(e);return t?t.metadata:null}function c(n){return e(t,n,r,0)}function h(n,i){if(n===t)return e(n,i,r+1,p);try{return e(n,i,r+1,p)}catch(e){if(!od(e))throw e;var s=e.chain?"references '"+e.symbol.name+"'":function a(e){if(e.summary)return e.summary;switch(e.message){case"Reference to non-exported class":if(e.context&&e.context.className)return"references non-exported class "+e.context.className;break;case"Variable not initialized":return"is not initialized";case"Destructuring not supported":return"is a destructured variable";case"Could not resolve type":return"could not be resolved";case sd:return e.context&&e.context.name?"calls '"+e.context.name+"'":"calls a function";case"Reference to a local symbol":return e.context&&e.context.name?"references local variable "+e.context.name:"references a local variable"}return"contains the error"}(e);o.error({message:e.message,advise:e.advise,context:e.context,chain:{message:"'"+n.name+"' "+s,position:e.position,next:e.chain},symbol:n},t)}}return function n(f){var d,v,m,y;if(ad(f))return f;if(Array.isArray(f)){var g=[];try{for(var E=i(f),_=E.next();!_.done;_=E.next()){var S=_.value;if(S&&"spread"===S.__symbolic){var x=c(S.expression);if(Array.isArray(x)){try{for(var w=(m=void 0,i(x)),C=w.next();!C.done;C=w.next())g.push(C.value)}catch(e){m={error:e}}finally{try{C&&!C.done&&(y=w.return)&&y.call(w)}finally{if(m)throw m.error}}continue}}var b=n(S);nd(b)||g.push(b)}}catch(e){d={error:e}}finally{try{_&&!_.done&&(v=E.return)&&v.call(E)}finally{if(d)throw d.error}}return g}if(f instanceof nn)return f===o.injectionToken||o.conversionMap.has(f)||p>0&&!f.members.length?f:null!=(F=l(T=f))?h(T,F):T;if(f){if(f.__symbolic){var T=void 0;switch(f.__symbolic){case"binop":var M=n(f.left);if(nd(M))return M;var P=n(f.right);if(nd(P))return P;switch(f.operator){case"&&":return M&&P;case"||":return M||P;case"|":return M|P;case"^":return M^P;case"&":return M&P;case"==":return M==P;case"!=":return M!=P;case"===":return M===P;case"!==":return M!==P;case"<":return M<P;case">":return M>P;case"<=":return M<=P;case">=":return M>=P;case"<<":return M<<P;case">>":return M>>P;case"+":return M+P;case"-":return M-P;case"*":return M*P;case"/":return M/P;case"%":return M%P}return null;case"if":var N=n(f.condition);return n(N?f.thenExpression:f.elseExpression);case"pre":var A=n(f.operand);if(nd(A))return A;switch(f.operator){case"+":return A;case"-":return-A;case"!":return!A;case"~":return~A}return null;case"index":var I=c(f.expression),k=c(f.index);return I&&ad(k)?I[k]:null;case"select":var O=f.member,R=t,D=n(f.expression);if(D instanceof nn){var F,L=D.members.concat(O);return null!=(F=l(R=o.getStaticSymbol(D.filePath,D.name,L)))?h(R,F):R}return D&&ad(O)?h(R,D[O]):null;case"reference":var B=a.resolve(f.name);if(B!=ud.missing)return B;break;case"resolved":try{return n(f.symbol)}catch(e){throw od(e)&&null!=f.fileName&&null!=f.line&&null!=f.character&&(e.position={fileName:f.fileName,line:f.line,column:f.character}),e}case"class":case"function":return t;case"new":case"call":if((T=e(t,f.expression,r+1,0))instanceof nn){if(T===o.injectionToken||T===o.opaqueToken)return t;var V=f.arguments||[],j=o.conversionMap.get(T);if(j){var U=V.map((function(e){return h(t,e)})).map((function(e){return nd(e)?void 0:e}));return j(t,U)}return function H(e,i,p,l){if(i&&"function"==i.__symbolic){u.get(e)&&o.error({message:"Recursion is not supported",summary:"called '"+e.name+"' recursively",value:i},e);try{var c=i.value;if(c&&(0!=r||"error"!=c.__symbolic)){var f=i.parameters,d=i.defaults;p=p.map((function(e){return h(t,e)})).map((function(e){return nd(e)?void 0:e})),d&&d.length>p.length&&p.push.apply(p,s(d.slice(p.length).map((function(e){return n(e)})))),u.set(e,!0);for(var v=ud.build(),m=0;m<f.length;m++)v.define(f[m],p[m]);var y,g=a;try{a=v.done(),y=h(e,c)}finally{a=g}return y}}finally{u.delete(e)}}if(0===r)return ed;var E=void 0;if(l&&"resolved"==l.__symbolic){var _=l.line,S=l.character,x=l.fileName;null!=x&&null!=_&&null!=S&&(E={fileName:x,line:_,column:S})}o.error({message:sd,context:e,value:i,position:E},t)}(T,l(T),V,f.expression)}return ed;case"error":var q=f.message;return o.error(null!=f.line?{message:q,context:f.context,value:f,position:{fileName:f.fileName,line:f.line,column:f.character}}:{message:q,context:f.context},t),ed;case"ignore":return f}return null}return function W(e,t){if(!e)return{};var n={};return Object.keys(e).forEach((function(r){var i=t(e[r],r);nd(i)||(Zf.test(r)?Object.defineProperty(n,r,{enumerable:!1,configurable:!0,value:i}):n[r]=i)})),n}(f,(function(i,s){if(td.has(s)){if("useValue"===s&&"provide"in f){var a=n(f.provide);if(a===o.ROUTES||a==o.ANALYZE_FOR_ENTRY_COMPONENTS)return n(i)}return function u(n){return e(t,n,r,p+1)}(i)}return n(i)}))}return ed}(n)}(e,t,0,n?1:0)}catch(t){if(!this.errorRecorder)throw ld(t,e);this.reportError(t,e)}if(!nd(r))return r},t.prototype.getTypeMetadata=function(e){var t=this.symbolResolver.resolveSymbol(e);return t&&t.metadata?t.metadata:{__symbolic:"class"}},t.prototype.reportError=function(e,t,n){if(!this.errorRecorder)throw e;this.errorRecorder(ld(e,t),t&&t.filePath||n)},t.prototype.error=function(e,t){this.reportError(id(e.message,e.summary,e.advise,e.position,e.symbol,e.context,e.chain),t)},t}();function id(e,t,n,r,i,o,s){var a=mn(e);return a.ngMetadataError=!0,n&&(a.advise=n),r&&(a.position=r),t&&(a.summary=t),o&&(a.context=o),s&&(a.chain=s),i&&(a.symbol=i),a}function od(e){return!!e.ngMetadataError}var sd="Function call not supported";function ad(e){return null===e||"function"!=typeof e&&"object"!=typeof e}var ud=function(){function e(){}return e.build=function(){var t=new Map;return{define:function(e,n){return t.set(e,n),this},done:function(){return t.size>0?new pd(t):e.empty}}},e}();ud.missing={},ud.empty={resolve:function(e){return ud.missing}};var pd=function(e){function t(t){var n=e.call(this)||this;return n.bindings=t,n}return r(t,e),t.prototype.resolve=function(e){return this.bindings.has(e)?this.bindings.get(e):ud.missing},t}(ud);function ld(e,t){return od(e)?Yf(function e(t,n){var r=function i(e,t){switch(e){case"Reference to non-exported class":if(t&&t.className)return"References to a non-exported class are not supported in decorators but "+t.className+" was referenced.";break;case"Variable not initialized":return"Only initialized variables and constants can be referenced in decorators because the value of this variable is needed by the template compiler";case"Destructuring not supported":return"Referencing an exported destructured variable or constant is not supported in decorators and this value is needed by the template compiler";case"Could not resolve type":if(t&&t.typeName)return"Could not resolve type "+t.typeName;break;case sd:return t&&t.name?"Function calls are not supported in decorators but '"+t.name+"' was called":"Function calls are not supported in decorators";case"Reference to a local symbol":if(t&&t.name)return"Reference to a local (non-exported) symbols are not supported in decorators but '"+t.name+"' was referenced";break;case"Lambda not supported":return"Function expressions are not supported in decorators"}return e}(t.message,t.context)+(t.symbol?" in '"+t.symbol.name+"'":""),o=t.position,s=t.next?e(t.next,n):n?{message:n}:void 0;return{message:r,position:o,next:s?[s]:void 0}}({message:"Error during template compile of '"+t.name+"'",position:e.position,next:{message:e.message,next:e.chain,context:e.context,symbol:e.symbol}},e.advise||function n(e,t){switch(e){case"Reference to non-exported class":if(t&&t.className)return"Consider exporting '"+t.className+"'";break;case"Destructuring not supported":return"Consider simplifying to avoid destructuring";case"Reference to a local symbol":if(t&&t.name)return"Consider exporting '"+t.name+"'";break;case"Lambda not supported":return"Consider changing the function expression into an exported function"}}(e.message,e.context))):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 cd=function(){function e(e,t){this.host=e,this.staticSymbolCache=t,this.summaryCache=new Map,this.loadedFilePaths=new Map,this.importAs=new Map,this.knownFileNameToModuleNames=new Map}return e.prototype.isLibraryFile=function(e){return!this.host.isSourceFile(Ih(e))},e.prototype.toSummaryFileName=function(e,t){return this.host.toSummaryFileName(e,t)},e.prototype.fromSummaryFileName=function(e,t){return this.host.fromSummaryFileName(e,t)},e.prototype.resolveSummary=function(e){var t=e.members.length?this.staticSymbolCache.get(e.filePath,e.name):e,n=this.summaryCache.get(t);return n||(this._loadSummaryFile(e.filePath),n=this.summaryCache.get(e)),t===e&&n||null},e.prototype.getSymbolsOf=function(e){return this._loadSummaryFile(e)?Array.from(this.summaryCache.keys()).filter((function(t){return t.filePath===e})):null},e.prototype.getImportAs=function(e){return e.assertNoMembers(),this.importAs.get(e)},e.prototype.getKnownModuleName=function(e){return this.knownFileNameToModuleNames.get(e)||null},e.prototype.addSummary=function(e){this.summaryCache.set(e.symbol,e)},e.prototype._loadSummaryFile=function(e){var t=this,n=this.loadedFilePaths.get(e);if(null!=n)return n;var r=null;if(this.isLibraryFile(e)){var i=Rh(e);try{r=this.host.loadSummary(i)}catch(e){throw console.error("Error loading summary file "+i),e}}if(this.loadedFilePaths.set(e,n=null!=r),r){var o=function s(e,t,n,r){return new Bf(e,t).deserialize(n,r)}(this.staticSymbolCache,this,e,r),a=o.moduleName,u=o.importAs;o.summaries.forEach((function(e){return t.summaryCache.set(e.symbol,e)})),a&&this.knownFileNameToModuleNames.set(e,a),u.forEach((function(e){t.importAs.set(e.symbol,e.importAs)}))}return n},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
     */function hd(e){return{resolve:function(t,n){var r=e.resourceNameToFileName(n,t);if(!r)throw mn("Couldn't resolve resource "+n+" from "+t);return r}}}var fd=function fd(){},dd=function(){function e(){this._summaries=new Map}return e.prototype.isLibraryFile=function(){return!1},e.prototype.toSummaryFileName=function(e){return e},e.prototype.fromSummaryFileName=function(e){return e},e.prototype.resolveSummary=function(e){return this._summaries.get(e)||null},e.prototype.getSymbolsOf=function(){return[]},e.prototype.getImportAs=function(e){return e},e.prototype.getKnownModuleName=function(e){return null},e.prototype.addSummary=function(e){this._summaries.set(e.symbol,e)},e}();function vd(e,t,n,r,i){for(var o=r.createChildWihtLocalVars(),s=0;s<e.length;s++)o.vars.set(e[s],t[s]);var a=i.visitAllStatements(n,o);return a?a.value:null}var md=function(){function e(e,t,n,r){this.parent=e,this.instance=t,this.className=n,this.vars=r,this.exports=[]}return e.prototype.createChildWihtLocalVars=function(){return new e(this,this.instance,this.className,new Map)},e}(),yd=function yd(e){this.value=e},gd=function(){function t(e){this.reflector=e}return t.prototype.debugAst=function(e){return nf(e)},t.prototype.visitDeclareVarStmt=function(t,n){var r=t.value?t.value.visitExpression(this,n):void 0;return n.vars.set(t.name,r),t.hasModifier(e.StmtModifier.Exported)&&n.exports.push(t.name),null},t.prototype.visitWriteVarExpr=function(e,t){for(var n=e.value.visitExpression(this,t),r=t;null!=r;){if(r.vars.has(e.name))return r.vars.set(e.name,n),n;r=r.parent}throw new Error("Not declared variable "+e.name)},t.prototype.visitWrappedNodeExpr=function(e,t){throw new Error("Cannot interpret a WrappedNodeExpr.")},t.prototype.visitTypeofExpr=function(e,t){throw new Error("Cannot interpret a TypeofExpr")},t.prototype.visitReadVarExpr=function(t,n){var r=t.name;if(null!=t.builtin)switch(t.builtin){case e.BuiltinVar.Super:return Object.getPrototypeOf(n.instance);case e.BuiltinVar.This:return n.instance;case e.BuiltinVar.CatchError:r=_d;break;case e.BuiltinVar.CatchStack:r=Sd;break;default:throw new Error("Unknown builtin variable "+t.builtin)}for(var i=n;null!=i;){if(i.vars.has(r))return i.vars.get(r);i=i.parent}throw new Error("Not declared variable "+r)},t.prototype.visitWriteKeyExpr=function(e,t){var n=e.receiver.visitExpression(this,t),r=e.index.visitExpression(this,t),i=e.value.visitExpression(this,t);return n[r]=i,i},t.prototype.visitWritePropExpr=function(e,t){var n=e.receiver.visitExpression(this,t),r=e.value.visitExpression(this,t);return n[e.name]=r,r},t.prototype.visitInvokeMethodExpr=function(t,n){var r,i=t.receiver.visitExpression(this,n),o=this.visitAllExpressions(t.args,n);if(null!=t.builtin)switch(t.builtin){case e.BuiltinMethod.ConcatArray:r=i.concat.apply(i,s(o));break;case e.BuiltinMethod.SubscribeObservable:r=i.subscribe({next:o[0]});break;case e.BuiltinMethod.Bind:r=i.bind.apply(i,s(o));break;default:throw new Error("Unknown builtin method "+t.builtin)}else r=i[t.name].apply(i,o);return r},t.prototype.visitInvokeFunctionExpr=function(t,n){var r=this.visitAllExpressions(t.args,n),i=t.fn;return i instanceof Se&&i.builtin===e.BuiltinVar.Super?(n.instance.constructor.prototype.constructor.apply(n.instance,r),null):t.fn.visitExpression(this,n).apply(null,r)},t.prototype.visitTaggedTemplateExpr=function(e,t){var n=e.template.elements.map((function(e){return e.text}));Object.defineProperty(n,"raw",{value:e.template.elements.map((function(e){return e.rawText}))});var r=this.visitAllExpressions(e.template.expressions,t);return r.unshift(n),e.tag.visitExpression(this,t).apply(null,r)},t.prototype.visitReturnStmt=function(e,t){return new yd(e.value.visitExpression(this,t))},t.prototype.visitDeclareClassStmt=function(t,n){var r=function i(e,t,n){var r={};e.getters.forEach((function(i){r[i.name]={configurable:!1,get:function(){var r=new md(t,this,e.name,t.vars);return vd([],[],i.body,r,n)}}})),e.methods.forEach((function(i){var o=i.params.map((function(e){return e.name}));r[i.name]={writable:!1,configurable:!1,value:function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var a=new md(t,this,e.name,t.vars);return vd(o,r,i.body,a,n)}}}));var i=e.constructorMethod.params.map((function(e){return e.name})),o=function(){for(var r=this,o=[],s=0;s<arguments.length;s++)o[s]=arguments[s];var a=new md(t,this,e.name,t.vars);e.fields.forEach((function(e){r[e.name]=void 0})),vd(i,o,e.constructorMethod.body,a,n)},s=e.parent?e.parent.visitExpression(n,t):Object;return o.prototype=Object.create(s.prototype,r),o}(t,n,this);return n.vars.set(t.name,r),t.hasModifier(e.StmtModifier.Exported)&&n.exports.push(t.name),null},t.prototype.visitExpressionStmt=function(e,t){return e.expr.visitExpression(this,t)},t.prototype.visitIfStmt=function(e,t){return e.condition.visitExpression(this,t)?this.visitAllStatements(e.trueCase,t):null!=e.falseCase?this.visitAllStatements(e.falseCase,t):null},t.prototype.visitTryCatchStmt=function(e,t){try{return this.visitAllStatements(e.bodyStmts,t)}catch(r){var n=t.createChildWihtLocalVars();return n.vars.set(_d,r),n.vars.set(Sd,r.stack),this.visitAllStatements(e.catchStmts,n)}},t.prototype.visitThrowStmt=function(e,t){throw e.error.visitExpression(this,t)},t.prototype.visitInstantiateExpr=function(e,t){var n=this.visitAllExpressions(e.args,t),r=e.classExpr.visitExpression(this,t);return new(r.bind.apply(r,s([void 0],n)))},t.prototype.visitLiteralExpr=function(e,t){return e.value},t.prototype.visitLocalizedString=function(e,t){return null},t.prototype.visitExternalExpr=function(e,t){return this.reflector.resolveExternalReference(e.value)},t.prototype.visitConditionalExpr=function(e,t){return e.condition.visitExpression(this,t)?e.trueCase.visitExpression(this,t):null!=e.falseCase?e.falseCase.visitExpression(this,t):null},t.prototype.visitNotExpr=function(e,t){return!e.condition.visitExpression(this,t)},t.prototype.visitAssertNotNullExpr=function(e,t){return e.condition.visitExpression(this,t)},t.prototype.visitCastExpr=function(e,t){return e.value.visitExpression(this,t)},t.prototype.visitFunctionExpr=function(e,t){return Ed(e.params.map((function(e){return e.name})),e.statements,t,this)},t.prototype.visitDeclareFunctionStmt=function(t,n){var r=t.params.map((function(e){return e.name}));return n.vars.set(t.name,Ed(r,t.statements,n,this)),t.hasModifier(e.StmtModifier.Exported)&&n.exports.push(t.name),null},t.prototype.visitUnaryOperatorExpr=function(t,n){var r=this,i=function(){return t.expr.visitExpression(r,n)};switch(t.operator){case e.UnaryOperator.Plus:return+i();case e.UnaryOperator.Minus:return-i();default:throw new Error("Unknown operator "+t.operator)}},t.prototype.visitBinaryOperatorExpr=function(t,n){var r=this,i=function(){return t.lhs.visitExpression(r,n)},o=function(){return t.rhs.visitExpression(r,n)};switch(t.operator){case e.BinaryOperator.Equals:return i()==o();case e.BinaryOperator.Identical:return i()===o();case e.BinaryOperator.NotEquals:return i()!=o();case e.BinaryOperator.NotIdentical:return i()!==o();case e.BinaryOperator.And:return i()&&o();case e.BinaryOperator.Or:return i()||o();case e.BinaryOperator.Plus:return i()+o();case e.BinaryOperator.Minus:return i()-o();case e.BinaryOperator.Divide:return i()/o();case e.BinaryOperator.Multiply:return i()*o();case e.BinaryOperator.Modulo:return i()%o();case e.BinaryOperator.Lower:return i()<o();case e.BinaryOperator.LowerEquals:return i()<=o();case e.BinaryOperator.Bigger:return i()>o();case e.BinaryOperator.BiggerEquals:return i()>=o();default:throw new Error("Unknown operator "+t.operator)}},t.prototype.visitReadPropExpr=function(e,t){return e.receiver.visitExpression(this,t)[e.name]},t.prototype.visitReadKeyExpr=function(e,t){return e.receiver.visitExpression(this,t)[e.index.visitExpression(this,t)]},t.prototype.visitLiteralArrayExpr=function(e,t){return this.visitAllExpressions(e.entries,t)},t.prototype.visitLiteralMapExpr=function(e,t){var n=this,r={};return e.entries.forEach((function(e){return r[e.key]=e.value.visitExpression(n,t)})),r},t.prototype.visitCommaExpr=function(e,t){var n=this.visitAllExpressions(e.parts,t);return n[n.length-1]},t.prototype.visitAllExpressions=function(e,t){var n=this;return e.map((function(e){return e.visitExpression(n,t)}))},t.prototype.visitAllStatements=function(e,t){for(var n=0;n<e.length;n++){var r=e[n].visitStatement(this,t);if(r instanceof yd)return r}return null},t}();function Ed(e,t,n,r){return function(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];return vd(e,i,t,n,r)}}var _d="error",Sd="stack",xd=function(){function e(e,t,n,r,i,o,s,a,u,p,l){this._metadataResolver=e,this._templateParser=t,this._styleCompiler=n,this._viewCompiler=r,this._ngModuleCompiler=i,this._summaryResolver=o,this._reflector=s,this._jitEvaluator=a,this._compilerConfig=u,this._console=p,this.getExtraNgModuleProviders=l,this._compiledTemplateCache=new Map,this._compiledHostTemplateCache=new Map,this._compiledDirectiveWrapperCache=new Map,this._compiledNgModuleCache=new Map,this._sharedStylesheetCount=0,this._addedAotSummaries=new Set}return e.prototype.compileModuleSync=function(e){return hn(this._compileModuleAndComponents(e,!0))},e.prototype.compileModuleAsync=function(e){return Promise.resolve(this._compileModuleAndComponents(e,!1))},e.prototype.compileModuleAndAllComponentsSync=function(e){return hn(this._compileModuleAndAllComponents(e,!0))},e.prototype.compileModuleAndAllComponentsAsync=function(e){return Promise.resolve(this._compileModuleAndAllComponents(e,!1))},e.prototype.getComponentFactory=function(e){return this._metadataResolver.getDirectiveSummary(e).componentFactory},e.prototype.loadAotSummaries=function(e){this.clearCache(),this._addAotSummaries(e)},e.prototype._addAotSummaries=function(e){if(!this._addedAotSummaries.has(e)){this._addedAotSummaries.add(e);for(var t=e(),n=0;n<t.length;n++){var r=t[n];"function"==typeof r?this._addAotSummaries(r):this._summaryResolver.addSummary({symbol:r.type.reference,metadata:null,type:r})}}},e.prototype.hasAotSummary=function(e){return!!this._summaryResolver.resolveSummary(e)},e.prototype._filterJitIdentifiers=function(e){var t=this;return e.map((function(e){return e.reference})).filter((function(e){return!t.hasAotSummary(e)}))},e.prototype._compileModuleAndComponents=function(e,t){var n=this;return fn(this._loadModules(e,t),(function(){return n._compileComponents(e,null),n._compileModule(e)}))},e.prototype._compileModuleAndAllComponents=function(e,t){var n=this;return fn(this._loadModules(e,t),(function(){var t=[];return n._compileComponents(e,t),{ngModuleFactory:n._compileModule(e),componentFactories:t}}))},e.prototype._loadModules=function(e,t){var n=this,r=[],i=this._metadataResolver.getNgModuleMetadata(e);return this._filterJitIdentifiers(i.transitiveModule.modules).forEach((function(e){var i=n._metadataResolver.getNgModuleMetadata(e);n._filterJitIdentifiers(i.declaredDirectives).forEach((function(e){var o=n._metadataResolver.loadDirectiveMetadata(i.type.reference,e,t);o&&r.push(o)})),n._filterJitIdentifiers(i.declaredPipes).forEach((function(e){return n._metadataResolver.getOrLoadPipeMetadata(e)}))})),dn(r)},e.prototype._compileModule=function(e){var t=this._compiledNgModuleCache.get(e);if(!t){var n=this._metadataResolver.getNgModuleMetadata(e),r=this.getExtraNgModuleProviders(n.type.reference),i=bd(),o=this._ngModuleCompiler.compile(i,n,r);t=this._interpretOrJit(er(n),i.statements)[o.ngModuleFactoryVar],this._compiledNgModuleCache.set(n.type.reference,t)}return t},e.prototype._compileComponents=function(e,t){var n=this,r=this._metadataResolver.getNgModuleMetadata(e),i=new Map,o=new Set,s=this._filterJitIdentifiers(r.transitiveModule.modules);s.forEach((function(e){var r=n._metadataResolver.getNgModuleMetadata(e);n._filterJitIdentifiers(r.declaredDirectives).forEach((function(e){i.set(e,r);var s=n._metadataResolver.getDirectiveMetadata(e);if(s.isComponent&&(o.add(n._createCompiledTemplate(s,r)),t)){var a=n._createCompiledHostTemplate(s.type.reference,r);o.add(a),t.push(s.componentFactory)}}))})),s.forEach((function(e){var t=n._metadataResolver.getNgModuleMetadata(e);n._filterJitIdentifiers(t.declaredDirectives).forEach((function(e){var t=n._metadataResolver.getDirectiveMetadata(e);t.isComponent&&t.entryComponents.forEach((function(e){var t=i.get(e.componentType);o.add(n._createCompiledHostTemplate(e.componentType,t))}))})),t.entryComponents.forEach((function(e){if(!n.hasAotSummary(e.componentType)){var t=i.get(e.componentType);o.add(n._createCompiledHostTemplate(e.componentType,t))}}))})),o.forEach((function(e){return n._compileTemplate(e)}))},e.prototype.clearCacheFor=function(e){this._compiledNgModuleCache.delete(e),this._metadataResolver.clearCacheFor(e),this._compiledHostTemplateCache.delete(e),this._compiledTemplateCache.get(e)&&this._compiledTemplateCache.delete(e)},e.prototype.clearCache=function(){this._metadataResolver.clearCache(),this._compiledTemplateCache.clear(),this._compiledHostTemplateCache.clear(),this._compiledNgModuleCache.clear()},e.prototype._createCompiledHostTemplate=function(e,t){if(!t)throw new Error("Component "+Sn(e)+" is not part of any NgModule or the module has not been imported into your module.");var n=this._compiledHostTemplateCache.get(e);if(!n){var r=this._metadataResolver.getDirectiveMetadata(e);Cd(r);var i=this._metadataResolver.getHostComponentMetadata(r,r.componentFactory.viewDefFactory);n=new wd(!0,r.type,i,t,[r.type]),this._compiledHostTemplateCache.set(e,n)}return n},e.prototype._createCompiledTemplate=function(e,t){var n=this._compiledTemplateCache.get(e.type.reference);return n||(Cd(e),n=new wd(!1,e.type,e,t,t.transitiveModule.directives),this._compiledTemplateCache.set(e.type.reference,n)),n},e.prototype._compileTemplate=function(e){var t=this;if(!e.isCompiled){var n=e.compMeta,r=new Map,i=bd(),o=this._styleCompiler.compileComponent(i,n);n.template.externalStylesheets.forEach((function(e){var i=t._styleCompiler.compileStyles(bd(),n,e);r.set(e.moduleUrl,i)})),this._resolveStylesCompileResult(o,r),e.ngModule.transitiveModule.pipes.map((function(e){return t._metadataResolver.getPipeSummary(e.reference)}));var s=this._parseTemplate(n,e.ngModule,e.directives),a=s.pipes,u=this._viewCompiler.compileComponent(i,n,s.template,It(o.stylesVar),a),p=this._interpretOrJit(tr(e.ngModule.type,e.compMeta),i.statements);e.compiled(p[u.viewClassVar],p[u.rendererTypeVar])}},e.prototype._parseTemplate=function(e,t,n){var r=this,i=e.template.preserveWhitespaces,o=n.map((function(e){return r._metadataResolver.getDirectiveSummary(e.reference)})),s=t.transitiveModule.pipes.map((function(e){return r._metadataResolver.getPipeSummary(e.reference)}));return this._templateParser.parse(e,e.template.htmlAst,o,s,t.schemas,Jn(t.type,e,e.template),i)},e.prototype._resolveStylesCompileResult=function(e,t){var n=this;e.dependencies.forEach((function(e,r){var i=t.get(e.moduleUrl),o=n._resolveAndEvalStylesCompileResult(i,t);e.setValue(o)}))},e.prototype._resolveAndEvalStylesCompileResult=function(e,t){return this._resolveStylesCompileResult(e,t),this._interpretOrJit(Zn(e.meta,this._sharedStylesheetCount++),e.outputCtx.statements)[e.stylesVar]},e.prototype._interpretOrJit=function(e,t){return this._compilerConfig.useJit?this._jitEvaluator.evaluateStatements(e,t,this._reflector,this._compilerConfig.jitDevMode):function n(e,t){var n=new md(null,null,null,new Map);new gd(t).visitAllStatements(e,n);var r={};return n.exports.forEach((function(e){r[e]=n.vars.get(e)})),r}(t,this._reflector)},e}(),wd=function(){function e(e,t,n,r,i){this.isHost=e,this.compType=t,this.compMeta=n,this.ngModule=r,this.directives=i,this._viewClass=null,this.isCompiled=!1}return e.prototype.compiled=function(e,t){for(var n in this._viewClass=e,this.compMeta.componentViewType.setDelegate(e),t)this.compMeta.rendererType[n]=t[n];this.isCompiled=!0},e}();function Cd(e){if(!e.isComponent)throw new Error("Could not compile '"+On(e.type)+"' because it is not a component.")}function bd(){return{statements:[],genFilePath:"",importExpr:function(e){return kt({name:On(e),moduleName:null,runtime:e})},constantPool:new Qt}}
/**
     * @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 Td,Md=function Md(){},Pd=function(){function e(e){void 0===e&&(e=null),this._packagePrefix=e}return e.prototype.resolve=function(e,t){var n=t;null!=e&&e.length>0&&(n=function r(e,t){var n=Ad(encodeURI(t)),r=Ad(e);if(null!=n[Td.Scheme])return Id(n);n[Td.Scheme]=r[Td.Scheme];for(var i=Td.Scheme;i<=Td.Port;i++)null==n[i]&&(n[i]=r[i]);if("/"==n[Td.Path][0])return Id(n);var o=r[Td.Path];null==o&&(o="/");var s=o.lastIndexOf("/");return o=o.substring(0,s+1)+n[Td.Path],n[Td.Path]=o,Id(n)}(e,n));var i=Ad(n),o=this._packagePrefix;if(null!=o&&null!=i&&"package"==i[Td.Scheme]){var s=i[Td.Path];return(o=o.replace(/\/+$/,""))+"/"+s.replace(/^\/+/,"")}return n},e}(),Nd=new RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\w\\d\\-\\u0100-\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$");
/**
     * @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 Ad(e){return e.match(Nd)}function Id(e){var t=e[Td.Path];return t=null==t?"":function n(e){if("/"==e)return"/";for(var t="/"==e[0]?"/":"",n="/"===e[e.length-1]?"/":"",r=e.split("/"),i=[],o=0,s=0;s<r.length;s++){var a=r[s];switch(a){case"":case".":break;case"..":i.length>0?i.pop():o++;break;default:i.push(a)}}if(""==t){for(;o-- >0;)i.unshift("..");0===i.length&&i.push(".")}return t+i.join("/")+n}(t),e[Td.Path]=t,function r(e,t,n,i,o,s,a){var u=[];return null!=e&&u.push(e+":"),null!=n&&(u.push("//"),null!=t&&u.push(t+"@"),u.push(n),null!=i&&u.push(":"+i)),null!=o&&u.push(o),null!=s&&u.push("?"+s),null!=a&&u.push("#"+a),u.join("")}(e[Td.Scheme],e[Td.UserInfo],e[Td.Domain],e[Td.Port],t,e[Td.QueryData],e[Td.Fragment])}!function(e){e[e.Scheme=1]="Scheme",e[e.UserInfo=2]="UserInfo",e[e.Domain=3]="Domain",e[e.Port=4]="Port",e[e.Path=5]="Path",e[e.QueryData=6]="QueryData",e[e.Fragment=7]="Fragment"}(Td||(Td={}));var kd=function(){function e(e,t,n,r){this.host=e,this.staticSymbolResolver=t,this.messageBundle=n,this.metadataResolver=r}return e.prototype.extract=function(e){var t=this,n=zf(e,this.host,this.staticSymbolResolver,this.metadataResolver),r=n.files;return Promise.all(n.ngModules.map((function(e){return t.metadataResolver.loadNgModuleDirectiveAndPipeMetadata(e.type.reference,!1)}))).then((function(){var e=[];if(r.forEach((function(n){var r=[];n.directives.forEach((function(e){var n=t.metadataResolver.getDirectiveMetadata(e);n&&n.isComponent&&r.push(n)})),r.forEach((function(n){var r=n.template.template,i=n.template.templateUrl,o=mo.fromArray(n.template.interpolation);e.push.apply(e,s(t.messageBundle.updateFromTemplate(r,i,o)))}))})),e.length)throw new Error(e.map((function(e){return e.toString()})).join("\n"));return t.messageBundle}))},e.create=function(t,n){var r=new iu,i=hd(t),o=new rn,s=new cd(t,o),a=new kf(t,o,s),u=new rd(s,a),p=new zc({defaultEncapsulation:g.Emulated,useJit:!1}),l=new Qc({get:function(e){return t.loadResource(e)}},i,r,p),c=new Zp,h=new Uh(p,r,new tf(u),new $c(u),new sf(u),s,c,l,console,o,u),f=new Cf(r,[],{},n);return{extractor:new e(t,a,f,h),staticReflector:u}},e}(),Od=function(){function e(e){this.directiveMatcher=e}return e.prototype.bind=function(e){if(!e.template)throw new Error("Binding without a template not yet supported");var t=Rd.apply(e.template),n=function r(e){var t,n,r,a,u=new Map;function p(e){if(u.has(e.template))return u.get(e.template);var t,n=e.namedEntities;return t=null!==e.parentScope?new Map(s(p(e.parentScope),n)):new Map(n),u.set(e.template,t),t}for(var l=[e];l.length>0;){var c=l.pop();try{for(var h=(t=void 0,i(c.childScopes.values())),f=h.next();!f.done;f=h.next())l.push(f.value)}catch(e){t={error:e}}finally{try{f&&!f.done&&(n=h.return)&&n.call(h)}finally{if(t)throw t.error}}p(c)}var d=new Map;try{for(var v=i(u),m=v.next();!m.done;m=v.next()){var y=o(m.value,2);d.set(y[0],new Set(y[1].values()))}}catch(e){r={error:e}}finally{try{m&&!m.done&&(a=v.return)&&a.call(v)}finally{if(r)throw r.error}}return d}
/**
     * @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
     */(t),a=Dd.apply(e.template,this.directiveMatcher),u=a.directives,p=a.bindings,l=a.references,c=Fd.apply(e.template,t);return new Ld(e,u,p,l,c.expressions,c.symbols,c.nestingLevel,n,c.usedPipes)},e}(),Rd=function(){function e(e,t){this.parentScope=e,this.template=t,this.namedEntities=new Map,this.childScopes=new Map}return e.newRootScope=function(){return new e(null,null)},e.apply=function(t){var n=e.newRootScope();return n.ingest(t),n},e.prototype.ingest=function(e){var t=this;e instanceof Nr?(e.variables.forEach((function(e){return t.visitVariable(e)})),e.children.forEach((function(e){return e.visit(t)}))):e.forEach((function(e){return e.visit(t)}))},e.prototype.visitElement=function(e){var t=this;e.references.forEach((function(e){return t.visitReference(e)})),e.children.forEach((function(e){return e.visit(t)}))},e.prototype.visitTemplate=function(t){var n=this;t.references.forEach((function(e){return n.visitReference(e)}));var r=new e(this,t);r.ingest(t),this.childScopes.set(t,r)},e.prototype.visitVariable=function(e){this.maybeDeclare(e)},e.prototype.visitReference=function(e){this.maybeDeclare(e)},e.prototype.visitContent=function(e){},e.prototype.visitBoundAttribute=function(e){},e.prototype.visitBoundEvent=function(e){},e.prototype.visitBoundText=function(e){},e.prototype.visitText=function(e){},e.prototype.visitTextAttribute=function(e){},e.prototype.visitIcu=function(e){},e.prototype.maybeDeclare=function(e){this.namedEntities.has(e.name)||this.namedEntities.set(e.name,e)},e.prototype.lookup=function(e){return this.namedEntities.has(e)?this.namedEntities.get(e):null!==this.parentScope?this.parentScope.lookup(e):null},e.prototype.getChildScope=function(e){var t=this.childScopes.get(e);if(void 0===t)throw new Error("Assertion error: child scope for "+e+" not found");return t},e}(),Dd=function(){function e(e,t,n,r){this.matcher=e,this.directives=t,this.bindings=n,this.references=r}return e.apply=function(t,n){var r=new Map,i=new Map,o=new Map;return new e(n,r,i,o).ingest(t),{directives:r,bindings:i,references:o}},e.prototype.ingest=function(e){var t=this;e.forEach((function(e){return e.visit(t)}))},e.prototype.visitElement=function(e){this.visitElementOrTemplate(e.name,e)},e.prototype.visitTemplate=function(e){this.visitElementOrTemplate("ng-template",e)},e.prototype.visitElementOrTemplate=function(e,t){var n=this,r=Xl(e,ro(t)),i=[];this.matcher.match(r,(function(e,t){return i.push(t)})),i.length>0&&this.directives.set(t,i),t.references.forEach((function(e){var r=null;if(""===e.value.trim())r=i.find((function(e){return e.isComponent}))||null;else if(null===(r=i.find((function(t){return null!==t.exportAs&&t.exportAs.some((function(t){return t===e.value}))}))||null))return;n.references.set(e,null!==r?{directive:r,node:t}:t)}));var o=function(e,r){var o=i.find((function(t){return t[r].hasBindingPropertyName(e.name)}));n.bindings.set(e,void 0!==o?o:t)};t.inputs.forEach((function(e){return o(e,"inputs")})),t.attributes.forEach((function(e){return o(e,"inputs")})),t instanceof Nr&&t.templateAttrs.forEach((function(e){return o(e,"inputs")})),t.outputs.forEach((function(e){return o(e,"outputs")})),t.children.forEach((function(e){return e.visit(n)}))},e.prototype.visitContent=function(e){},e.prototype.visitVariable=function(e){},e.prototype.visitReference=function(e){},e.prototype.visitTextAttribute=function(e){},e.prototype.visitBoundAttribute=function(e){},e.prototype.visitBoundEvent=function(e){},e.prototype.visitBoundAttributeOrEvent=function(e){},e.prototype.visitText=function(e){},e.prototype.visitBoundText=function(e){},e.prototype.visitIcu=function(e){},e}(),Fd=function(e){function t(t,n,r,i,o,s,a){var u=e.call(this)||this;return u.bindings=t,u.symbols=n,u.usedPipes=r,u.nestingLevel=i,u.scope=o,u.template=s,u.level=a,u.pipesUsed=[],u.visitNode=function(e){return e.visit(u)},u}return r(t,e),t.prototype.visit=function(e,t){e instanceof Ko?e.visit(this,t):e.visit(this)},t.apply=function(e,n){var r=new Map,i=new Map,o=new Map,s=new Set;return new t(r,i,s,o,n,e instanceof Nr?e:null,0).ingest(e),{expressions:r,symbols:i,nestingLevel:o,usedPipes:s}},t.prototype.ingest=function(e){e instanceof Nr?(e.variables.forEach(this.visitNode),e.children.forEach(this.visitNode),this.nestingLevel.set(e,this.level)):e.forEach(this.visitNode)},t.prototype.visitElement=function(e){e.inputs.forEach(this.visitNode),e.outputs.forEach(this.visitNode),e.children.forEach(this.visitNode)},t.prototype.visitTemplate=function(e){e.inputs.forEach(this.visitNode),e.outputs.forEach(this.visitNode),e.templateAttrs.forEach(this.visitNode),e.references.forEach(this.visitNode);var n=this.scope.getChildScope(e);new t(this.bindings,this.symbols,this.usedPipes,this.nestingLevel,n,e,this.level+1).ingest(e)},t.prototype.visitVariable=function(e){null!==this.template&&this.symbols.set(e,this.template)},t.prototype.visitReference=function(e){null!==this.template&&this.symbols.set(e,this.template)},t.prototype.visitText=function(e){},t.prototype.visitContent=function(e){},t.prototype.visitTextAttribute=function(e){},t.prototype.visitIcu=function(e){var t=this;Object.keys(e.vars).forEach((function(n){return e.vars[n].visit(t)})),Object.keys(e.placeholders).forEach((function(n){return e.placeholders[n].visit(t)}))},t.prototype.visitBoundAttribute=function(e){e.value.visit(this)},t.prototype.visitBoundEvent=function(e){e.handler.visit(this)},t.prototype.visitBoundText=function(e){e.value.visit(this)},t.prototype.visitPipe=function(t,n){return this.usedPipes.add(t.name),e.prototype.visitPipe.call(this,t,n)},t.prototype.visitPropertyRead=function(t,n){return this.maybeMap(n,t,t.name),e.prototype.visitPropertyRead.call(this,t,n)},t.prototype.visitSafePropertyRead=function(t,n){return this.maybeMap(n,t,t.name),e.prototype.visitSafePropertyRead.call(this,t,n)},t.prototype.visitPropertyWrite=function(t,n){return this.maybeMap(n,t,t.name),e.prototype.visitPropertyWrite.call(this,t,n)},t.prototype.visitMethodCall=function(t,n){return this.maybeMap(n,t,t.name),e.prototype.visitMethodCall.call(this,t,n)},t.prototype.visitSafeMethodCall=function(t,n){return this.maybeMap(n,t,t.name),e.prototype.visitSafeMethodCall.call(this,t,n)},t.prototype.maybeMap=function(e,t,n){if(t.receiver instanceof $o){var r=this.scope.lookup(n);null!==r&&this.bindings.set(t,r)}},t}(Ss),Ld=function(){function e(e,t,n,r,i,o,s,a,u){this.target=e,this.directives=t,this.bindings=n,this.references=r,this.exprTargets=i,this.symbols=o,this.nestingLevel=s,this.templateEntities=a,this.usedPipes=u}return e.prototype.getEntitiesInTemplateScope=function(e){var t;return null!==(t=this.templateEntities.get(e))&&void 0!==t?t:new Set},e.prototype.getDirectivesOfNode=function(e){return this.directives.get(e)||null},e.prototype.getReferenceTarget=function(e){return this.references.get(e)||null},e.prototype.getConsumerOfBinding=function(e){return this.bindings.get(e)||null},e.prototype.getExpressionTarget=function(e){return this.exprTargets.get(e)||null},e.prototype.getTemplateOfSymbol=function(e){return this.symbols.get(e)||null},e.prototype.getNestingLevel=function(e){return this.nestingLevel.get(e)||0},e.prototype.getUsedDirectives=function(){var e=new Set;return this.directives.forEach((function(t){return t.forEach((function(t){return e.add(t)}))})),Array.from(e.values())},e.prototype.getUsedPipes=function(){return Array.from(this.usedPipes)},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
     */function Bd(e,t){return null===e||0===e.length?null:Ft(e.map((function(e){return t(e)})))}function Vd(e,t){var n=Object.keys(e).map((function(n){return{key:n,value:t(e[n]),quoted:!0}}));return n.length>0?Lt(n):null}
/**
     * @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 jd(e){var t=new no;return t.set("version",Ut("11.2.14")),t.set("type",e.internalType),null!==e.selector&&t.set("selector",Ut(e.selector)),t.set("inputs",$i(e.inputs,!0)),t.set("outputs",$i(e.outputs)),t.set("host",function n(e){var t=new no;return t.set("attributes",Vd(e.attributes,(function(e){return e}))),t.set("listeners",Vd(e.listeners,Ut)),t.set("properties",Vd(e.properties,Ut)),e.specialAttributes.styleAttr&&t.set("styleAttribute",Ut(e.specialAttributes.styleAttr)),e.specialAttributes.classAttr&&t.set("classAttribute",Ut(e.specialAttributes.classAttr)),t.values.length>0?t.toLiteralMap():null}(e.host)),t.set("providers",e.providers),e.queries.length>0&&t.set("queries",Ft(e.queries.map(Ud))),e.viewQueries.length>0&&t.set("viewQueries",Ft(e.viewQueries.map(Ud))),null!==e.exportAs&&t.set("exportAs",Gi(e.exportAs)),e.usesInheritance&&t.set("usesInheritance",Ut(!0)),e.lifecycle.usesOnChanges&&t.set("usesOnChanges",Ut(!0)),t.set("ngImport",kt(rr.core)),t}function Ud(e){var t=new no;return t.set("propertyName",Ut(e.propertyName)),e.first&&t.set("first",Ut(!0)),t.set("predicate",Array.isArray(e.predicate)?Gi(e.predicate):e.predicate),e.emitDistinctChangesOnly||t.set("emitDistinctChangesOnly",Ut(!1)),e.descendants&&t.set("descendants",Ut(!0)),t.set("read",e.read),e.static&&t.set("static",Ut(!0)),t.toLiteralMap()}function Hd(e){return kt(rr.forwardRef).callFn([Bt([],[new ft(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
     */
qc(Mn),
/**
     * @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.AST=Ko,e.ASTWithName=Qo,e.ASTWithSource=gs,e.AbsoluteSourceSpan=ys,e.AotCompiler=jf,e.AotSummaryResolver=cd,e.ArrayType=ae,e.AssertNotNull=Qe,e.AstMemoryEfficientTransformer=ws,e.AstPath=Ta,e.AstTransformer=xs,e.AttrAst=Eu,e.Attribute=Aa,e.Binary=ls,e.BinaryOperatorExpr=Je,e.BindingPipe=os,e.BoundDirectivePropertyAst=Mu,e.BoundElementProperty=Ps,e.BoundElementPropertyAst=Su,e.BoundEventAst=xu,e.BoundTextAst=gu,e.BuiltinType=oe,e.CONTENT_ATTR="_ngcontent-%COMP%",e.CUSTOM_ELEMENTS_SCHEMA=q,e.CastExpr=Xe,e.Chain=Jo,e.ClassField=vt,e.ClassMethod=mt,e.ClassStmt=gt,e.CommaExpr=it,e.Comment=ka,e.CompileDirectiveMetadata=qn,e.CompileMetadataResolver=Uh,e.CompileNgModuleMetadata=Kn,e.CompilePipeMetadata=Wn,e.CompileReflector=Md,e.CompileShallowModuleMetadata=zn,e.CompileStylesheetMetadata=Un,e.CompileTemplateMetadata=Hn,e.CompiledStylesheet=xa,e.CompilerConfig=zc,e.Conditional=Zo,e.ConditionalExpr=ze,e.ConstantPool=Qt,e.CssSelector=S,e.DEFAULT_INTERPOLATION_CONFIG=yo,e.DYNAMIC_TYPE=pe,e.DeclareFunctionStmt=ct,e.DeclareVarStmt=lt,e.DirectiveAst=Pu,e.DirectiveNormalizer=Qc,e.DirectiveResolver=$c,e.DomElementSchemaRegistry=Zp,e.EOF=Np,e.ERROR_COMPONENT_TYPE="ngComponentType",e.Element=Ia,e.ElementAst=bu,e.ElementSchemaRegistry=Gp,e.EmbeddedTemplateAst=Tu,e.EmitterVisitorContext=hr,e.EmptyExpr=Go,e.Expansion=Pa,e.ExpansionCase=Na,e.Expression=Ee,e.ExpressionBinding=_s,e.ExpressionStatement=ht,e.ExpressionType=se,e.ExternalExpr=qe,e.ExternalReference=We,e.Extractor=kd,e.FunctionCall=ms,e.FunctionExpr=$e,e.GeneratedFile=Tf,e.HOST_ATTR="_nghost-%COMP%",e.HtmlParser=iu,e.HtmlTagDefinition=m,e.I18NHtmlParser=Sh,e.Identifiers=Jt,e.IfStmt=Et,e.ImplicitReceiver=$o,e.InstantiateExpr=Ie,e.Interpolation=ps,e.InterpolationConfig=mo,e.InvokeFunctionExpr=Ne,e.InvokeMethodExpr=Pe,e.IvyParser=Up,e.JSDocComment=ut,e.JitCompiler=xd,e.JitEvaluator=xo,e.JitSummaryResolver=dd,e.KeyedRead=rs,e.KeyedWrite=is,e.LeadingComment=at,e.Lexer=bp,e.LiteralArray=as,e.LiteralArrayExpr=tt,e.LiteralExpr=ke,e.LiteralMap=us,e.LiteralMapExpr=rt,e.LiteralPrimitive=ss,e.LocalizedString=Le,e.MapType=ue,e.MessageBundle=Cf,e.MethodCall=ds,e.NAMED_ENTITIES=v,e.NGSP_UNICODE="",e.NONE_TYPE=de,e.NO_ERRORS_SCHEMA=W,e.NgContentAst=Au,e.NgModuleCompiler=ef,e.NgModuleResolver=tf,e.NodeWithI18n=ba,e.NonNullAssert=fs,e.NotExpr=Ke,e.NullTemplateVisitor=Iu,e.ParseError=Oo,e.ParseLocation=Ao,e.ParseSourceFile=Io,e.ParseSourceSpan=ko,e.ParseSpan=zo,e.ParseTreeResult=eu,e.ParsedEvent=Ts,e.ParsedProperty=Cs,e.ParsedVariable=Ms,e.Parser=jp,e.ParserError=Wo,e.PipeResolver=sf,e.PrefixNot=hs,e.PropertyRead=es,e.PropertyWrite=ts,e.ProviderAst=Nu,e.ProviderMeta=Gn,e.Quote=Xo,e.R3BoundTarget=Ld,e.R3Identifiers=rr,e.R3TargetBinder=Od,e.ReadKeyExpr=et,e.ReadPropExpr=Ze,e.ReadVarExpr=Se,e.RecursiveAstVisitor=Ss,e.RecursiveTemplateAstVisitor=ku,e.RecursiveVisitor=Da,e.ReferenceAst=wu,e.ResolvedStaticSymbol=If,e.ResourceLoader=xc,e.ReturnStatement=ft,e.STRING_TYPE=fe,e.SafeMethodCall=vs,e.SafePropertyRead=ns,e.SelectorContext=C,e.SelectorListContext=w,e.SelectorMatcher=x,e.Serializer=vi,e.SplitInterpolation=Bp,e.Statement=pt,e.StaticReflector=rd,e.StaticSymbol=nn,e.StaticSymbolCache=rn,e.StaticSymbolResolver=kf,e.StyleCompiler=wa,e.StylesCompileDependency=Sa,e.SummaryResolver=fd,e.TaggedTemplateExpr=Ae,e.TemplateBindingParseResult=Vp,e.TemplateLiteral=Oe,e.TemplateLiteralElement=Re,e.TemplateParseError=ip,e.TemplateParseResult=op,e.TemplateParser=sp,e.Text=Ma,e.TextAst=yu,e.ThisReceiver=Yo,e.ThrowStmt=St,e.TmplAstBoundAttribute=Tr,e.TmplAstBoundEvent=Mr,e.TmplAstBoundText=Cr,e.TmplAstContent=Ar,e.TmplAstElement=Pr,e.TmplAstIcu=Or,e.TmplAstRecursiveVisitor=Rr,e.TmplAstReference=kr,e.TmplAstTemplate=Nr,e.TmplAstText=wr,e.TmplAstTextAttribute=br,e.TmplAstVariable=Ir,e.Token=Tp,e.TransitiveCompileNgModuleMetadata=Qn,e.TreeError=Za,e.TryCatchStmt=_t,e.Type=ne,e.TypeScriptEmitter=rf,e.TypeofExpr=xe,e.Unary=cs,e.UnaryOperatorExpr=Ye,e.UrlResolver=Pd,e.VERSION=Wc,e.VariableAst=Cu,e.VariableBinding=Es,e.Version=Cn,e.ViewCompiler=cf,e.WrappedNodeExpr=we,e.WriteKeyExpr=be,e.WritePropExpr=Te,e.WriteVarExpr=Ce,e.Xliff=uh,e.Xliff2=hh,e.Xmb=Ti,e.XmlParser=ah,e.Xtb=mh,e._ParseAST=qp,e.analyzeAndValidateNgModules=zf,e.analyzeFile=Qf,e.analyzeFileForInjectables=Xf,e.analyzeNgModules=Wf,e.collectExternalReferences=function qd(e){var t=new Tt;return t.visitAllStatements(e,null),t.externalReferences},e.compileComponentFromMetadata=uc,e.compileDeclareComponentFromMetadata=function Wd(e,t){var n=function r(e,t){var n=jd(e);return n.set("template",function r(e){if("string"==typeof e.template){if(e.isInline)return Ut(e.template);var t=e.template,n=new Io(t,e.templateUrl),r=new Ao(n,0,0,0),i=function o(e,t){var n=t.length,r=0,i=0,o=0;do{-1!==(r=t.indexOf("\n",i))&&(i=r+1,o++)}while(-1!==r);return new Ao(e,n,o,n-i)}(n,t);return Ut(t,null,new ko(r,i))}return e.template}(t)),t.isInline&&n.set("isInline",Ut(!0)),n.set("styles",Bd(e.styles,Ut)),n.set("directives",function s(e){var t=0!==e.declarationListEmitMode?Hd:function(e){return e};return Bd(e.directives,(function(e){var n=new no;return n.set("type",t(e.type)),n.set("selector",Ut(e.selector)),n.set("inputs",Bd(e.inputs,Ut)),n.set("outputs",Bd(e.outputs,Ut)),n.set("exportAs",Bd(e.exportAs,Ut)),n.toLiteralMap()}))}(e)),n.set("pipes",function a(e){var t,n;if(0===e.pipes.size)return null;var r=0!==e.declarationListEmitMode?Hd:function(e){return e},s=[];try{for(var a=i(e.pipes),u=a.next();!u.done;u=a.next()){var p=o(u.value,2);s.push({key:p[0],value:r(p[1]),quoted:!0})}}catch(e){t={error:e}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return Lt(s)}(e)),n.set("viewProviders",e.viewProviders),n.set("animations",e.animations),void 0!==e.changeDetection&&n.set("changeDetection",kt(rr.ChangeDetectionStrategy).prop(E[e.changeDetection])),e.encapsulation!==g.Emulated&&n.set("encapsulation",kt(rr.ViewEncapsulation).prop(g[e.encapsulation])),e.interpolation!==yo&&n.set("interpolation",Ft([Ut(e.interpolation.start),Ut(e.interpolation.end)])),!0===t.preserveWhitespaces&&n.set("preserveWhitespaces",Ut(!0)),n}(e,t);return{expression:kt(rr.declareComponent).callFn([n.toLiteralMap()]),type:pc(e)}},e.compileDeclareDirectiveFromMetadata=function zd(e){var t=jd(e);return{expression:kt(rr.declareDirective).callFn([t.toLiteralMap()]),type:mc(e)}},e.compileDeclarePipeFromMetadata=function Kd(e){var t=function n(e){var t=new no;return t.set("version",Ut("11.2.14")),t.set("ngImport",kt(rr.core)),t.set("type",e.internalType),t.set("name",Ut(e.pipeName)),!1===e.pure&&t.set("pure",Ut(e.pure)),t}(e);return{expression:kt(rr.declarePipe).callFn([t.toLiteralMap()]),type:Ho(e)}},e.compileDirectiveFromMetadata=ac,e.compileFactoryFunction=so,e.compileInjectable=po,e.compileInjector=Bo,e.compileNgModule=Lo,e.compilePipeFromMetadata=Uo,e.componentFactoryName=Bn,e.computeMsgId=oi,e.core=ee,e.createAotCompiler=function Qd(e,t,n){var r,i=t.translations||"",o=hd(e),s=new rn,a=new cd(e,s),u=new kf(e,s,a),p=new rd(a,u,[],[],n);r=t.enableIvy?new iu:new Sh(new iu,i,t.i18nFormat,t.missingTranslation,console);var l=new zc({defaultEncapsulation:g.Emulated,useJit:!1,missingTranslation:t.missingTranslation,preserveWhitespaces:t.preserveWhitespaces,strictInjectionParameters:t.strictInjectionParameters}),c=new Qc({get:function(t){return e.loadResource(t)}},o,r,l),h=new jp(new bp),f=new Zp,d=new sp(l,p,h,f,r,console,[]),v=new Uh(l,r,new tf(p),new $c(p),new sf(p),a,f,c,console,s,p,n),m=new cf(p),y=new af(t,p);return{compiler:new jf(l,t,e,p,v,d,new wa(o),m,y,new ef(p),new bh(p,!!t.enableIvy),new rf,a,u),reflector:p}},e.createAotUrlResolver=hd,e.createElementCssSelector=hp,e.createLoweredSymbol=function Xd(e){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
     */,e.createOfflineCompileUrlResolver=function Gd(){return new Pd(".")},e.createUrlResolverWithoutPackagePrefix=function $d(){return new Pd},e.debugOutputAstAsTypeScript=nf,e.devOnlyGuardedExpression=function Yd(e){return Sr("ngDevMode",e)},e.findNode=function Jd(e,t){var n=[];return Oa(new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return r(i,e),i.prototype.visit=function(e,r){var i=function e(t){var n=t.sourceSpan.start.offset,r=t.sourceSpan.end.offset;return t instanceof Ia&&(t.endSourceSpan?r=t.endSourceSpan.end.offset:t.children&&t.children.length&&(r=e(t.children[t.children.length-1]).end)),{start:n,end:r}}(e);if(!(i.start<=t&&t<i.end))return!0;n.push(e)},i}(Da)),e),new Ta(n,t)},e.flatten=$n,e.formattedError=Yf,e.getHtmlTagDefinition=y,e.getMissingNgModuleMetadataErrorData=function Zd(e){var t;return null!==(t=e.ngMissingNgModuleMetadataErrorData)&&void 0!==t?t:null},e.getNsPrefix=c,e.getParseErrors=function ev(e){return e[gn]||[]},e.getSafePropertyAccessString=Er,e.getUrlScheme=function tv(e){var t=Ad(e);return t&&t[Td.Scheme]||""},e.hostViewClassName=Ln,e.identifierModuleUrl=Rn,e.identifierName=On,e.isEmptyExpression=yp,e.isFormattedError=function nv(e){return!!e.ngFormattedMessage},e.isIdentifier=kp,e.isLoweredSymbol=Vh,e.isNgContainer=u,e.isNgContent=p,e.isNgTemplate=l,e.isQuote=Dp,e.isSyntaxError=function rv(e){return e[yn]},e.jsDocComment=At,e.leadingComment=function iv(e,t,n){return void 0===t&&(t=!1),void 0===n&&(n=!0),new at(e,t,n)},e.literalMap=Lt,e.makeBindingParser=Jl,e.mergeAnalyzedFiles=Gf,e.mergeNsAndName=h,e.ngModuleJitUrl=er,e.parseHostBindings=_c,e.parseTemplate=$l,e.preserveWhitespacesDefault=Kc,e.publishFacade=qc,e.r3JitTypeSourceSpan=Do,e.removeSummaryDuplicates=mp,e.rendererTypeName=Fn,e.sanitizeIdentifier=An,e.sharedStylesheetJitUrl=Zn,e.splitClasses=lp,e.splitNsName=a,e.syntaxError=mn,e.templateJitUrl=tr,e.templateSourceUrl=Jn,e.templateVisitAll=Ou,e.toTypeScript=function ov(e,t){if(void 0===t&&(t=""),!e.stmts)throw new Error("Illegal state: No stmts present on GeneratedFile "+e.genFileUrl);return(new rf).emitStatements(e.genFileUrl,e.stmts,t)},e.tokenName=Vn,e.tokenReference=jn,e.typeSourceSpan=Ro,e.unescapeIdentifier=Of,e.unwrapResolvedMetadata=Rf,e.verifyHostBindings=Sc,e.viewClassName=Dn,e.visitAll=Oa,Object.defineProperty(e,"__esModule",{value:!0})}));