UNPKG

ion-intl-tel-input

Version:

An Ionic component for International Phone Number Input, that allows all countries, validation with google phone lib, limited countries, preferred countries, virtual scrolling and much more.

1,217 lines 89 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, forwardRef, Output, EventEmitter, ViewChild, ElementRef, HostBinding, } from '@angular/core'; import { NG_VALUE_ACCESSOR, } from '@angular/forms'; import { IonInput, Platform } from '@ionic/angular'; import { PhoneNumberFormat, PhoneNumberUtil, } from 'google-libphonenumber'; import { IonIntlTelInputService } from '../ion-intl-tel-input.service'; // import { ionIntlTelInputValidator } from '../ion-intl-tel-input.directive'; import { raf } from '../util/util'; /** * @ignore */ /** * @author Azzam Asghar <azzam.asghar@interstellus.com> */ export class IonIntlTelInputComponent { /** * @param {?} el * @param {?} platform * @param {?} ionIntlTelInputService */ constructor(el, platform, ionIntlTelInputService) { this.el = el; this.platform = platform; this.ionIntlTelInputService = ionIntlTelInputService; this.cssClass = true; /** * Iso Code of default selected Country. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent */ this.defaultCountryiso = ''; /** * Determines whether to use `00` or `+` as dial code prefix. * Available attributes are '+' | '00'. * See more on. * * \@default + * \@memberof IonIntlTelInputComponent */ this.dialCodePrefix = '+'; /** * Determines whether to select automatic country based on user input. * See more on. * * \@default false * \@memberof IonIntlTelInputComponent */ this.enableAutoCountrySelect = false; /** * Determines whether an example number will be shown as a placeholder in input. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent */ this.enablePlaceholder = true; /** * A fallaback placeholder to be used if no example number is found for a country. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent */ this.fallbackPlaceholder = ''; /** * If a custom placeholder is needed for input. * If this property is set it will override `enablePlaceholder` and only this placeholder will be shown. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent */ this.inputPlaceholder = ''; /** * Maximum Length for input. * See more on. * * \@default '15' * \@memberof IonIntlTelInputComponent */ this.maxLength = '15'; /** * Title of modal opened to select country dial code. * See more on. * * \@default 'Select Country' * \@memberof IonIntlTelInputComponent */ this.modalTitle = 'Select Country'; /** * CSS class to attach to dial code selectionmodal. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent */ this.modalCssClass = ''; /** * Placeholder for input in dial code selection modal. * See more on. * * \@default 'Enter country name' * \@memberof IonIntlTelInputComponent */ this.modalSearchPlaceholder = 'Enter country name'; /** * Text for close button in dial code selection modal. * See more on. * * \@default 'Close' * \@memberof IonIntlTelInputComponent */ this.modalCloseText = 'Close'; /** * Slot for close button in dial code selection modal. [Ionic slots](https://ionicframework.com/docs/api/item) are supported * See more on. * * \@default 'end' * \@memberof IonIntlTelInputComponent */ this.modalCloseButtonSlot = 'end'; /** * Determines whether dial code selection modal should be searchable or not. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent */ this.modalCanSearch = true; /** * Determines whether dial code selection modal is closed on backdrop click. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent */ this.modalShouldBackdropClose = true; /** * Determines whether input should be focused when dial code selection modal is opened. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent */ this.modalShouldFocusSearchbar = true; /** * Message to show when no countries are found for search in dial code selection modal. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent */ this.modalSearchFailText = 'No countries found'; /** * List of iso codes of manually selected countries as string, which will appear in the dropdown. * **Note**: `onlyCountries` should be a string array of country iso codes. * See more on. * * \@default null * \@memberof IonIntlTelInputComponent */ this.onlyCountries = []; /** * List of iso codesn as string of countries, which will appear at the top in dial code selection modal. * **Note**: `preferredCountries` should be a string array of country iso codes. * See more on. * * \@default null * \@memberof IonIntlTelInputComponent */ this.preferredCountries = []; /** * Determines whether first country should be selected in dial code select or not. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent */ this.selectFirstCountry = true; /** * Determines whether to visually separate dialcode into the drop down element. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent */ this.separateDialCode = true; /** * Fires when the Phone number Input is changed. * See more on. * * \@memberof IonIntlTelInputComponent */ this.numberChange = new EventEmitter(); /** * Fires when the Phone number Input is blurred. * See more on. * * \@memberof IonIntlTelInputComponent */ this.numberBlur = new EventEmitter(); /** * Fires when the Phone number Input is focused. * See more on. * * \@memberof IonIntlTelInputComponent */ this.numberFocus = new EventEmitter(); /** * Fires when the user is typing in Phone number Input. * See more on. * * \@memberof IonIntlTelInputComponent */ this.numberInput = new EventEmitter(); /** * Fires when the dial code selection is changed. * See more on. * * \@memberof IonIntlTelInputComponent */ this.codeChange = new EventEmitter(); /** * Fires when the dial code selection modal is opened. * See more on. * * \@memberof IonIntlTelInputComponent */ this.codeOpen = new EventEmitter(); /** * Fires when the dial code selection modal is closed. * See more on. * * \@memberof IonIntlTelInputComponent */ this.codeClose = new EventEmitter(); /** * Fires when a dial code is selected in dial code selection modal. * See more on. * * \@memberof IonIntlTelInputComponent */ this.codeSelect = new EventEmitter(); // tslint:disable-next-line: variable-name this._value = null; this.phoneNumber = ''; this.countries = []; this.disabled = false; this.phoneUtil = PhoneNumberUtil.getInstance(); this.onTouched = (/** * @return {?} */ () => { }); this.propagateChange = (/** * @param {?} _ * @return {?} */ (_) => { }); this.startsWith = (/** * @param {?} input * @param {?} search * @return {?} */ (input, search) => { return input.substr(0, search.length) === search; }); this.getClasses = (/** * @param {?} element * @return {?} */ (element) => { /** @type {?} */ const classList = element.classList; /** @type {?} */ const classes = []; for (let i = 0; i < classList.length; i++) { /** @type {?} */ const item = classList.item(i); if (item !== null && this.startsWith(item, 'ng-')) { classes.push(`ion-${item.substr(3)}`); } } return classes; }); this.setClasses = (/** * @param {?} element * @param {?} classes * @return {?} */ (element, classes) => { /** @type {?} */ const classList = element.classList; [ 'ion-valid', 'ion-invalid', 'ion-touched', 'ion-untouched', 'ion-dirty', 'ion-pristine', ].forEach((/** * @param {?} c * @return {?} */ (c) => classList.remove(c))); classes.forEach((/** * @param {?} c * @return {?} */ (c) => classList.add(c))); }); this.setIonicClasses = (/** * @param {?} element * @return {?} */ (element) => { raf((/** * @return {?} */ () => { /** @type {?} */ const input = (/** @type {?} */ (element.nativeElement)); /** @type {?} */ const classes = this.getClasses(input); this.setClasses(input, classes); /** @type {?} */ const item = input.closest('ion-item'); if (item) { this.setClasses(item, classes); } })); }); this.setItemClass = (/** * @param {?} element * @param {?} className * @param {?} addClass * @return {?} */ (element, className, addClass) => { /** @type {?} */ const input = (/** @type {?} */ (element.nativeElement)); /** @type {?} */ const item = input.closest('ion-item'); if (item) { /** @type {?} */ const classList = item.classList; if (addClass) { classList.add(className); } else { classList.remove(className); } } }); } /** * @return {?} */ get hasValueCssClass() { return this.hasValue(); } /** * @return {?} */ get isEnabled() { return !this.disabled; } /** * @return {?} */ get value() { return this._value; } /** * @param {?} value * @return {?} */ set value(value) { this._value = value; this.setIonicClasses(this.el); } /** * @param {?} change * @return {?} */ emitValueChange(change) { this.propagateChange(change); } /** * @return {?} */ ngOnInit() { this.isIos = this.platform.is('ios'); this.isMD = !this.isIos; this.setItemClass(this.el, 'item-interactive', true); this.fetchAllCountries(); this.setPreferredCountries(); if (this.onlyCountries.length) { this.countries = this.countries.filter((/** * @param {?} country * @return {?} */ (country) => this.onlyCountries.includes(country.isoCode))); } if (this.selectFirstCountry) { if (this.defaultCountryiso) { this.setCountry(this.getCountryByIsoCode(this.defaultCountryiso)); } else { if (this.preferredCountries.length && this.preferredCountries.includes(this.defaultCountryiso)) { this.setCountry(this.getCountryByIsoCode(this.preferredCountries[0])); } else { this.setCountry(this.countries[0]); } } } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (this.countries && changes.defaulyCountryisoCode && changes.defaulyCountryisoCode.currentValue !== changes.defaulyCountryisoCode.previousValue) { this.setCountry(changes.defaulyCountryisoCode.currentValue); } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} obj * @return {?} */ writeValue(obj) { this.fillValues(obj); } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @param {?} value * @return {?} */ fillValues(value) { if (value && value !== null && typeof value === 'object' && !this.isNullOrWhiteSpace(value)) { this.phoneNumber = value.nationalNumber; this.setCountry(this.getCountryByIsoCode(value.isoCode)); this.value = value; } else if (this.value && this.value !== null && typeof this.value === 'object' && !this.isNullOrWhiteSpace(this.value)) { this.phoneNumber = this.value.nationalNumber; this.setCountry(this.getCountryByIsoCode(this.value.isoCode)); } setTimeout((/** * @return {?} */ () => { this.onNumberChange(); }), 1); } /** * @return {?} */ hasValue() { return !this.isNullOrWhiteSpace(this.value); } /** * @return {?} */ onCodeOpen() { this.codeOpen.emit(); } /** * @param {?} event * @return {?} */ onCodeChange(event) { if (this.isNullOrWhiteSpace(this.phoneNumber)) { this.emitValueChange(null); } else { /** @type {?} */ let googleNumber; try { googleNumber = this.phoneUtil.parse(this.phoneNumber, this.country.isoCode.toUpperCase()); } catch (e) { } /** @type {?} */ const internationallNo = googleNumber ? this.phoneUtil.format(googleNumber, PhoneNumberFormat.INTERNATIONAL) : ''; /** @type {?} */ const nationalNo = googleNumber ? this.phoneUtil.format(googleNumber, PhoneNumberFormat.NATIONAL) : ''; if (this.separateDialCode && internationallNo) { this.phoneNumber = this.removeDialCode(internationallNo); } this.emitValueChange({ internationalNumber: internationallNo, nationalNumber: nationalNo, isoCode: this.country.isoCode, dialCode: this.dialCodePrefix + this.country.dialCode, }); this.codeChange.emit(); } setTimeout((/** * @return {?} */ () => { this.numberInputEl.setFocus(); }), 400); } /** * @return {?} */ onCodeClose() { this.onTouched(); this.setIonicClasses(this.el); this.hasFocus = false; this.setItemClass(this.el, 'item-has-focus', false); this.codeClose.emit(); } /** * @param {?} event * @return {?} */ onCodeSearchCountries(event) { /** @type {?} */ const text = event.text.trim().toLowerCase(); event.component.startSearch(); event.component.items = this.filterCountries(text); event.component.endSearch(); } /** * @return {?} */ onCodeSelect() { this.codeSelect.emit(); } /** * @param {?} event * @return {?} */ onIonNumberChange(event) { this.setIonicClasses(this.el); this.numberChange.emit(event); } /** * @return {?} */ onIonNumberBlur() { this.onTouched(); this.setIonicClasses(this.el); this.hasFocus = false; this.setItemClass(this.el, 'item-has-focus', false); this.numberBlur.emit(); } /** * @return {?} */ onIonNumberFocus() { this.hasFocus = true; this.setItemClass(this.el, 'item-has-focus', true); this.numberFocus.emit(); } /** * @param {?} event * @return {?} */ onIonNumberInput(event) { this.numberInput.emit(event); } /** * @return {?} */ onNumberChange() { if (!this.phoneNumber) { this.value = null; this.emitValueChange(null); return; } if (this.country) { this.emitValueChange({ internationalNumber: this.dialCodePrefix + this.country.dialCode + ' ' + this.phoneNumber, nationalNumber: this.phoneNumber, isoCode: this.country.isoCode, dialCode: this.dialCodePrefix + this.country.dialCode, }); } /** @type {?} */ let googleNumber; try { googleNumber = this.phoneUtil.parse(this.phoneNumber, this.country.isoCode.toUpperCase()); } catch (e) { return; } /** @type {?} */ let isoCode = this.country ? this.country.isoCode : null; // auto select country based on the extension (and areaCode if needed) (e.g select Canada if number starts with +1 416) if (this.enableAutoCountrySelect) { isoCode = googleNumber && googleNumber.getCountryCode() ? this.getCountryIsoCode(googleNumber.getCountryCode(), googleNumber) : this.country.isoCode; if (isoCode && isoCode !== this.country.isoCode) { /** @type {?} */ const newCountry = this.countries.find((/** * @param {?} country * @return {?} */ (country) => country.isoCode === isoCode)); if (newCountry) { this.country = newCountry; } } } isoCode = isoCode ? isoCode : this.country ? this.country.isoCode : null; if (!this.phoneNumber || !isoCode) { this.emitValueChange(null); } else { /** @type {?} */ const internationallNo = googleNumber ? this.phoneUtil.format(googleNumber, PhoneNumberFormat.INTERNATIONAL) : ''; /** @type {?} */ const nationalNo = googleNumber ? this.phoneUtil.format(googleNumber, PhoneNumberFormat.NATIONAL) : ''; if (this.separateDialCode && internationallNo) { this.phoneNumber = this.removeDialCode(internationallNo); } this.emitValueChange({ internationalNumber: internationallNo, nationalNumber: nationalNo, isoCode: this.country.isoCode, dialCode: this.dialCodePrefix + this.country.dialCode, }); } } /** * @param {?} event * @return {?} */ onNumberKeyDown(event) { /** @type {?} */ const allowedChars = /^[0-9\+\-\ ]/; /** @type {?} */ const allowedCtrlChars = /[axcv]/; /** @type {?} */ const allowedOtherKeys = [ 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', 'Home', 'End', 'Insert', 'Delete', 'Backspace', ]; if (!allowedChars.test(event.key) && !(event.ctrlKey && allowedCtrlChars.test(event.key)) && !allowedOtherKeys.includes(event.key)) { event.preventDefault(); } } /** * @private * @param {?} text * @return {?} */ filterCountries(text) { return this.countries.filter((/** * @param {?} country * @return {?} */ (country) => { return (country.name.toLowerCase().indexOf(text) !== -1 || country.name.toLowerCase().indexOf(text) !== -1 || country.dialCode.toString().toLowerCase().indexOf(text) !== -1); })); } /** * @private * @param {?} countryCode * @param {?} googleNumber * @return {?} */ getCountryIsoCode(countryCode, googleNumber) { /** @type {?} */ const rawNumber = ((/** @type {?} */ (googleNumber))).values_[2].toString(); /** @type {?} */ const countries = this.countries.filter((/** * @param {?} country * @return {?} */ (country) => country.dialCode === countryCode.toString())); /** @type {?} */ const mainCountry = countries.find((/** * @param {?} country * @return {?} */ (country) => country.areaCodes === undefined)); /** @type {?} */ const secondaryCountries = countries.filter((/** * @param {?} country * @return {?} */ (country) => country.areaCodes !== undefined)); /** @type {?} */ let matchedCountry = mainCountry ? mainCountry.isoCode : undefined; secondaryCountries.forEach((/** * @param {?} country * @return {?} */ (country) => { country.areaCodes.forEach((/** * @param {?} areaCode * @return {?} */ (areaCode) => { if (rawNumber.startsWith(areaCode)) { matchedCountry = country.isoCode; } })); })); return matchedCountry; } /** * @private * @return {?} */ fetchAllCountries() { this.countries = this.ionIntlTelInputService.getListOfCountries(); } /** * @private * @param {?} isoCode * @return {?} */ getCountryByIsoCode(isoCode) { for (const country of this.countries) { if (country.isoCode === isoCode) { return country; } } return; } /** * @private * @param {?} value * @return {?} */ isNullOrWhiteSpace(value) { if (value === null || value === undefined) { return true; } if (typeof value === 'string' && value === '') { return true; } if (typeof value === 'object' && Object.keys(value).length === 0) { return true; } return false; } /** * @private * @param {?} phoneNumber * @return {?} */ removeDialCode(phoneNumber) { if (this.separateDialCode && phoneNumber) { phoneNumber = phoneNumber.substr(phoneNumber.indexOf(' ') + 1); } return phoneNumber; } /** * @private * @param {?} country * @return {?} */ setCountry(country) { this.country = country; this.codeChange.emit(this.country); } /** * @private * @return {?} */ setPreferredCountries() { for (const preferedCountryIsoCode of this.preferredCountries) { /** @type {?} */ const country = this.getCountryByIsoCode(preferedCountryIsoCode); country.priority = country ? 1 : country.priority; } this.countries.sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => a.priority > b.priority ? -1 : a.priority < b.priority ? 1 : 0)); } } IonIntlTelInputComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line: component-selector selector: 'ion-intl-tel-input', template: "<div class=\"ion-intl-tel-input-code\">\n <ionic-selectable\n #codeSelect\n [(ngModel)]=\"country\"\n [canSearch]=\"modalCanSearch\"\n closeButtonText=\"{{modalCloseText}}\"\n closeButtonSlot=\"{{modalCloseButtonSlot}}\"\n [disabled] = \"disabled\"\n [hasVirtualScroll]=\"true\"\n itemTextField=\"name\"\n [items]=\"countries\"\n itemValueField=\"dialCode\"\n modalCssClass=\"ionic-tel-input-modal {{modalCssClass}}\"\n placeholder=\"Country\"\n searchFailText=\"{{modalSearchFailText}}\"\n searchPlaceholder=\"{{modalSearchPlaceholder}}\"\n [shouldBackdropClose]=\"modalShouldBackdropClose\"\n [shouldFocusSearchbar]=\"modalShouldFocusSearchbar\"\n (onChange)=\"onCodeChange($event)\"\n (onClose)=\"onCodeClose()\"\n (onOpen)=\"onCodeOpen()\"\n (onSearch)=\"onCodeSearchCountries($event)\"\n (onSelect)=\"onCodeSelect()\"\n >\n <ng-template ionicSelectableTitleTemplate>\n {{modalTitle}}\n </ng-template>\n <ng-template ionicSelectableValueTemplate let-country=\"value\">\n <span class=\"flag-icon flag-icon-{{country.flagClass}}\"></span>\n <span *ngIf=\"separateDialCode\">{{dialCodePrefix}}{{country.dialCode}}</span>\n </ng-template>\n <ng-template ionicSelectableItemTemplate let-country=\"item\">\n <span class=\"ion-margin-end\">{{country.name}}</span>\n <span *ngIf=\"separateDialCode\">{{dialCodePrefix}}{{country.dialCode}}</span>\n </ng-template>\n <ng-template ionicSelectableItemEndTemplate let-country=\"item\">\n <span class=\"flag-icon flag-icon-{{country.flagClass}}\"></span>\n </ng-template>\n </ionic-selectable>\n</div>\n\n<div class=\"ion-intl-tel-input-number\">\n <ion-input\n #numberInput\n [(ngModel)]=\"phoneNumber\"\n autocomplete=\"off\"\n [disabled] = \"disabled\" \n [attr.maxLength]=\"maxLength\"\n type=\"tel\"\n (ionBlur)=\"onIonNumberBlur()\"\n (ionChange)=\"onIonNumberChange($event)\"\n (ionFocus)=\"onIonNumberFocus()\"\n (ionInput)=\"onIonNumberInput($event)\"\n (keydown)=\"onNumberKeyDown($event)\"\n (ngModelChange)=\"onNumberChange()\"\n placeholder=\"{{country | countryPlaceholder: inputPlaceholder:separateDialCode:fallbackPlaceholder}}\" >\n </ion-input>\n</div>\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => IonIntlTelInputComponent)), multi: true, }, ], styles: [":host{width:100%;display:-webkit-box;display:flex;-webkit-box-align:end;align-items:flex-end}:host .ion-intl-tel-input-code{position:relative}:host .ion-intl-tel-input-number{-webkit-box-flex:1;flex:1}:host .ionic-selectable-label-default,:host .ionic-selectable-label-fixed{max-width:100%}:host .ionic-selectable:not(:host.ionic-selectable-label-stacked):not(:host.ionic-selectable-label-floating) ::ng-deep .ionic-selectable-inner .ionic-selectable-value{padding-top:10px;padding-bottom:10px}:host .ionic-selectable:not(:host.ionic-selectable-label-stacked):not(:host.ionic-selectable-label-floating) ::ng-deep .ionic-selectable-icon-inner{top:17px}:host .flag-icon{margin-right:5px}"] }] } ]; /** @nocollapse */ IonIntlTelInputComponent.ctorParameters = () => [ { type: ElementRef }, { type: Platform }, { type: IonIntlTelInputService } ]; IonIntlTelInputComponent.propDecorators = { cssClass: [{ type: HostBinding, args: ['class.ion-intl-tel-input',] }], isIos: [{ type: HostBinding, args: ['class.ion-intl-tel-input-ios',] }], isMD: [{ type: HostBinding, args: ['class.ion-intl-tel-input-md',] }], hasFocus: [{ type: HostBinding, args: ['class.has-focus',] }], hasValueCssClass: [{ type: HostBinding, args: ['class.ion-intl-tel-input-has-value',] }], isEnabled: [{ type: HostBinding, args: ['class.ion-intl-tel-input-is-enabled',] }, { type: Input, args: ['isEnabled',] }], defaultCountryiso: [{ type: Input }], dialCodePrefix: [{ type: Input }], enableAutoCountrySelect: [{ type: Input }], enablePlaceholder: [{ type: Input }], fallbackPlaceholder: [{ type: Input }], inputPlaceholder: [{ type: Input }], maxLength: [{ type: Input }], modalTitle: [{ type: Input }], modalCssClass: [{ type: Input }], modalSearchPlaceholder: [{ type: Input }], modalCloseText: [{ type: Input }], modalCloseButtonSlot: [{ type: Input }], modalCanSearch: [{ type: Input }], modalShouldBackdropClose: [{ type: Input }], modalShouldFocusSearchbar: [{ type: Input }], modalSearchFailText: [{ type: Input }], onlyCountries: [{ type: Input }], preferredCountries: [{ type: Input }], selectFirstCountry: [{ type: Input }], separateDialCode: [{ type: Input }], numberChange: [{ type: Output }], numberBlur: [{ type: Output }], numberFocus: [{ type: Output }], numberInput: [{ type: Output }], codeChange: [{ type: Output }], codeOpen: [{ type: Output }], codeClose: [{ type: Output }], codeSelect: [{ type: Output }], numberInputEl: [{ type: ViewChild, args: ['numberInput', { static: false },] }] }; if (false) { /** @type {?} */ IonIntlTelInputComponent.prototype.cssClass; /** @type {?} */ IonIntlTelInputComponent.prototype.isIos; /** @type {?} */ IonIntlTelInputComponent.prototype.isMD; /** @type {?} */ IonIntlTelInputComponent.prototype.hasFocus; /** * Iso Code of default selected Country. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.defaultCountryiso; /** * Determines whether to use `00` or `+` as dial code prefix. * Available attributes are '+' | '00'. * See more on. * * \@default + * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.dialCodePrefix; /** * Determines whether to select automatic country based on user input. * See more on. * * \@default false * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.enableAutoCountrySelect; /** * Determines whether an example number will be shown as a placeholder in input. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.enablePlaceholder; /** * A fallaback placeholder to be used if no example number is found for a country. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.fallbackPlaceholder; /** * If a custom placeholder is needed for input. * If this property is set it will override `enablePlaceholder` and only this placeholder will be shown. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.inputPlaceholder; /** * Maximum Length for input. * See more on. * * \@default '15' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.maxLength; /** * Title of modal opened to select country dial code. * See more on. * * \@default 'Select Country' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalTitle; /** * CSS class to attach to dial code selectionmodal. * See more on. * * \@default '' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalCssClass; /** * Placeholder for input in dial code selection modal. * See more on. * * \@default 'Enter country name' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalSearchPlaceholder; /** * Text for close button in dial code selection modal. * See more on. * * \@default 'Close' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalCloseText; /** * Slot for close button in dial code selection modal. [Ionic slots](https://ionicframework.com/docs/api/item) are supported * See more on. * * \@default 'end' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalCloseButtonSlot; /** * Determines whether dial code selection modal should be searchable or not. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalCanSearch; /** * Determines whether dial code selection modal is closed on backdrop click. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalShouldBackdropClose; /** * Determines whether input should be focused when dial code selection modal is opened. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalShouldFocusSearchbar; /** * Message to show when no countries are found for search in dial code selection modal. * See more on. * * \@default 'true' * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.modalSearchFailText; /** * List of iso codes of manually selected countries as string, which will appear in the dropdown. * **Note**: `onlyCountries` should be a string array of country iso codes. * See more on. * * \@default null * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.onlyCountries; /** * List of iso codesn as string of countries, which will appear at the top in dial code selection modal. * **Note**: `preferredCountries` should be a string array of country iso codes. * See more on. * * \@default null * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.preferredCountries; /** * Determines whether first country should be selected in dial code select or not. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.selectFirstCountry; /** * Determines whether to visually separate dialcode into the drop down element. * See more on. * * \@default true * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.separateDialCode; /** * Fires when the Phone number Input is changed. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.numberChange; /** * Fires when the Phone number Input is blurred. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.numberBlur; /** * Fires when the Phone number Input is focused. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.numberFocus; /** * Fires when the user is typing in Phone number Input. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.numberInput; /** * Fires when the dial code selection is changed. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.codeChange; /** * Fires when the dial code selection modal is opened. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.codeOpen; /** * Fires when the dial code selection modal is closed. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.codeClose; /** * Fires when a dial code is selected in dial code selection modal. * See more on. * * \@memberof IonIntlTelInputComponent * @type {?} */ IonIntlTelInputComponent.prototype.codeSelect; /** @type {?} */ IonIntlTelInputComponent.prototype.numberInputEl; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype._value; /** @type {?} */ IonIntlTelInputComponent.prototype.country; /** @type {?} */ IonIntlTelInputComponent.prototype.phoneNumber; /** @type {?} */ IonIntlTelInputComponent.prototype.countries; /** @type {?} */ IonIntlTelInputComponent.prototype.disabled; /** @type {?} */ IonIntlTelInputComponent.prototype.phoneUtil; /** @type {?} */ IonIntlTelInputComponent.prototype.onTouched; /** @type {?} */ IonIntlTelInputComponent.prototype.propagateChange; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.startsWith; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.getClasses; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.setClasses; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.setIonicClasses; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.setItemClass; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.el; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.platform; /** * @type {?} * @private */ IonIntlTelInputComponent.prototype.ionIntlTelInputService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uLWludGwtdGVsLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvbi1pbnRsLXRlbC1pbnB1dC8iLCJzb3VyY2VzIjpbImxpYi9pb24taW50bC10ZWwtaW5wdXQvaW9uLWludGwtdGVsLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBRXZFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFtQm5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3Qjs7Ozs7O0lBc1RuQyxZQUNVLEVBQWMsRUFDZCxRQUFrQixFQUNsQixzQkFBOEM7UUFGOUMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXRUeEQsYUFBUSxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUF5QmhCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQzs7Ozs7Ozs7O1FBV3ZCLG1CQUFjLEdBQWUsR0FBRyxDQUFDOzs7Ozs7OztRQVVqQyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7Ozs7Ozs7O1FBVWhDLHNCQUFpQixHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUFVekIsd0JBQW1CLEdBQUcsRUFBRSxDQUFDOzs7Ozs7Ozs7UUFXekIscUJBQWdCLEdBQUcsRUFBRSxDQUFDOzs7Ozs7OztRQVV0QixjQUFTLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztRQVVqQixlQUFVLEdBQUcsZ0JBQWdCLENBQUM7Ozs7Ozs7O1FBVTlCLGtCQUFhLEdBQUcsRUFBRSxDQUFDOzs7Ozs7OztRQVVuQiwyQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7UUFVOUMsbUJBQWMsR0FBRyxPQUFPLENBQUM7Ozs7Ozs7O1FBVXpCLHlCQUFvQixHQUE4QyxLQUFLLENBQUM7Ozs7Ozs7O1FBVXhFLG1CQUFjLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztRQVV0Qiw2QkFBd0IsR0FBRyxJQUFJLENBQUM7Ozs7Ozs7O1FBVWhDLDhCQUF5QixHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7UUFVakMsd0JBQW1CLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7OztRQVczQyxrQkFBYSxHQUFrQixFQUFFLENBQUM7Ozs7Ozs7OztRQVdsQyx1QkFBa0IsR0FBa0IsRUFBRSxDQUFDOzs7Ozs7OztRQVV2Qyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7Ozs7Ozs7O1FBVTFCLHFCQUFnQixHQUFHLElBQUksQ0FBQzs7Ozs7OztRQVNmLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQzs7Ozs7OztRQVN6QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7Ozs7OztRQVN0QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7Ozs7Ozs7UUFTdkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQzs7Ozs7OztRQVNoRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNyQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNuQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7Ozs7OztRQVNwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7UUFLdEMsV0FBTSxHQUF5QixJQUFJLENBQUM7UUFHNUMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUMzQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBUSxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFL0MsY0FBUzs7O1FBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFDO1FBQ2pDLG9CQUFlOzs7O1FBQUcsQ0FBQyxDQUE4QixFQUFFLEVBQUUsR0FBRSxDQUFDLEVBQUM7UUFtWGpELGVBQVU7Ozs7O1FBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFXLEVBQUU7WUFDOUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO1FBQ25ELENBQUMsRUFBQztRQUVNLGVBQVU7Ozs7UUFBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRTs7a0JBQ3RDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUzs7a0JBQzdCLE9BQU8sR0FBRyxFQUFFO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztzQkFDbkMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsRUFBQztRQUVNLGVBQVU7Ozs7O1FBQUcsQ0FBQyxPQUFvQixFQUFFLE9BQWlCLEVBQUUsRUFBRTs7a0JBQ3pELFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUztZQUNuQztnQkFDRSxXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsYUFBYTtnQkFDYixlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsY0FBYzthQUNmLENBQUMsT0FBTzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFFdEMsT0FBTyxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzNDLENBQUMsRUFBQztRQUVNLG9CQUFlOzs7O1FBQUcsQ0FBQyxPQUFtQixFQUFFLEVBQUU7WUFDaEQsR0FBRzs7O1lBQUMsR0FBRyxFQUFFOztzQkFDRCxLQUFLLEdBQUcsbUJBQUEsT0FBTyxDQUFDLGFBQWEsRUFBZTs7c0JBQzVDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7O3NCQUUxQixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNoQztZQUNILENBQUMsRUFBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDO1FBRU0saUJBQVk7Ozs7OztRQUFHLENBQ3JCLE9BQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLEVBQUU7O2tCQUNJLEtBQUssR0FBRyxtQkFBQSxPQUFPLENBQUMsYUFBYSxFQUFlOztrQkFDNUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksSUFBSSxFQUFFOztzQkFDRixTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQ2hDLElBQUksUUFBUSxFQUFFO29CQUNaLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzdCO2FBQ0Y7UUFDSCxDQUFDLEVBQUM7SUF2YUMsQ0FBQzs7OztJQWhUSixJQUNJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs7O0lBQ0QsSUFFSSxTQUFTO1FBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQzs7OztJQTBTRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFrQztRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDOzs7OztJQUVELGVBQWUsQ0FBQyxNQUFtQztRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztZQUFDLENBQUMsT0FBaUIsRUFBRSxFQUFFLENBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDN0MsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7YUFDbkU7aUJBQU07Z0JBQ0wsSUFDRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtvQkFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFDeEQ7b0JBQ0EsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BDO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQ0UsSUFBSSxDQUFDLFNBQVM7WUFDZCxPQUFPLENBQUMscUJBQXFCO1lBQzdCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZO2dCQUN4QyxPQUFPLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUM3QztZQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxHQUF5QjtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBMkI7UUFDcEMsSUFDRSxLQUFLO1lBQ0wsS0FBSyxLQUFLLElBQUk7WUFDZCxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUMvQjtZQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNwQjthQUFNLElBQ0wsSUFBSSxDQUFDLEtBQUs7WUFDVixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUk7WUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDOUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNwQztZQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsVUFBVTs7O1FBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7OztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLEtBR1o7UUFDQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjthQUFNOztnQkFDRCxZQUF5QjtZQUM3QixJQUFJO2dCQUNGLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDakMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQ25DLENBQUM7YUFDSDtZQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7O2tCQUVSLGdCQUFnQixHQUFHLFlBQVk7Z0JBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWl