UNPKG

angular-phone-number

Version:

A comprehensive international phone number input component for Angular applications with country selection, validation, and formatting.

393 lines 64.2 kB
import { Component, EventEmitter, HostListener, Input, Output, forwardRef, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DomSanitizer } from '@angular/platform-browser'; import { Countries } from '../assets/country-dataset'; import { globeSVG } from '../assets/globe-svg'; import { isValidPhoneNumber } from 'libphonenumber-js'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; export class AngularPhoneNumber { // Arab country codes - moved to a static property static { this.ARAB_COUNTRY_CODES = ['SA', 'AE', 'QA', 'BH', 'KW', 'OM', 'JO', 'PS', 'LB', 'SY', 'IQ', 'YE', 'LY', 'EG', 'SD', 'SO', 'DJ', 'MA', 'DZ', 'TN', 'MR']; } constructor(elementRef) { this.elementRef = elementRef; this.error = false; this.defaultCountry = 'US'; // Added default value this.preferredCountries = []; this.border = true; this.disabled = false; this.language = 'en'; this.mode = 'all'; this.priorityCountries = []; this.inputChanged = new EventEmitter(); this.countryChanged = new EventEmitter(); this.modalOpened = new EventEmitter(); this.sanitizer = inject(DomSanitizer); this.countryList = Countries; this.dataSet = Object.values(this.countryList); this.showModal = false; this.inputFocused = false; this.value = ''; this.globeSVG = globeSVG; // Callbacks for ControlValueAccessor this.onChange = () => { }; this.onTouched = () => { }; } // Handle click outside component onClickOutside(event) { const clickedInside = this.elementRef.nativeElement.contains(event.target); const clickedOnInput = event.target.classList.contains('input-box'); if (!clickedInside || clickedOnInput) { this.showModal = false; this.modalOpened.emit(false); // Emit event when modal is closed } } // Input event handlers onBlur() { this.inputFocused = false; this.onTouched(); } onFocus() { this.inputFocused = true; } // ControlValueAccessor implementation writeValue(value) { if (value !== undefined) { this.extractValues(value); // Don't call onChange here - writeValue shouldn't trigger onChange } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } // Disable the component when needed setDisabledState(isDisabled) { this.disabled = isDisabled; } ngOnInit() { this.initializeComponent(); } ngOnChanges(changes) { const shouldResetCountryList = changes['mode'] && !changes['mode'].firstChange; if (shouldResetCountryList) { // Reset country list to default this.resetCountryList(); } const needsReordering = (changes['mode'] && !changes['mode'].firstChange) || (changes['priorityCountries'] && !changes['priorityCountries'].firstChange); if (needsReordering) { this.applyCountryOrdering(); } } /** * Initialize component with the correct country ordering and filtering */ initializeComponent() { // Set default country this.setDefaultCountry(); // Apply country ordering this.applyCountryOrdering(); // Notify that the modal is closed initially this.modalOpened.emit(false); } /** * Apply all ordering rules to the country list */ applyCountryOrdering() { // Finally apply preferred countries filter this.applyPreferredCountriesFilter(); // First apply mode-based ordering this.prioritizeArabCountries(); // Then apply custom priority countries this.applyPriorityCountries(); } /** * Reset country list to the original dataset */ resetCountryList() { this.countryList = { ...Countries }; this.dataSet = Object.values(this.countryList); } /** * Sets the default country based on input */ setDefaultCountry() { if (!this.defaultCountry) { return; } const defCountryData = this.countryList[this.defaultCountry]; if (defCountryData) { this.selectedCountry = defCountryData; } } /** * Apply preferred countries filter to narrow down the available options */ applyPreferredCountriesFilter() { if (!this.preferredCountries || this.preferredCountries.length === 0) { return; } // Filter the countries to include only preferred countries const preferredCountryList = Object.fromEntries(Object.entries(this.countryList).filter(([code]) => this.preferredCountries.includes(code))); // If preferred countries are found, update the countryList if (Object.keys(preferredCountryList).length > 0) { this.countryList = preferredCountryList; this.dataSet = Object.values(this.countryList); } } /** * Toggle the country selection modal */ toggleModal() { this.showModal = !this.showModal; this.dataSet = Object.values(this.countryList); this.modalOpened.emit(this.showModal); } /** * Update the full phone number value and notify changes */ setFullPhoneNumber() { const fullPhoneNumber = this.selectedCountry ? `${this.selectedCountry.dialCode}${this.value || ''}` : this.value || ''; this.onChange(fullPhoneNumber); } /** * Handle country selection */ selectCountry(data) { this.selectedCountry = data; this.setFullPhoneNumber(); this.showModal = false; this.countryChanged.emit(data); } /** * Extract country code and phone number from input */ extractValues(phoneNumber) { if (!phoneNumber) { this.value = ''; return; } // Ensure we're working with a string phoneNumber = phoneNumber.toString(); // Try to match with a country code const countryCodes = Object.keys(Countries); const sortedCodes = countryCodes.sort((a, b) => Countries[b].dialCode.length - Countries[a].dialCode.length); // Check if the number starts with any country code for (const code of sortedCodes) { if (phoneNumber.startsWith(Countries[code].dialCode)) { this.selectedCountry = Countries[code]; this.value = phoneNumber.substring(Countries[code].dialCode.length); return; } } // If no direct match was found, try to extract based on common prefixes if (phoneNumber.startsWith('+')) { // Try to match the first 1-4 digits as country code for (let i = 1; i <= 4; i++) { const prefix = phoneNumber.substring(0, i + 1); // include the + sign const matchingCode = countryCodes.find((code) => `+${Countries[code].dialCode.replace('+', '')}` === prefix); if (matchingCode) { this.selectedCountry = Countries[matchingCode]; this.value = phoneNumber.substring(i + 1); return; } } // If still not found, just remove the + sign this.value = phoneNumber.substring(1); } else { // No + prefix, just use the value as is this.value = phoneNumber; } } /** * Try to determine the country from user input */ getCountryWithInput() { if (!this.value || this.selectedCountry) { return; } const tempNum = `+${this.value}`; // Only try to detect if we have at least a few digits if (tempNum.length >= 4) { const countryCodes = Object.keys(Countries); const sortedCodes = countryCodes.sort((a, b) => Countries[b].dialCode.length - Countries[a].dialCode.length); for (const code of sortedCodes) { if (tempNum.startsWith(Countries[code].dialCode)) { this.selectedCountry = Countries[code]; // Remove the country code from input value this.value = this.value.substring(this.selectedCountry.dialCode.length - 1); break; } } } } /** * Handle input changes */ onInputChanged() { // Prevent non-numeric input if (this.value === '') { this.value = ''; return; } this.value = this.value?.toString().replace(/[^0-9]/g, '') || ''; this.getCountryWithInput(); this.setFullPhoneNumber(); this.inputChanged.emit(this.value); } /** * Filter countries based on search term */ filterCountries(searchTerm) { if (!searchTerm) { this.dataSet = Object.values(this.countryList); return; } // Convert search term to lowercase for case-insensitive matching const term = searchTerm.toLowerCase(); this.dataSet = Object.values(this.countryList).filter((country) => country.country.toLowerCase().includes(term) || (country.countryAr && country.countryAr.toLowerCase().includes(term)) || country.dialCode.includes(term)); } /** * Handle search input changes */ onSearchChange(event) { const searchTerm = event.target.value; this.filterCountries(searchTerm); } /** * Prioritize Arab countries if mode is 'ar' */ prioritizeArabCountries() { if (this.mode !== 'ar') { return; } const arabCountries = {}; const otherCountries = {}; // Split countries into Arab and non-Arab groups Object.entries(this.countryList).forEach(([code, country]) => { if (AngularPhoneNumber.ARAB_COUNTRY_CODES.includes(code)) { arabCountries[code] = country; } else { otherCountries[code] = country; } }); // Combine with Arab countries first this.countryList = { ...arabCountries, ...otherCountries }; this.dataSet = Object.values(this.countryList); } /** * Apply priority countries to the top of the list */ applyPriorityCountries() { if (!this.priorityCountries || this.priorityCountries.length === 0) { return; } const priorityCountries = {}; const otherCountries = {}; // Add priority countries in specified order this.priorityCountries.forEach((code) => { if (this.countryList[code]) { priorityCountries[code] = Countries[code]; } }); // Add remaining countries Object.entries(this.countryList).forEach(([code, country]) => { if (!this.priorityCountries.includes(code)) { otherCountries[code] = country; } }); // Combine with priority countries first this.countryList = { ...priorityCountries, ...otherCountries }; this.dataSet = Object.values(this.countryList); } /** * Get sanitized SVG icon */ getIcon(iconString) { if (iconString) { return this.sanitizer.bypassSecurityTrustHtml(iconString); } return undefined; } /** * Validate the phone number input */ validate() { // Empty validation if (!this.value || this.value === '') { return { required: true }; } // Create full phone number for validation const fullPhoneNumber = this.selectedCountry ? `${this.selectedCountry.dialCode}${this.value}` : `+${this.value}`; // Validate using libphonenumber-js try { if (!isValidPhoneNumber(fullPhoneNumber)) { return { invalidPhoneNumber: true }; } } catch (error) { return { invalidPhoneFormat: true }; } return null; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularPhoneNumber, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AngularPhoneNumber, isStandalone: true, selector: "angular-phone-number", inputs: { error: "error", defaultCountry: "defaultCountry", preferredCountries: "preferredCountries", border: "border", disabled: "disabled", language: "language", mode: "mode", priorityCountries: "priorityCountries" }, outputs: { inputChanged: "inputChanged", countryChanged: "countryChanged", modalOpened: "modalOpened" }, host: { listeners: { "document:mousedown": "onClickOutside($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AngularPhoneNumber), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => AngularPhoneNumber), multi: true, }, ], usesOnChanges: true, ngImport: i0, template: "<div class=\"wrap flex form-control align-center\" [class.border]=\"border\" [class.active]=\"inputFocused\" [class.error]=\"error\">\r\n <div class=\"flex\">\r\n @if(selectedCountry){\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\">\r\n <img [src]=\"selectedCountry.flag\" [alt]=\"selectedCountry.country\" srcset=\"\" />\r\n </span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <span class=\"text ml-5\" (click)=\"!disabled && toggleModal()\">{{ selectedCountry.dialCode }}</span>\r\n }@else{\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" [innerHTML]=\"getIcon(globeSVG)\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\"></span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n\r\n <input class=\"input-box text\" type=\"number\" placeholder=\"\" [(ngModel)]=\"value\" [disabled]=\"disabled\" (input)=\"onChange(value); onInputChanged()\" (blur)=\"onBlur(); onTouched()\" (focus)=\"onFocus()\" />\r\n\r\n @if(showModal){\r\n <div class=\"modal-wrap\">\r\n <div class=\"search-box\">\r\n <div class=\"search-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M12.803 13.8637C13.0959 14.1566 13.5708 14.1566 13.8637 13.8637C14.1566 13.5708 14.1566 13.0959 13.8637 12.803L12.803 13.8637ZM11.25 7C11.25 9.34721 9.34721 11.25 7 11.25V12.75C10.1756 12.75 12.75 10.1756 12.75 7H11.25ZM7 11.25C4.65279 11.25 2.75 9.34721 2.75 7H1.25C1.25 10.1756 3.82436 12.75 7 12.75V11.25ZM2.75 7C2.75 4.65279 4.65279 2.75 7 2.75V1.25C3.82436 1.25 1.25 3.82436 1.25 7H2.75ZM7 2.75C9.34721 2.75 11.25 4.65279 11.25 7H12.75C12.75 3.82436 10.1756 1.25 7 1.25V2.75ZM13.8637 12.803L11.0719 10.0113L10.0113 11.0719L12.803 13.8637L13.8637 12.803Z\"\r\n fill=\"#546C84\"\r\n />\r\n </svg>\r\n </div>\r\n <input class=\"search-box\" (input)=\"onSearchChange($event)\" placeholder=\"Search\" />\r\n </div>\r\n <div class=\"country-list\">\r\n <div style=\"display: flex\" *ngFor=\"let data of dataSet\">\r\n <div class=\"modal-country-wrap flex\" (click)=\"selectCountry(data)\">\r\n <span class=\"flag\">\r\n <img [src]=\"data.flag\" [alt]=\"data.country\" srcset=\"\" />\r\n </span>\r\n <span class=\"modal-country ml-5\">{{ data.dialCode }}</span>\r\n <span class=\"modal-country ml-5\">{{ language == 'en' ? data.country : data.countryAr }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.wrap{position:relative;border-bottom:1px solid rgba(0,0,0,.1);border-radius:8px;height:45px;padding:0 12px;direction:ltr;background-color:#fff}.wrap .modal-wrap{position:absolute;background-color:#fff;top:55px;left:0;border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:6px;z-index:9999}.wrap .modal-wrap .country-list{margin-top:10px;overflow:-moz-scrollbars-none;overflow-y:scroll;width:280px;max-height:250px}.wrap .modal-wrap .country-list::-webkit-scrollbar{display:none}.wrap .modal-wrap .modal-country-wrap{width:100%;padding:5px 0}.wrap .modal-wrap .modal-country-wrap:hover{background-color:#0000001a}.wrap .modal-wrap .search-box{display:flex;align-items:center;gap:8px}.wrap .modal-wrap .search-box input{border:none;outline:none;width:100%;border-bottom:1px solid rgba(0,0,0,.1);font-size:13px}.wrap .input-box{border:none;outline:none;width:100%;padding:0 8px;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(0,0,0,.1)}.wrap .text{font-size:16px;font-weight:400;line-height:24px;letter-spacing:-.011px}.wrap .flag{width:20px;height:auto;display:flex;align-items:center}.active{border:1px solid #0043ce}.active .input-box{border-color:#0043ce}.error{border:1px solid #dd3130}.error .input-box{border-color:#dd3130}.border{border:1px solid rgba(0,0,0,.1)}.flex{display:flex}.align-center{align-items:center}.ml-5{margin-left:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularPhoneNumber, decorators: [{ type: Component, args: [{ selector: 'angular-phone-number', standalone: true, imports: [CommonModule, FormsModule], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AngularPhoneNumber), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => AngularPhoneNumber), multi: true, }, ], template: "<div class=\"wrap flex form-control align-center\" [class.border]=\"border\" [class.active]=\"inputFocused\" [class.error]=\"error\">\r\n <div class=\"flex\">\r\n @if(selectedCountry){\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\">\r\n <img [src]=\"selectedCountry.flag\" [alt]=\"selectedCountry.country\" srcset=\"\" />\r\n </span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <span class=\"text ml-5\" (click)=\"!disabled && toggleModal()\">{{ selectedCountry.dialCode }}</span>\r\n }@else{\r\n <div class=\"flex align-center\" style=\"cursor: pointer\" (click)=\"!disabled && toggleModal()\">\r\n <span class=\"flag\" [innerHTML]=\"getIcon(globeSVG)\" (click)=\"!disabled && toggleModal(); $event.stopPropagation()\"></span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M4.21777 6.05078L8.21777 10.0508L12.2178 6.05078\" stroke=\"#8A9AAA\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n\r\n <input class=\"input-box text\" type=\"number\" placeholder=\"\" [(ngModel)]=\"value\" [disabled]=\"disabled\" (input)=\"onChange(value); onInputChanged()\" (blur)=\"onBlur(); onTouched()\" (focus)=\"onFocus()\" />\r\n\r\n @if(showModal){\r\n <div class=\"modal-wrap\">\r\n <div class=\"search-box\">\r\n <div class=\"search-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M12.803 13.8637C13.0959 14.1566 13.5708 14.1566 13.8637 13.8637C14.1566 13.5708 14.1566 13.0959 13.8637 12.803L12.803 13.8637ZM11.25 7C11.25 9.34721 9.34721 11.25 7 11.25V12.75C10.1756 12.75 12.75 10.1756 12.75 7H11.25ZM7 11.25C4.65279 11.25 2.75 9.34721 2.75 7H1.25C1.25 10.1756 3.82436 12.75 7 12.75V11.25ZM2.75 7C2.75 4.65279 4.65279 2.75 7 2.75V1.25C3.82436 1.25 1.25 3.82436 1.25 7H2.75ZM7 2.75C9.34721 2.75 11.25 4.65279 11.25 7H12.75C12.75 3.82436 10.1756 1.25 7 1.25V2.75ZM13.8637 12.803L11.0719 10.0113L10.0113 11.0719L12.803 13.8637L13.8637 12.803Z\"\r\n fill=\"#546C84\"\r\n />\r\n </svg>\r\n </div>\r\n <input class=\"search-box\" (input)=\"onSearchChange($event)\" placeholder=\"Search\" />\r\n </div>\r\n <div class=\"country-list\">\r\n <div style=\"display: flex\" *ngFor=\"let data of dataSet\">\r\n <div class=\"modal-country-wrap flex\" (click)=\"selectCountry(data)\">\r\n <span class=\"flag\">\r\n <img [src]=\"data.flag\" [alt]=\"data.country\" srcset=\"\" />\r\n </span>\r\n <span class=\"modal-country ml-5\">{{ data.dialCode }}</span>\r\n <span class=\"modal-country ml-5\">{{ language == 'en' ? data.country : data.countryAr }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.wrap{position:relative;border-bottom:1px solid rgba(0,0,0,.1);border-radius:8px;height:45px;padding:0 12px;direction:ltr;background-color:#fff}.wrap .modal-wrap{position:absolute;background-color:#fff;top:55px;left:0;border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:6px;z-index:9999}.wrap .modal-wrap .country-list{margin-top:10px;overflow:-moz-scrollbars-none;overflow-y:scroll;width:280px;max-height:250px}.wrap .modal-wrap .country-list::-webkit-scrollbar{display:none}.wrap .modal-wrap .modal-country-wrap{width:100%;padding:5px 0}.wrap .modal-wrap .modal-country-wrap:hover{background-color:#0000001a}.wrap .modal-wrap .search-box{display:flex;align-items:center;gap:8px}.wrap .modal-wrap .search-box input{border:none;outline:none;width:100%;border-bottom:1px solid rgba(0,0,0,.1);font-size:13px}.wrap .input-box{border:none;outline:none;width:100%;padding:0 8px;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(0,0,0,.1)}.wrap .text{font-size:16px;font-weight:400;line-height:24px;letter-spacing:-.011px}.wrap .flag{width:20px;height:auto;display:flex;align-items:center}.active{border:1px solid #0043ce}.active .input-box{border-color:#0043ce}.error{border:1px solid #dd3130}.error .input-box{border-color:#dd3130}.border{border:1px solid rgba(0,0,0,.1)}.flex{display:flex}.align-center{align-items:center}.ml-5{margin-left:5px}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { error: [{ type: Input }], defaultCountry: [{ type: Input }], preferredCountries: [{ type: Input }], border: [{ type: Input }], disabled: [{ type: Input }], language: [{ type: Input }], mode: [{ type: Input }], priorityCountries: [{ type: Input }], inputChanged: [{ type: Output }], countryChanged: [{ type: Output }], modalOpened: [{ type: Output }], onClickOutside: [{ type: HostListener, args: ['document:mousedown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1waG9uZS1udW1iZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1waG9uZS1udW1iZXIvc3JjL2xpYi9hbmd1bGFyLXBob25lLW51bWJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXBob25lLW51bWJlci9zcmMvbGliL2FuZ3VsYXItcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixVQUFVLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2SixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUErQixNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBcUJ2RCxNQUFNLE9BQU8sa0JBQWtCO0lBc0I3QixrREFBa0Q7YUFDMUIsdUJBQWtCLEdBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFF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QjtrQkFuQjlCLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsYUFHekI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUM7NEJBQ2pELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7K0VBR1EsS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFrQlAsY0FBYztzQkFEYixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiwgaW5qZWN0LCBPbkluaXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ291bnRyaWVzIH0gZnJvbSAnLi4vYXNzZXRzL2NvdW50cnktZGF0YXNldCc7XHJcbmltcG9ydCB7IENvdW50cnlEYXRhIH0gZnJvbSAnLi4vZGF0YS10eXBlcy9jb3VudHJ5TGlzdCc7XHJcbmltcG9ydCB7IGdsb2JlU1ZHIH0gZnJvbSAnLi4vYXNzZXRzL2dsb2JlLXN2Zyc7XHJcbmltcG9ydCB7IENvdW50cnkgfSBmcm9tICcuLi9kYXRhLXR5cGVzL2NvdW50cnknO1xyXG5pbXBvcnQgeyBpc1ZhbGlkUGhvbmVOdW1iZXIgfSBmcm9tICdsaWJwaG9uZW51bWJlci1qcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FuZ3VsYXItcGhvbmUtbnVtYmVyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5ndWxhci1waG9uZS1udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FuZ3VsYXItcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBbmd1bGFyUGhvbmVOdW1iZXIpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFuZ3VsYXJQaG9uZU51bWJlciksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclBob25lTnVtYmVyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGVycm9yOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGVmYXVsdENvdW50cnkgPSAnVVMnOyAvLyBBZGRlZCBkZWZhdWx0IHZhbHVlXHJcbiAgQElucHV0KCkgcHJlZmVycmVkQ291bnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGJvcmRlciA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsYW5ndWFnZTogJ2FyJyB8ICdlbicgPSAnZW4nO1xyXG4gIEBJbnB1dCgpIG1vZGU6ICdhcicgfCAnYWxsJyA9ICdhbGwnO1xyXG4gIEBJbnB1dCgpIHByaW9yaXR5Q291bnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bWJlciB8IG51bGw+KCk7XHJcbiAgQE91dHB1dCgpIGNvdW50cnlDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDb3VudHJ5IHwgbnVsbD4oKTtcclxuICBAT3V0cHV0KCkgbW9kYWxPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIHNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xyXG4gIGNvdW50cnlMaXN0OiBDb3VudHJ5RGF0YSA9IENvdW50cmllcztcclxuICBkYXRhU2V0OiBDb3VudHJ5W10gPSBPYmplY3QudmFsdWVzKHRoaXMuY291bnRyeUxpc3QpO1xyXG4gIHNob3dNb2RhbCA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkQ291bnRyeSE6IENvdW50cnk7XHJcbiAgaW5wdXRGb2N1c2VkID0gZmFsc2U7XHJcbiAgdmFsdWUgPSAnJztcclxuICBnbG9iZVNWRzogc3RyaW5nID0gZ2xvYmVTVkc7XHJcblxyXG4gIC8vIEFyYWIgY291bnRyeSBjb2RlcyAtIG1vdmVkIHRvIGEgc3RhdGljIHByb3BlcnR5XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJBQl9DT1VOVFJZX0NPREVTOiBzdHJpbmdbXSA9IFsnU0EnLCAnQUUnLCAnUUEnLCAnQkgnLCAnS1cnLCAnT00nLCAnSk8nLCAnUFMnLCAnTEInLCAnU1knLCAnSVEnLCAnWUUnLCAnTFknLCAnRUcnLCAnU0QnLCAnU08nLCAnREonLCAnTUEnLCAnRFonLCAnVE4nLCAnTVInXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICAvLyBIYW5kbGUgY2xpY2sgb3V0c2lkZSBjb21wb25lbnRcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuICAgIGNvbnN0IGNsaWNrZWRPbklucHV0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnB1dC1ib3gnKTtcclxuXHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUgfHwgY2xpY2tlZE9uSW5wdXQpIHtcclxuICAgICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tb2RhbE9wZW5lZC5lbWl0KGZhbHNlKTsgLy8gRW1pdCBldmVudCB3aGVuIG1vZGFsIGlzIGNsb3NlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2FsbGJhY2tzIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvLyBJbnB1dCBldmVudCBoYW5kbGVyc1xyXG4gIG9uQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgb25Gb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmV4dHJhY3RWYWx1ZXModmFsdWUpO1xyXG4gICAgICAvLyBEb24ndCBjYWxsIG9uQ2hhbmdlIGhlcmUgLSB3cml0ZVZhbHVlIHNob3VsZG4ndCB0cmlnZ2VyIG9uQ2hhbmdlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIHRoZSBjb21wb25lbnQgd2hlbiBuZWVkZWRcclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNob3VsZFJlc2V0Q291bnRyeUxpc3QgPSBjaGFuZ2VzWydtb2RlJ10gJiYgIWNoYW5nZXNbJ21vZGUnXS5maXJzdENoYW5nZTtcclxuXHJcbiAgICBpZiAoc2hvdWxkUmVzZXRDb3VudHJ5TGlzdCkge1xyXG4gICAgICAvLyBSZXNldCBjb3VudHJ5IGxpc3QgdG8gZGVmYXVsdFxyXG4gICAgICB0aGlzLnJlc2V0Q291bnRyeUxpc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZWVkc1Jlb3JkZXJpbmcgPSAoY2hhbmdlc1snbW9kZSddICYmICFjaGFuZ2VzWydtb2RlJ10uZmlyc3RDaGFuZ2UpIHx8IChjaGFuZ2VzWydwcmlvcml0eUNvdW50cmllcyddICYmICFjaGFuZ2VzWydwcmlvcml0eUNvdW50cmllcyddLmZpcnN0Q2hhbmdlKTtcclxuXHJcbiAgICBpZiAobmVlZHNSZW9yZGVyaW5nKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlDb3VudHJ5T3JkZXJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgY29tcG9uZW50IHdpdGggdGhlIGNvcnJlY3QgY291bnRyeSBvcmRlcmluZyBhbmQgZmlsdGVyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xyXG4gICAgLy8gU2V0IGRlZmF1bHQgY291bnRyeVxyXG4gICAgdGhpcy5zZXREZWZhdWx0Q291bnRyeSgpO1xyXG5cclxuICAgIC8vIEFwcGx5IGNvdW50cnkgb3JkZXJpbmdcclxuICAgIHRoaXMuYXBwbHlDb3VudHJ5T3JkZXJpbmcoKTtcclxuXHJcbiAgICAvLyBOb3RpZnkgdGhhdCB0aGUgbW9kYWwgaXMgY2xvc2VkIGluaXRpYWxseVxyXG4gICAgdGhpcy5tb2RhbE9wZW5lZC5lbWl0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGFsbCBvcmRlcmluZyBydWxlcyB0byB0aGUgY291bnRyeSBsaXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseUNvdW50cnlPcmRlcmluZygpOiB2b2lkIHtcclxuICAgIC8vIEZpbmFsbHkgYXBwbHkgcHJlZmVycmVkIGNvdW50cmllcyBmaWx0ZXJcclxuICAgIHRoaXMuYXBwbHlQcmVmZXJyZWRDb3VudHJpZXNGaWx0ZXIoKTtcclxuXHJcbiAgICAvLyBGaXJzdCBhcHBseSBtb2RlLWJhc2VkIG9yZGVyaW5nXHJcbiAgICB0aGlzLnByaW9yaXRpemVBcmFiQ291bnRyaWVzKCk7XHJcblxyXG4gICAgLy8gVGhlbiBhcHBseSBjdXN0b20gcHJpb3JpdHkgY291bnRyaWVzXHJcbiAgICB0aGlzLmFwcGx5UHJpb3JpdHlDb3VudHJpZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGNvdW50cnkgbGlzdCB0byB0aGUgb3JpZ2luYWwgZGF0YXNldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzZXRDb3VudHJ5TGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnRyeUxpc3QgPSB7IC4uLkNvdW50cmllcyB9O1xyXG4gICAgdGhpcy5kYXRhU2V0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmNvdW50cnlMaXN0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgY291bnRyeSBiYXNlZCBvbiBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0RGVmYXVsdENvdW50cnkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGVmYXVsdENvdW50cnkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRlZkNvdW50cnlEYXRhID0gdGhpcy5jb3VudHJ5TGlzdFt0aGlzLmRlZmF1bHRDb3VudHJ5XTtcclxuICAgIGlmIChkZWZDb3VudHJ5RGF0YSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ291bnRyeSA9IGRlZkNvdW50cnlEYXRhO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgcHJlZmVycmVkIGNvdW50cmllcyBmaWx0ZXIgdG8gbmFycm93IGRvd24gdGhlIGF2YWlsYWJsZSBvcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseVByZWZlcnJlZENvdW50cmllc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wcmVmZXJyZWRDb3VudHJpZXMgfHwgdGhpcy5wcmVmZXJyZWRDb3VudHJpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgdGhlIGNvdW50cmllcyB0byBpbmNsdWRlIG9ubHkgcHJlZmVycmVkIGNvdW50cmllc1xyXG4gICAgY29uc3QgcHJlZmVycmVkQ291bnRyeUxpc3QgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModGhpcy5jb3VudHJ5TGlzdCkuZmlsdGVyKChbY29kZV0pID0+IHRoaXMucHJlZmVycmVkQ291bnRyaWVzLmluY2x1ZGVzKGNvZGUpKSk7XHJcblxyXG4gICAgLy8gSWYgcHJlZmVycmVkIGNvdW50cmllcyBhcmUgZm91bmQsIHVwZGF0ZSB0aGUgY291bnRyeUxpc3RcclxuICAgIGlmIChPYmplY3Qua2V5cyhwcmVmZXJyZWRDb3VudHJ5TGlzdCkubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvdW50cnlMaXN0ID0gcHJlZmVycmVkQ291bnRyeUxpc3Q7XHJcbiAgICAgIHRoaXMuZGF0YVNldCA9IE9iamVjdC52YWx1ZXModGhpcy5jb3VudHJ5TGlzdCk7XHJcbiAgI