@mobsolutions/ngx-dadata
Version:
[](https://badge.fury.io/js/%40kolkov%2Fngx-dadata) [](https://travis-ci.org/kolkov/ngx-dadata) [![Coverage Stat
335 lines • 26.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { DadataType, NgxDadataService } from './ngx-dadata.service';
import { Subject, timer } from 'rxjs';
import { debounce } from 'rxjs/operators';
import { DadataConfigDefault } from './dadata-config';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const NGX_DADATA_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NgxDadataComponent)),
multi: true
};
/*const NGX_DADATA_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => NgxDadataComponent),
multi: true,
};*/
/**
* @param {?} value
* @return {?}
*/
export function createDaDataValidator(value) {
return (/**
* @param {?} c
* @return {?}
*/
(c) => {
/** @type {?} */
const err = {
rangeError: {
given: c.value,
expected: value,
}
};
return (c.value !== value) ? err : null;
});
}
export class NgxDadataComponent {
/**
* @param {?} dataService
* @param {?} _r
*/
constructor(dataService, _r) {
this.dataService = dataService;
this._r = _r;
this.v = '';
this.currentFocus = -1;
this.data = [];
this.config = DadataConfigDefault;
this.disabled = null;
this.type = DadataType.address;
this.limit = DadataConfigDefault.limit;
this.placeholder = '';
this.selected = new EventEmitter();
this.inputString$ = new Subject();
// onSuggestionSelected = (value: string) => {};
this.onTouched = (/**
* @return {?}
*/
() => { });
this.propagateChange = (/**
* @return {?}
*/
() => { });
this.validateFn = (/**
* @return {?}
*/
() => { });
}
/**
* @return {?}
*/
get value() {
return this.v;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (v !== this.v) {
this.v = v;
this.propagateChange(v);
}
}
/**
* @return {?}
*/
ngOnInit() {
/*this.validateFn = createDaDataValidator(this._value);
this.propagateChange(this._value);*/
this.type = this.config.type;
this.dataService.setApiKey(this.apiKey ? this.apiKey : this.config.apiKey);
this.inputString$.pipe(debounce((/**
* @return {?}
*/
() => timer(this.config.delay ? this.config.delay : 500)))).subscribe((/**
* @param {?} x
* @return {?}
*/
x => {
this.dataService.getData(x, this.type, this.limit).subscribe((/**
* @param {?} y
* @return {?}
*/
(y) => {
this.data = y.suggestions;
}));
}));
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.value) {
}
}
/**
* @param {?} value
* @return {?}
*/
getData(value) {
this.inputString$.next(value);
this.currentFocus = -1;
}
/**
* @param {?} e
* @param {?} item
* @return {?}
*/
onClick(e, item) {
// e.preventDefault();
this.inputValue.nativeElement.value = item.value;
this.propagateChange(item.value);
this.inputValue.nativeElement.focus();
this.selectedSuggestion = item;
this.data = [];
this.currentFocus = -1;
// this.writeValue(item.value);
this.selected.emit(item);
// this.selectedData.emit(item.data);
// this.selectedString.emit(item.value);
}
/**
* @return {?}
*/
onOutsideClick() {
this.data = [];
}
/**
* @return {?}
*/
onArrowDown() {
this.removeFocus(this.currentFocus);
if (this.currentFocus >= this.data.length - 1) {
this.currentFocus = 0;
}
else {
this.currentFocus++;
}
this.setFocus(this.currentFocus);
}
/**
* @return {?}
*/
onArrowUp() {
this.removeFocus(this.currentFocus);
if (this.currentFocus === 0) {
this.currentFocus = this.data.length - 1;
}
else {
this.currentFocus--;
}
this.setFocus(this.currentFocus);
}
/**
* @return {?}
*/
onEnter() {
this.selectedSuggestion = this.data[this.currentFocus];
this.inputValue.nativeElement.value = this.selectedSuggestion.value;
this.data = [];
this.currentFocus = -1;
this.propagateChange(this.selectedSuggestion.value);
// this.writeValue(this.selectedSuggestion.value);
this.selected.emit(this.selectedSuggestion);
// this.selectedData.emit(this.selectedSuggestion.data);
// this.selectedString.emit(this.selectedSuggestion.value);
}
/**
* @param {?} id
* @return {?}
*/
setFocus(id) {
/** @type {?} */
const activeEl = document.getElementById(id + 'item');
this._r.addClass(activeEl, 'active');
}
/**
* @param {?} id
* @return {?}
*/
removeFocus(id) {
if (id !== -1) {
/** @type {?} */
const activeEl = document.getElementById(id + 'item');
this._r.removeClass(activeEl, 'active');
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== undefined) {
this.v = value;
}
// this.onSuggestionSelected(value);
}
/**
* Set the function to be called
* when the control receives a change event.
*
* @param {?} fn a function
* @return {?}
*/
registerOnChange(fn) {
// this.onSuggestionSelected = fn;
this.propagateChange = fn;
}
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param {?} fn a function
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Implements disabled state for this element
*
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
alert('disabled!');
this.disabled = isDisabled;
}
}
NgxDadataComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-dadata',
template: "<div class=\"autocomplete\">\r\n <label for=\"address_input\"></label>\r\n <input [disabled]=\"disabled ? true : null\" type=\"text\" class=\"primary-input\" #inputValue (input)=\"getData(inputValue.value)\"\r\n [placeholder]=\"placeholder\" (keyup.ArrowDown)=\"onArrowDown()\" (keyup.ArrowUp)=\"onArrowUp()\"\r\n (keyup.Enter)=\"onEnter()\" spellcheck=\"false\" [(ngModel)]=\"value\" autocomplete=\"new-password\" />\r\n <div *ngIf=\"data.length\">\r\n <div class=\"autocomplete-items\">\r\n <div class=\"autocomplele-item\" *ngFor=\"let item of data;let i = index\" (click)=\"onClick($event, item)\" [id]=\"i+'item'\">\r\n {{item.value}}\r\n <ng-template [ngIf]=\"type==='party'\">\r\n <br/>\r\n <span>{{item.data?.inn}} {{item.data?.address?.value}}</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
providers: [NGX_DADATA_VALUE_ACCESSOR,],
styles: [".autocomplete{position:relative}.autocomplete-items{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items .autocomplele-item{padding:5px 10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-items .autocomplele-item:hover{background-color:#e9e9e9}.autocomplete-items .autocomplele-item.active{background-color:#1e90ff!important;color:#fff}.autocomplete-items .autocomplele-item span{color:#555;font-size:80%}"]
}] }
];
/** @nocollapse */
NgxDadataComponent.ctorParameters = () => [
{ type: NgxDadataService },
{ type: Renderer2 }
];
NgxDadataComponent.propDecorators = {
config: [{ type: Input }],
apiKey: [{ type: Input }],
disabled: [{ type: Input }],
type: [{ type: Input }],
limit: [{ type: Input }],
placeholder: [{ type: Input }],
selectedSuggestion: [{ type: Output }],
selected: [{ type: Output }],
inputValue: [{ type: ViewChild, args: ['inputValue' /*, { static: true }*/,] }],
onOutsideClick: [{ type: HostListener, args: ['document:click',] }]
};
if (false) {
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.v;
/** @type {?} */
NgxDadataComponent.prototype.currentFocus;
/** @type {?} */
NgxDadataComponent.prototype.data;
/** @type {?} */
NgxDadataComponent.prototype.config;
/** @type {?} */
NgxDadataComponent.prototype.apiKey;
/** @type {?} */
NgxDadataComponent.prototype.disabled;
/** @type {?} */
NgxDadataComponent.prototype.type;
/** @type {?} */
NgxDadataComponent.prototype.limit;
/** @type {?} */
NgxDadataComponent.prototype.placeholder;
/** @type {?} */
NgxDadataComponent.prototype.selectedSuggestion;
/** @type {?} */
NgxDadataComponent.prototype.selected;
/** @type {?} */
NgxDadataComponent.prototype.inputValue;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.inputString$;
/** @type {?} */
NgxDadataComponent.prototype.onTouched;
/** @type {?} */
NgxDadataComponent.prototype.propagateChange;
/** @type {?} */
NgxDadataComponent.prototype.validateFn;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.dataService;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype._r;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhZGF0YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbW9ic29sdXRpb25zL25neC1kYWRhdGEvIiwic291cmNlcyI6WyJsaWIvbmd4LWRhZGF0YS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBZSxtQkFBbUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBbUQsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7TUFFN0YseUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUM7SUFDakQsS0FBSyxFQUFFLElBQUk7Q0FDWjs7Ozs7Ozs7OztBQVFELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFLO0lBQ3pDOzs7O0lBQU8sQ0FBQyxDQUFjLEVBQUUsRUFBRTs7Y0FDbEIsR0FBRyxHQUFHO1lBQ1YsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxRQUFRLEVBQUUsS0FBSzthQUNoQjtTQUNGO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxD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QWdCLENBQUMsRUFBTztRQUN0QixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7Ozs7Ozs7SUFRRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7Ozs7SUFPRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQzs7O1lBNUtGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsaTVCQUEwQztnQkFFMUMsU0FBUyxFQUFFLENBQUMseUJBQXlCLEVBQTJCOzthQUNqRTs7OztZQXRDbUIsZ0JBQWdCO1lBSmxDLFNBQVM7OztxQkFpRFIsS0FBSztxQkFDTCxLQUFLO3VCQUNMLEtBQUs7bUJBQ0wsS0FBSztvQkFDTCxLQUFLOzBCQUNMLEtBQUs7aUNBRUwsTUFBTTt1QkFDTixNQUFNO3lCQUlOLFNBQVMsU0FBQyxZQUFZLENBQUEsc0JBQXNCOzZCQStENUMsWUFBWSxTQUFDLGdCQUFnQjs7Ozs7OztJQWhGOUIsK0JBQW9COztJQUNwQiwwQ0FBa0I7O0lBRWxCLGtDQUE4Qjs7SUFFOUIsb0NBQW9EOztJQUNwRCxvQ0FBd0I7O0lBQ3hCLHNDQUF5Qjs7SUFDekIsa0NBQW1DOztJQUNuQyxtQ0FBMkM7O0lBQzNDLHlDQUEwQjs7SUFFMUIsZ0RBQStDOztJQUMvQyxzQ0FBMEQ7O0lBSTFELHdDQUFzRTs7Ozs7SUFFdEUsMENBQTZDOztJQUc3Qyx1Q0FBcUI7O0lBQ3JCLDZDQUFnQzs7SUFDaEMsd0NBQTJCOzs7OztJQUVmLHlDQUFxQzs7Ozs7SUFBRSxnQ0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEYWRhdGFUeXBlLCBOZ3hEYWRhdGFTZXJ2aWNlfSBmcm9tICcuL25neC1kYWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7U3ViamVjdCwgdGltZXJ9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7RGFkYXRhUmVzcG9uc2V9IGZyb20gJy4vbW9kZWxzL2RhZGF0YS1yZXNwb25zZSc7XHJcbmltcG9ydCB7RGFkYXRhU3VnZ2VzdGlvbn0gZnJvbSAnLi9tb2RlbHMvc3VnZ2VzdGlvbic7XHJcbmltcG9ydCB7RGFkYXRhQ29uZmlnLCBEYWRhdGFDb25maWdEZWZhdWx0fSBmcm9tICcuL2RhZGF0YS1jb25maWcnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmNvbnN0IE5HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFkYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuLypjb25zdCBOR1hfREFEQVRBX1ZBTElEQVRPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neERhZGF0YUNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWUsXHJcbn07Ki9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYURhdGFWYWxpZGF0b3IodmFsdWUpIHtcclxuICByZXR1cm4gKGM6IEZvcm1Db250cm9sKSA9PiB7XHJcbiAgICBjb25zdCBlcnIgPSB7XHJcbiAgICAgIHJhbmdlRXJyb3I6IHtcclxuICAgICAgICBnaXZlbjogYy52YWx1ZSxcclxuICAgICAgICBleHBlY3RlZDogdmFsdWUsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChjLnZhbHVlICE9PSB2YWx1ZSkgPyBlcnIgOiBudWxsO1xyXG4gIH07XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWRhZGF0YScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1kYWRhdGEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC1kYWRhdGEuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtOR1hfREFEQVRBX1ZBTFVFX0FDQ0VTU09SLCAvKk5HWF9EQURBVEFfVkFMSURBVE9SKi9dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hEYWRhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgdjogYW55ID0gJyc7XHJcbiAgY3VycmVudEZvY3VzID0gLTE7XHJcblxyXG4gIGRhdGE6IERhZGF0YVN1Z2dlc3Rpb25bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBjb25maWc6IERhZGF0YUNvbmZpZyA9IERhZGF0YUNvbmZpZ0RlZmF1bHQ7XHJcbiAgQElucHV0KCkgYXBpS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHR5cGUgPSBEYWRhdGFUeXBlLmFkZHJlc3M7XHJcbiAgQElucHV0KCkgbGltaXQgPSBEYWRhdGFDb25maWdEZWZhdWx0LmxpbWl0O1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFN1Z2dlc3Rpb246IERhZGF0YVN1Z2dlc3Rpb247XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYWRhdGFTdWdnZXN0aW9uPigpO1xyXG4gIC8vIEBPdXRwdXQoKSBzZWxlY3RlZERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPERhRGF0YUFkZHJlc3MgfCBEYURhdGFGSU8gfCBEYURhdGFCYW5rIHwgRGFEYXRhUGFydHkgfCBEYURhdGFFbWFpbD4oKTtcclxuICAvLyBAT3V0cHV0KCkgc2VsZWN0ZWRTdHJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXRWYWx1ZScvKiwgeyBzdGF0aWM6IHRydWUgfSovKSBpbnB1dFZhbHVlOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGlucHV0U3RyaW5nJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgLy8gb25TdWdnZXN0aW9uU2VsZWN0ZWQgPSAodmFsdWU6IHN0cmluZykgPT4ge307XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcbiAgcHJvcGFnYXRlQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcclxuICB2YWxpZGF0ZUZuOiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogTmd4RGFkYXRhU2VydmljZSwgcHJpdmF0ZSBfcjogUmVuZGVyZXIyKSB7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnY7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy52KSB7XHJcbiAgICAgIHRoaXMudiA9IHY7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvKnRoaXMudmFsaWRhdGVGbiA9IGNyZWF0ZURhRGF0YVZhbGlkYXRvcih0aGlzLl92YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl92YWx1ZSk7Ki9cclxuICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldEFwaUtleSh0aGlzLmFwaUtleSA/IHRoaXMuYXBpS2V5IDogdGhpcy5jb25maWcuYXBpS2V5KTtcclxuICAgIHRoaXMuaW5wdXRTdHJpbmckLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlKCgpID0+IHRpbWVyKHRoaXMuY29uZmlnLmRlbGF5ID8gdGhpcy5jb25maWcuZGVsYXkgOiA1MDApKSxcclxuICAgICkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmdldERhdGEoeCwgdGhpcy50eXBlLCB0aGlzLmxpbWl0KS5zdWJzY3JpYmUoKHk6IERhZGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0geS5zdWdnZXN0aW9ucztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmlucHV0U3RyaW5nJC5uZXh0KHZhbHVlKTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IERhZGF0YVN1Z2dlc3Rpb24pIHtcclxuICAgIC8vIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gaXRlbS52YWx1ZTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGl0ZW0udmFsdWUpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gaXRlbTtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgICAvLyB0aGlzLndyaXRlVmFsdWUoaXRlbS52YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRGF0YS5lbWl0KGl0ZW0uZGF0YSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkU3RyaW5nLmVtaXQoaXRlbS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgb25PdXRzaWRlQ2xpY2soKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICB9XHJcblxyXG4gIG9uQXJyb3dEb3duKCkge1xyXG4gICAgdGhpcy5yZW1vdmVGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXMgPj0gdGhpcy5kYXRhLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMrKztcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Rm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gIH1cclxuXHJcbiAgb25BcnJvd1VwKCkge1xyXG4gICAgdGhpcy5yZW1vdmVGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXMgPT09IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMgPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZvY3VzLS07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICB9XHJcblxyXG4gIG9uRW50ZXIoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbiA9IHRoaXMuZGF0YVt0aGlzLmN1cnJlbnRGb2N1c107XHJcbiAgICB0aGlzLmlucHV0VmFsdWUubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlO1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gICAgLy8gdGhpcy53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbik7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRGF0YS5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLmRhdGEpO1xyXG4gICAgLy8gdGhpcy5zZWxlY3RlZFN0cmluZy5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldEZvY3VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnaXRlbScpO1xyXG4gICAgdGhpcy5fci5hZGRDbGFzcyhhY3RpdmVFbCwgJ2FjdGl2ZScpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGlkICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJ2l0ZW0nKTtcclxuICAgICAgdGhpcy5fci5yZW1vdmVDbGFzcyhhY3RpdmVFbCwgJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnYgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcclxuICAgKiB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQgPSBmbjtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmbiBhIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudHMgZGlzYWJsZWQgc3RhdGUgZm9yIHRoaXMgZWxlbWVudFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWRcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGFsZXJ0KCdkaXNhYmxlZCEnKTtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxufVxyXG4iXX0=