moh-common-lib
Version:
A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).
255 lines • 20.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, Optional, Self } from '@angular/core';
import { NgControl } from '@angular/forms';
import { Subject, of } from 'rxjs';
import { GeocoderService } from '../../services/geocoder.service';
import { debounceTime, distinctUntilChanged, switchMap, catchError } from 'rxjs/operators';
import { AbstractFormControl } from '../../models/abstract-form-control';
import { LabelReplacementTag } from '../../models/error-message.interface';
import { CANADA } from '../country/country.component';
import { BRITISH_COLUMBIA } from '../province/province.component';
var StreetComponent = /** @class */ (function (_super) {
tslib_1.__extends(StreetComponent, _super);
function StreetComponent(controlDir, geocoderService) {
var _this = _super.call(this) || this;
_this.controlDir = controlDir;
_this.geocoderService = geocoderService;
_this.label = 'Full street address or rural route';
_this.maxlength = '250';
_this.labelforId = 'street_' + _this.objectId;
_this.useGeoCoder = false;
_this.placeholder = 'Street name';
_this.required = false;
_this.valueChange = new EventEmitter();
_this.blur = new EventEmitter();
_this.select = new EventEmitter();
_this.street = '';
/**
* The subject that triggers on user text input and gets typeaheadList$ to update.
*/
_this.searchText$ = new Subject();
_this._defaultErrMsg = {
required: LabelReplacementTag + ' is required.',
invalidChar: LabelReplacementTag + ' must contain letters, and numbers and may include special characters such as hyphen, ' +
'period, apostrophe, number sign, ampersand and blank characters.'
};
if (controlDir) {
controlDir.valueAccessor = _this;
}
return _this;
}
Object.defineProperty(StreetComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this.street;
},
set: /**
* @param {?} val
* @return {?}
*/
function (val) {
if (val) {
this.street = val;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StreetComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
_super.prototype.ngOnInit.call(this);
// Set up for using GeoCoder
this.typeaheadList$ = this.searchText$.pipe(debounceTime(500), distinctUntilChanged(),
// Trigger the network request, get results
switchMap((/**
* @param {?} searchPhrase
* @return {?}
*/
function (searchPhrase) {
return _this.geocoderService.lookup(searchPhrase);
})), catchError((/**
* @return {?}
*/
function () { return _this.onError(); })));
};
/**
* @param {?} value
* @return {?}
*/
StreetComponent.prototype.onValueChange = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.useGeoCoder) {
// set the search string
this.search = value;
}
this._onChange(value);
this.valueChange.emit(value);
};
/**
* @param {?} event
* @return {?}
*/
StreetComponent.prototype.onBlur = /**
* @param {?} event
* @return {?}
*/
function (event) {
this._onTouched(event);
this.blur.emit(event);
};
/**
* @param {?} value
* @return {?}
*/
StreetComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== undefined) {
this.street = value;
}
};
// @HostListener('keyup', ['$event'])
// @HostListener('keyup', ['$event'])
/**
* @param {?} event
* @return {?}
*/
StreetComponent.prototype.onKeyUp =
// @HostListener('keyup', ['$event'])
/**
* @param {?} event
* @return {?}
*/
function (event) {
/**
* Filter out 'enter' and other similar keyboard events that can trigger
* when user is selecting a typeahead option instead of entering new text.
* Without this filter, we do another HTTP request + force disiplay the UI
* for now reason
*/
if (event.keyCode === 13 || event.keyCode === 9) {
// enter & tab
return;
}
this.searchText$.next(this.search);
};
/**
* @return {?}
*/
StreetComponent.prototype.onError = /**
* @return {?}
*/
function () {
// Empty array simulates no result response, nothing for typeahead to iterate over
return of([]);
};
/**
* @param {?} event
* @return {?}
*/
StreetComponent.prototype.onSelect = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var data = event.item;
this.street = data.street;
// Set to defaults in response
data.country = CANADA;
data.province = BRITISH_COLUMBIA;
this.select.emit(data);
};
StreetComponent.decorators = [
{ type: Component, args: [{
selector: 'common-street',
template: "<label for=\"{{labelforId}}\">{{label}}</label>\r\n<div *ngIf=\"useGeoCoder; else NoGeoCoder;\">\r\n <input class=\"form-control\"\r\n spellcheck=\"false\"\r\n type=\"text\"\r\n id=\"{{labelforId}}\"\r\n [ngModel]=\"street\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [disabled]=\"disabled\"\r\n [attr.maxlength]=\"maxlength\"\r\n [required]=\"required\"\r\n (keyup)='onKeyUp($event)'\r\n [typeahead]='typeaheadList$'\r\n typeaheadOptionField='fullAddress'\r\n typeaheadMinLength='3'\r\n (typeaheadOnSelect)=\"onSelect($event)\"\r\n [placeholder]=\"placeholder\"\r\n autocomplete=\"off\"/>\r\n</div>\r\n\r\n<!-- Error messages for input -->\r\n<common-error-container\r\n[displayError]=\"controlDir && !disabled && (controlDir.touched || controlDir.dirty) && controlDir.errors\">\r\n <div *ngIf=\"controlDir.errors?.required\">\r\n {{_defaultErrMsg.required}}\r\n </div>\r\n <div *ngIf=\"controlDir.errors?.invalidChar\">\r\n {{_defaultErrMsg.invalidChar}}\r\n </div>\r\n\r\n</common-error-container>\r\n\r\n\r\n<ng-template #NoGeoCoder>\r\n <input class=\"form-control\"\r\n spellcheck=\"false\"\r\n type=\"text\"\r\n id=\"{{labelforId}}\"\r\n [value]=\"street\"\r\n (change)=\"onValueChange($event.target.value)\"\r\n (blur)=\"onBlur($event)\"\r\n [disabled]=\"disabled\"\r\n [required]=\"required\"\r\n [attr.maxlength]=\"maxlength\"\r\n [placeholder]=\"placeholder\"\r\n autocomplete=\"off\"/>\r\n</ng-template>\r\n"
}] }
];
/** @nocollapse */
StreetComponent.ctorParameters = function () { return [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] },
{ type: GeocoderService }
]; };
StreetComponent.propDecorators = {
label: [{ type: Input }],
maxlength: [{ type: Input }],
labelforId: [{ type: Input }],
useGeoCoder: [{ type: Input }],
placeholder: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
valueChange: [{ type: Output }],
blur: [{ type: Output }],
select: [{ type: Output }]
};
return StreetComponent;
}(AbstractFormControl));
export { StreetComponent };
if (false) {
/** @type {?} */
StreetComponent.prototype.label;
/** @type {?} */
StreetComponent.prototype.maxlength;
/** @type {?} */
StreetComponent.prototype.labelforId;
/** @type {?} */
StreetComponent.prototype.useGeoCoder;
/** @type {?} */
StreetComponent.prototype.placeholder;
/** @type {?} */
StreetComponent.prototype.required;
/** @type {?} */
StreetComponent.prototype.valueChange;
/** @type {?} */
StreetComponent.prototype.blur;
/** @type {?} */
StreetComponent.prototype.select;
/** @type {?} */
StreetComponent.prototype.street;
/**
* The list of results, from API, that is passed to the typeahead list
* Result from GeoCoderService address lookup
* @type {?}
*/
StreetComponent.prototype.typeaheadList$;
/**
* Search string to store result from GeoCoder request
* @type {?}
* @private
*/
StreetComponent.prototype.search;
/**
* The subject that triggers on user text input and gets typeaheadList$ to update.
* @type {?}
* @private
*/
StreetComponent.prototype.searchText$;
/** @type {?} */
StreetComponent.prototype._defaultErrMsg;
/** @type {?} */
StreetComponent.prototype.controlDir;
/**
* @type {?}
* @private
*/
StreetComponent.prototype.geocoderService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RyZWV0L3N0cmVldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFnQixtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVsRTtJQUlxQywyQ0FBbUI7SUEyQ3RELHlCQUF3QyxVQUFxQixFQUN4QyxlQUFnQztRQURyRCxZQUVFLGlCQUFPLFNBSVI7UUFOdUMsZ0JBQVUsR0FBVixVQUFVLENBQVc7UUFDeEMscUJBQWUsR0FBZixlQUFlLENBQWlCO1FBMUM1QyxXQUFLLEdBQVcsb0NBQW9DLENBQUM7UUFDckQsZUFBUyxHQUFXLEtBQUssQ0FBQztRQUMxQixnQkFBVSxHQUFXLFNBQVMsR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9DLGlCQUFXLEdBQVksS0FBSyxDQUFD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Q3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUxQiw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUMzQixDQUFDOztnQkF2SEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6Qixrc0RBQXNDO2lCQUN2Qzs7OztnQkFiUSxTQUFTLHVCQXlERixRQUFRLFlBQUksSUFBSTtnQkF2REwsZUFBZTs7O3dCQWN2QyxLQUFLOzRCQUNMLEtBQUs7NkJBQ0wsS0FBSzs4QkFDTCxLQUFLOzhCQUNMLEtBQUs7MkJBQ0wsS0FBSzt3QkFFTCxLQUFLOzhCQVVMLE1BQU07dUJBQ04sTUFBTTt5QkFDTixNQUFNOztJQWdHVCxzQkFBQztDQUFBLEFBekhELENBSXFDLG1CQUFtQixHQXFIdkQ7U0FySFksZUFBZTs7O0lBRTFCLGdDQUE4RDs7SUFDOUQsb0NBQW1DOztJQUNuQyxxQ0FBd0Q7O0lBQ3hELHNDQUFzQzs7SUFDdEMsc0NBQTZDOztJQUM3QyxtQ0FBbUM7O0lBWW5DLHNDQUF5RTs7SUFDekUsK0JBQTREOztJQUM1RCxpQ0FBd0Y7O0lBRXhGLGlDQUFvQjs7Ozs7O0lBTXBCLHlDQUErQzs7Ozs7O0lBRy9DLGlDQUF1Qjs7Ozs7O0lBRXZCLHNDQUE0Qzs7SUFFNUMseUNBSUU7O0lBR1cscUNBQWdEOzs7OztJQUNoRCwwQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIFNlbGYsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEdlb0FkZHJlc3NSZXN1bHQsIEdlb2NvZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dlb2NvZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFR5cGVhaGVhZE1hdGNoIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90eXBlYWhlYWQnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Fic3RyYWN0LWZvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IEVycm9yTWVzc2FnZSwgTGFiZWxSZXBsYWNlbWVudFRhZyB9IGZyb20gJy4uLy4uL21vZGVscy9lcnJvci1tZXNzYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IENBTkFEQSB9IGZyb20gJy4uL2NvdW50cnkvY291bnRyeS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCUklUSVNIX0NPTFVNQklBIH0gZnJvbSAnLi4vcHJvdmluY2UvcHJvdmluY2UuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29tbW9uLXN0cmVldCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0cmVldC5jb21wb25lbnQuaHRtbCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdHJlZXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db250cm9sIGltcGxlbWVudHMgT25Jbml0ICB7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnRnVsbCBzdHJlZXQgYWRkcmVzcyBvciBydXJhbCByb3V0ZSc7XHJcbiAgQElucHV0KCkgbWF4bGVuZ3RoOiBzdHJpbmcgPSAnMjUwJztcclxuICBASW5wdXQoKSBsYWJlbGZvcklkOiBzdHJpbmcgPSAnc3RyZWV0XycgKyB0aGlzLm9iamVjdElkO1xyXG4gIEBJbnB1dCgpIHVzZUdlb0NvZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTdHJlZXQgbmFtZSc7XHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUoIHZhbDogc3RyaW5nICkge1xyXG4gICAgaWYgKCB2YWwgKSB7XHJcbiAgICAgIHRoaXMuc3RyZWV0ID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHJlZXQ7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdDogRXZlbnRFbWl0dGVyPEdlb0FkZHJlc3NSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9BZGRyZXNzUmVzdWx0PigpO1xyXG5cclxuICBzdHJlZXQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbGlzdCBvZiByZXN1bHRzLCBmcm9tIEFQSSwgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHR5cGVhaGVhZCBsaXN0XHJcbiAgICogUmVzdWx0IGZyb20gR2VvQ29kZXJTZXJ2aWNlIGFkZHJlc3MgbG9va3VwXHJcbiAgICovXHJcbiAgdHlwZWFoZWFkTGlzdCQ6IE9ic2VydmFibGU8R2VvQWRkcmVzc1Jlc3VsdFtdPjtcclxuXHJcbiAgLyoqIFNlYXJjaCBzdHJpbmcgdG8gc3RvcmUgcmVzdWx0IGZyb20gR2VvQ29kZXIgcmVxdWVzdCAqL1xyXG4gIHByaXZhdGUgc2VhcmNoOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBzdWJqZWN0IHRoYXQgdHJpZ2dlcnMgb24gdXNlciB0ZXh0IGlucHV0IGFuZCBnZXRzIHR5cGVhaGVhZExpc3QkIHRvIHVwZGF0ZS4gICovXHJcbiAgcHJpdmF0ZSBzZWFyY2hUZXh0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgX2RlZmF1bHRFcnJNc2c6IEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHJlcXVpcmVkOiAgTGFiZWxSZXBsYWNlbWVudFRhZyArICcgaXMgcmVxdWlyZWQuJyxcclxuICAgIGludmFsaWRDaGFyOiBMYWJlbFJlcGxhY2VtZW50VGFnICsgJyBtdXN0IGNvbnRhaW4gbGV0dGVycywgYW5kIG51bWJlcnMgYW5kIG1heSBpbmNsdWRlIHNwZWNpYWwgY2hhcmFjdGVycyBzdWNoIGFzIGh5cGhlbiwgJyArXHJcbiAgICAgICAgICAgICAgICAgJ3BlcmlvZCwgYXBvc3Ryb3BoZSwgbnVtYmVyIHNpZ24sIGFtcGVyc2FuZCBhbmQgYmxhbmsgY2hhcmFjdGVycy4nXHJcbiAgfTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBjb250cm9sRGlyOiBOZ0NvbnRyb2wsXHJcbiAgICAgICAgICAgICAgIHByaXZhdGUgZ2VvY29kZXJTZXJ2aWNlOiBHZW9jb2RlclNlcnZpY2UgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKCBjb250cm9sRGlyICkge1xyXG4gICAgICBjb250cm9sRGlyLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFNldCB1cCBmb3IgdXNpbmcgR2VvQ29kZXJcclxuICAgIHRoaXMudHlwZWFoZWFkTGlzdCQgPSB0aGlzLnNlYXJjaFRleHQkLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSg1MDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBuZXR3b3JrIHJlcXVlc3QsIGdldCByZXN1bHRzXHJcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hQaHJhc2UgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlb2NvZGVyU2VydmljZS5sb29rdXAoc2VhcmNoUGhyYXNlKTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gdGhpcy5vbkVycm9yKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZSggdmFsdWU6IGFueSApIHtcclxuICAgIGlmICggdGhpcy51c2VHZW9Db2RlciApIHtcclxuICAgICAgLy8gc2V0IHRoZSBzZWFyY2ggc3RyaW5nXHJcbiAgICAgIHRoaXMuc2VhcmNoID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vbkNoYW5nZSggdmFsdWUgKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCggdmFsdWUgKTtcclxuICB9XHJcblxyXG4gIG9uQmx1ciggZXZlbnQ6IGFueSApIHtcclxuICAgIHRoaXMuX29uVG91Y2hlZCggZXZlbnQgKTtcclxuICAgIHRoaXMuYmx1ci5lbWl0KCBldmVudCApO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSggdmFsdWU6IGFueSApOiB2b2lkIHtcclxuICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgICB0aGlzLnN0cmVldCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQEhvc3RMaXN0ZW5lcigna2V5dXAnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIC8qKlxyXG4gICAgICogRmlsdGVyIG91dCAnZW50ZXInIGFuZCBvdGhlciBzaW1pbGFyIGtleWJvYXJkIGV2ZW50cyB0aGF0IGNhbiB0cmlnZ2VyXHJcbiAgICAgKiB3aGVuIHVzZXIgaXMgc2VsZWN0aW5nIGEgdHlwZWFoZWFkIG9wdGlvbiBpbnN0ZWFkIG9mIGVudGVyaW5nIG5ldyB0ZXh0LlxyXG4gICAgICogV2l0aG91dCB0aGlzIGZpbHRlciwgd2UgZG8gYW5vdGhlciBIVFRQIHJlcXVlc3QgKyBmb3JjZSBkaXNpcGxheSB0aGUgVUlcclxuICAgICAqIGZvciBub3cgcmVhc29uXHJcbiAgICAgKi9cclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSA5KSB7XHJcbiAgICAgIC8vIGVudGVyICYgdGFiXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaFRleHQkLm5leHQodGhpcy5zZWFyY2gpO1xyXG4gIH1cclxuXHJcbiAgb25FcnJvcigpOiBPYnNlcnZhYmxlPEdlb0FkZHJlc3NSZXN1bHRbXT4ge1xyXG4gICAgLy8gRW1wdHkgYXJyYXkgc2ltdWxhdGVzIG5vIHJlc3VsdCByZXNwb25zZSwgbm90aGluZyBmb3IgdHlwZWFoZWFkIHRvIGl0ZXJhdGUgb3ZlclxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0KGV2ZW50OiBUeXBlYWhlYWRNYXRjaCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0YTogR2VvQWRkcmVzc1Jlc3VsdCA9IGV2ZW50Lml0ZW07XHJcbiAgICB0aGlzLnN0cmVldCA9IGRhdGEuc3RyZWV0O1xyXG5cclxuICAgIC8vIFNldCB0byBkZWZhdWx0cyBpbiByZXNwb25zZVxyXG4gICAgZGF0YS5jb3VudHJ5ID0gQ0FOQURBO1xyXG4gICAgZGF0YS5wcm92aW5jZSA9IEJSSVRJU0hfQ09MVU1CSUE7XHJcbiAgICB0aGlzLnNlbGVjdC5lbWl0KCBkYXRhICk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=