!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/cdk/text-field"),require("@angular/core"),require("@angular/cdk/coercion"),require("@angular/cdk/platform"),require("@angular/forms"),require("@angular/material/core"),require("@angular/material/form-field"),require("rxjs")):"function"==typeof define&&define.amd?define("@angular/material/input",["exports","@angular/cdk/text-field","@angular/core","@angular/cdk/coercion","@angular/cdk/platform","@angular/forms","@angular/material/core","@angular/material/form-field","rxjs"],t):t(((e=e||self).ng=e.ng||{},e.ng.material=e.ng.material||{},e.ng.material.input={}),e.ng.cdk.textField,e.ng.core,e.ng.cdk.coercion,e.ng.cdk.platform,e.ng.forms,e.ng.material.core,e.ng.material.formField,e.rxjs)}(this,(function(e,t,r,o,n,i,a,s,u){"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 l=function(e,t){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)};function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}l(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return p(t,e),Object.defineProperty(t.prototype,"matAutosizeMinRows",{get:function(){return this.minRows},set:function(e){this.minRows=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"matAutosizeMaxRows",{get:function(){return this.maxRows},set:function(e){this.maxRows=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"matAutosize",{get:function(){return this.enabled},set:function(e){this.enabled=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"matTextareaAutosize",{get:function(){return this.enabled},set:function(e){this.enabled=e},enumerable:!1,configurable:!0}),t}(t.CdkTextareaAutosize);c.decorators=[{type:r.Directive,args:[{selector:"textarea[mat-autosize], textarea[matTextareaAutosize]",exportAs:"matTextareaAutosize",inputs:["cdkAutosizeMinRows","cdkAutosizeMaxRows"],host:{class:"cdk-textarea-autosize mat-autosize",rows:"1"}}]}],c.propDecorators={matAutosizeMinRows:[{type:r.Input}],matAutosizeMaxRows:[{type:r.Input}],matAutosize:[{type:r.Input,args:["mat-autosize"]}],matTextareaAutosize:[{type:r.Input}]};
/**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
var d,f=new r.InjectionToken("MAT_INPUT_VALUE_ACCESSOR"),y=["button","checkbox","file","hidden","image","radio","range","reset","submit"],m=0,h=function(e){function t(t,r,o,i,a,s,l,p,c,d){var f=e.call(this,s,i,a,o)||this;f._elementRef=t,f._platform=r,f.ngControl=o,f._autofillMonitor=p,f._formField=d,f._uid="mat-input-"+m++,f.focused=!1,f.stateChanges=new u.Subject,f.controlType="mat-input",f.autofilled=!1,f._disabled=!1,f._required=!1,f._type="text",f._readonly=!1,f._neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter((function(e){return n.getSupportedInputTypes().has(e)}));var y=f._elementRef.nativeElement,h=y.nodeName.toLowerCase();return f._inputValueAccessor=l||y,f._previousNativeValue=f.value,f.id=f.id,r.IOS&&c.runOutsideAngular((function(){t.nativeElement.addEventListener("keyup",(function(e){var t=e.target;t.value||t.selectionStart||t.selectionEnd||(t.setSelectionRange(1,1),t.setSelectionRange(0,0))}))})),f._isServer=!f._platform.isBrowser,f._isNativeSelect="select"===h,f._isTextarea="textarea"===h,f._isNativeSelect&&(f.controlType=y.multiple?"mat-native-select-multiple":"mat-native-select"),f}return p(t,e),Object.defineProperty(t.prototype,"disabled",{get:function(){return this.ngControl&&null!==this.ngControl.disabled?this.ngControl.disabled:this._disabled},set:function(e){this._disabled=o.coerceBooleanProperty(e),this.focused&&(this.focused=!1,this.stateChanges.next())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},set:function(e){this._id=e||this._uid},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(e){this._required=o.coerceBooleanProperty(e)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"type",{get:function(){return this._type},set:function(e){this._type=e||"text",this._validateType(),!this._isTextarea&&n.getSupportedInputTypes().has(this._type)&&(this._elementRef.nativeElement.type=this._type)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._inputValueAccessor.value},set:function(e){e!==this.value&&(this._inputValueAccessor.value=e,this.stateChanges.next())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"readonly",{get:function(){return this._readonly},set:function(e){this._readonly=o.coerceBooleanProperty(e)},enumerable:!1,configurable:!0}),t.prototype.ngAfterViewInit=function(){var e=this;this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe((function(t){e.autofilled=t.isAutofilled,e.stateChanges.next()}))},t.prototype.ngOnChanges=function(){this.stateChanges.next()},t.prototype.ngOnDestroy=function(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement)},t.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState(),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()},t.prototype.focus=function(e){this._elementRef.nativeElement.focus(e)},t.prototype._focusChanged=function(e){e===this.focused||this.readonly&&e||(this.focused=e,this.stateChanges.next())},t.prototype._onInput=function(){},t.prototype._dirtyCheckPlaceholder=function(){var e,t,r=(null===(t=null===(e=this._formField)||void 0===e?void 0:e._hideControlPlaceholder)||void 0===t?void 0:t.call(e))?null:this.placeholder;if(r!==this._previousPlaceholder){var o=this._elementRef.nativeElement;this._previousPlaceholder=r,r?o.setAttribute("placeholder",r):o.removeAttribute("placeholder")}},t.prototype._dirtyCheckNativeValue=function(){var e=this._elementRef.nativeElement.value;this._previousNativeValue!==e&&(this._previousNativeValue=e,this.stateChanges.next())},t.prototype._validateType=function(){y.indexOf(this._type)},t.prototype._isNeverEmpty=function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1},t.prototype._isBadInput=function(){var e=this._elementRef.nativeElement.validity;return e&&e.badInput},Object.defineProperty(t.prototype,"empty",{get:function(){return!(this._isNeverEmpty()||this._elementRef.nativeElement.value||this._isBadInput()||this.autofilled)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){if(this._isNativeSelect){var e=this._elementRef.nativeElement,t=e.options[0];return this.focused||e.multiple||!this.empty||!!(e.selectedIndex>-1&&t&&t.label)}return this.focused||!this.empty},enumerable:!1,configurable:!0}),t.prototype.setDescribedByIds=function(e){e.length?this._elementRef.nativeElement.setAttribute("aria-describedby",e.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")},t.prototype.onContainerClick=function(){this.focused||this.focus()},t}(a.mixinErrorState((function g(e,t,r,o){this._defaultErrorStateMatcher=e,this._parentForm=t,this._parentFormGroup=r,this.ngControl=o})));h.decorators=[{type:r.Directive,args:[{selector:"input[matInput], textarea[matInput], select[matNativeControl],\n      input[matNativeControl], textarea[matNativeControl]",exportAs:"matInput",host:{class:"mat-input-element mat-form-field-autofill-control","[class.mat-input-server]":"_isServer","[attr.id]":"id","[attr.data-placeholder]":"placeholder","[disabled]":"disabled","[required]":"required","[attr.readonly]":"readonly && !_isNativeSelect || null","[attr.aria-invalid]":"errorState && !empty","[attr.aria-required]":"required"},providers:[{provide:s.MatFormFieldControl,useExisting:h}]}]}],h.ctorParameters=function(){return[{type:r.ElementRef},{type:n.Platform},{type:i.NgControl,decorators:[{type:r.Optional},{type:r.Self}]},{type:i.NgForm,decorators:[{type:r.Optional}]},{type:i.FormGroupDirective,decorators:[{type:r.Optional}]},{type:a.ErrorStateMatcher},{type:void 0,decorators:[{type:r.Optional},{type:r.Self},{type:r.Inject,args:[f]}]},{type:t.AutofillMonitor},{type:r.NgZone},{type:s.MatFormField,decorators:[{type:r.Optional},{type:r.Inject,args:[s.MAT_FORM_FIELD]}]}]},h.propDecorators={disabled:[{type:r.Input}],id:[{type:r.Input}],placeholder:[{type:r.Input}],required:[{type:r.Input}],type:[{type:r.Input}],errorStateMatcher:[{type:r.Input}],userAriaDescribedBy:[{type:r.Input,args:["aria-describedby"]}],value:[{type:r.Input}],readonly:[{type:r.Input}],_focusChanged:[{type:r.HostListener,args:["focus",["true"]]},{type:r.HostListener,args:["blur",["false"]]}],_onInput:[{type:r.HostListener,args:["input"]}]},(d=function d(){}).decorators=[{type:r.NgModule,args:[{declarations:[h,c],imports:[t.TextFieldModule,s.MatFormFieldModule,a.MatCommonModule],exports:[t.TextFieldModule,s.MatFormFieldModule,h,c],providers:[a.ErrorStateMatcher]}]}],
/**
     * @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.MAT_INPUT_VALUE_ACCESSOR=f,e.MatInput=h,e.MatInputModule=d,e.MatTextareaAutosize=c,e.getMatInputUnsupportedTypeError=
/**
     * @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){return Error('Input type "'+e+"\" isn't supported by matInput.")},Object.defineProperty(e,"__esModule",{value:!0})}));