UNPKG

@muzykantov/ngx-dadata

Version:

Angular 6+ [DaData][dadata] suggestion (подсказки) implementation

384 lines 29.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { DaDataType, NgxDaDataService } from "./ngx-da-data.service"; import { Subject, timer } from "rxjs"; import { debounce } from "rxjs/operators"; import { DaDataConfigDefault } from "./da-data-config"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; /** @type {?} */ var NGX_DADATA_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return NgxDaDataComponent; }), multi: true }; /*const NGX_DADATA_VALIDATOR = { provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxDaDataComponent), multi: true, };*/ /** * @param {?} value * @return {?} */ export function createDaDataValidator(value) { return function (c) { /** @type {?} */ var err = { rangeError: { given: c.value, expected: value, } }; return (c.value !== value) ? err : null; }; } var NgxDaDataComponent = /** @class */ (function () { function NgxDaDataComponent(dataService, _r) { this.dataService = dataService; this._r = _r; this._value = ''; this.currentFocus = -1; this.data = []; this.config = DaDataConfigDefault; this.disabled = null; this.type = DaDataType.address; this.options = null; this.limit = DaDataConfigDefault.limit; this.placeholder = ''; this.selected = new EventEmitter(); this.input = new EventEmitter(); this.inputString$ = new Subject(); // onSuggestionSelected = (value: string) => {}; this.onTouched = function () { }; this.propagateChange = function () { }; this.validateFn = function () { }; } Object.defineProperty(NgxDaDataComponent.prototype, "value", { get: /** * @return {?} */ function () { return this._value; }, set: /** * @param {?} v * @return {?} */ function (v) { if (v !== this._value) { this._value = v; this.propagateChange(v); this.input.emit(v); } }, enumerable: true, configurable: true }); /** * @return {?} */ NgxDaDataComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; /*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(function () { return timer(_this.config.delay ? _this.config.delay : 500); })).subscribe(function (x) { _this.dataService.getData(x, _this.type, _this.limit, _this.options).subscribe(function (y) { _this.data = y.suggestions; }); }); }; /** * @param {?} changes * @return {?} */ NgxDaDataComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.value) { } }; /** * @param {?} value * @return {?} */ NgxDaDataComponent.prototype.getData = /** * @param {?} value * @return {?} */ function (value) { this.inputString$.next(value); this.currentFocus = -1; }; /** * @param {?} e * @param {?} item * @return {?} */ NgxDaDataComponent.prototype.onClick = /** * @param {?} e * @param {?} item * @return {?} */ function (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 {?} */ NgxDaDataComponent.prototype.onOutsideClick = /** * @return {?} */ function () { this.data = []; }; /** * @return {?} */ NgxDaDataComponent.prototype.onArrowDown = /** * @return {?} */ function () { this.removeFocus(this.currentFocus); if (this.currentFocus >= this.data.length - 1) { this.currentFocus = 0; } else { this.currentFocus++; } this.setFocus(this.currentFocus); }; /** * @return {?} */ NgxDaDataComponent.prototype.onArrowUp = /** * @return {?} */ function () { this.removeFocus(this.currentFocus); if (this.currentFocus === 0) { this.currentFocus = this.data.length - 1; } else { this.currentFocus--; } this.setFocus(this.currentFocus); }; /** * @return {?} */ NgxDaDataComponent.prototype.onEnter = /** * @return {?} */ function () { 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 {?} */ NgxDaDataComponent.prototype.setFocus = /** * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var activeEl = document.getElementById(id + "item"); this._r.addClass(activeEl, "active"); }; /** * @param {?} id * @return {?} */ NgxDaDataComponent.prototype.removeFocus = /** * @param {?} id * @return {?} */ function (id) { if (id !== -1) { /** @type {?} */ var activeEl = document.getElementById(id + "item"); this._r.removeClass(activeEl, "active"); } }; /** * @param {?} value * @return {?} */ NgxDaDataComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value !== undefined) { this._value = value; } // this.onSuggestionSelected(value); }; /** * Set the function to be called * when the control receives a change event. * * @param fn a function */ /** * Set the function to be called * when the control receives a change event. * * @param {?} fn a function * @return {?} */ NgxDaDataComponent.prototype.registerOnChange = /** * Set the function to be called * when the control receives a change event. * * @param {?} fn a function * @return {?} */ function (fn) { // this.onSuggestionSelected = fn; this.propagateChange = fn; }; /** * Set the function to be called * when the control receives a touch event. * * @param fn a function */ /** * Set the function to be called * when the control receives a touch event. * * @param {?} fn a function * @return {?} */ NgxDaDataComponent.prototype.registerOnTouched = /** * Set the function to be called * when the control receives a touch event. * * @param {?} fn a function * @return {?} */ function (fn) { this.onTouched = fn; }; /** * Implements disabled state for this element * * @param isDisabled */ /** * Implements disabled state for this element * * @param {?} isDisabled * @return {?} */ NgxDaDataComponent.prototype.setDisabledState = /** * Implements disabled state for this element * * @param {?} isDisabled * @return {?} */ function (isDisabled) { alert("disabled!"); this.disabled = isDisabled; }; NgxDaDataComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-da-data', template: "<div class=\"autocomplete\">\r\n <label for=\"address_input\"></label>\r\n <input [disabled]=\"disabled ? true : null\" type=\"text\" id=\"address_input\" name=\"address\" class=\"search\" #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 </div>\r\n </div>\r\n </div>\r\n</div>\r\n", providers: [NGX_DADATA_VALUE_ACCESSOR,], styles: [".autocomplete{position:relative}input{border:0 solid transparent;background-color:#f1f1f1;padding:5px}input[type=text]{background-color:#f1f1f1;width:100%}input[type=submit]{background-color:#1e90ff;color:#fff}.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}"] }] } ]; NgxDaDataComponent.ctorParameters = function () { return [ { type: NgxDaDataService }, { type: Renderer2 } ]; }; NgxDaDataComponent.propDecorators = { config: [{ type: Input }], apiKey: [{ type: Input }], disabled: [{ type: Input }], type: [{ type: Input }], options: [{ type: Input }], limit: [{ type: Input }], placeholder: [{ type: Input }], selectedSuggestion: [{ type: Output }], selected: [{ type: Output }], input: [{ type: Output }], inputValue: [{ type: ViewChild, args: ['inputValue',] }], onOutsideClick: [{ type: HostListener, args: ['document:click',] }] }; return NgxDaDataComponent; }()); export { NgxDaDataComponent }; if (false) { /** @type {?} */ NgxDaDataComponent.prototype._value; /** @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.options; /** @type {?} */ NgxDaDataComponent.prototype.limit; /** @type {?} */ NgxDaDataComponent.prototype.placeholder; /** @type {?} */ NgxDaDataComponent.prototype.selectedSuggestion; /** @type {?} */ NgxDaDataComponent.prototype.selected; /** @type {?} */ NgxDaDataComponent.prototype.input; /** @type {?} */ NgxDaDataComponent.prototype.inputValue; /** @type {?} */ NgxDaDataComponent.prototype.inputString$; /** @type {?} */ NgxDaDataComponent.prototype.onTouched; /** @type {?} */ NgxDaDataComponent.prototype.propagateChange; /** @type {?} */ NgxDaDataComponent.prototype.validateFn; /** @type {?} */ NgxDaDataComponent.prototype.dataService; /** @type {?} */ NgxDaDataComponent.prototype._r; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhLWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG11enlrYW50b3Yvbmd4LWRhZGF0YS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtZGEtZGF0YS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBZSxtQkFBbUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBbUQsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFHN0YseUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaOzs7Ozs7Ozs7O0FBUUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQUs7SUFDekMsT0FBTyxVQUFDLENBQWM7O1lBQ2QsR0FBRyxHQUFHO1lBQ1YsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztnQkFDZCxRQUFRLEVBQUUsS0FBSzthQUNoQjtTQUNGO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFD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QUNwRCxvQ0FBd0I7O0lBQ3hCLHNDQUF5Qjs7SUFDekIsa0NBQW1DOztJQUNuQyxxQ0FBd0I7O0lBQ3hCLG1DQUEyQzs7SUFDM0MseUNBQTBCOztJQUUxQixnREFBK0M7O0lBQy9DLHNDQUEwRDs7SUFDMUQsbUNBQTBDOztJQUkxQyx3Q0FBZ0Q7O0lBRWhELDBDQUE2Qzs7SUFHN0MsdUNBQXFCOztJQUNyQiw2Q0FBZ0M7O0lBQ2hDLHdDQUEyQjs7SUFFZix5Q0FBcUM7O0lBQUUsZ0NBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RGFEYXRhVHlwZSwgTmd4RGFEYXRhU2VydmljZX0gZnJvbSBcIi4vbmd4LWRhLWRhdGEuc2VydmljZVwiO1xyXG5pbXBvcnQge1N1YmplY3QsIHRpbWVyfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2RlYm91bmNlfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtEYURhdGFSZXNwb25zZX0gZnJvbSBcIi4vbW9kZWxzL2RhLWRhdGEtcmVzcG9uc2VcIjtcclxuaW1wb3J0IHtEYURhdGFTdWdnZXN0aW9ufSBmcm9tIFwiLi9tb2RlbHMvc3VnZ2VzdGlvblwiO1xyXG5pbXBvcnQge0RhRGF0YUNvbmZpZywgRGFEYXRhQ29uZmlnRGVmYXVsdH0gZnJvbSBcIi4vZGEtZGF0YS1jb25maWdcIjtcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtEYURhdGFBZGRyZXNzLCBEYURhdGFCYW5rLCBEYURhdGFFbWFpbCwgRGFEYXRhRklPLCBEYURhdGFQYXJ0eX0gZnJvbSBcIi4vbW9kZWxzL2RhdGFcIjtcclxuXHJcbmNvbnN0IE5HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFEYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuLypjb25zdCBOR1hfREFEQVRBX1ZBTElEQVRPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neERhRGF0YUNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWUsXHJcbn07Ki9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYURhdGFWYWxpZGF0b3IodmFsdWUpIHtcclxuICByZXR1cm4gKGM6IEZvcm1Db250cm9sKSA9PiB7XHJcbiAgICBjb25zdCBlcnIgPSB7XHJcbiAgICAgIHJhbmdlRXJyb3I6IHtcclxuICAgICAgICBnaXZlbjogYy52YWx1ZSxcclxuICAgICAgICBleHBlY3RlZDogdmFsdWUsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChjLnZhbHVlICE9PSB2YWx1ZSkgPyBlcnIgOiBudWxsO1xyXG4gIH07XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWRhLWRhdGEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtZGEtZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWRhLWRhdGEuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtOR1hfREFEQVRBX1ZBTFVFX0FDQ0VTU09SLCAvKk5HWF9EQURBVEFfVkFMSURBVE9SKi9dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hEYURhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSAnJztcclxuICBjdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgZGF0YTogRGFEYXRhU3VnZ2VzdGlvbltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZzogRGFEYXRhQ29uZmlnID0gRGFEYXRhQ29uZmlnRGVmYXVsdDtcclxuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IG51bGw7XHJcbiAgQElucHV0KCkgdHlwZSA9IERhRGF0YVR5cGUuYWRkcmVzcztcclxuICBASW5wdXQoKSBvcHRpb25zID0gbnVsbDtcclxuICBASW5wdXQoKSBsaW1pdCA9IERhRGF0YUNvbmZpZ0RlZmF1bHQubGltaXQ7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkU3VnZ2VzdGlvbjogRGFEYXRhU3VnZ2VzdGlvbjtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhRGF0YVN1Z2dlc3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpIGlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgLy8gQE91dHB1dCgpIHNlbGVjdGVkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8RGFEYXRhQWRkcmVzcyB8IERhRGF0YUZJTyB8IERhRGF0YUJhbmsgfCBEYURhdGFQYXJ0eSB8IERhRGF0YUVtYWlsPigpO1xyXG4gIC8vIEBPdXRwdXQoKSBzZWxlY3RlZFN0cmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dFZhbHVlJykgaW5wdXRWYWx1ZTogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBpbnB1dFN0cmluZyQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIC8vIG9uU3VnZ2VzdGlvblNlbGVjdGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHt9O1xyXG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG4gIHByb3BhZ2F0ZUNoYW5nZTogYW55ID0gKCkgPT4ge307XHJcbiAgdmFsaWRhdGVGbjogYW55ID0gKCkgPT4ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0YVNlcnZpY2U6IE5neERhRGF0YVNlcnZpY2UsIHByaXZhdGUgX3I6IFJlbmRlcmVyMikge1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2KTtcclxuXHJcbiAgICAgIHRoaXMuaW5wdXQuZW1pdCh2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLyp0aGlzLnZhbGlkYXRlRm4gPSBjcmVhdGVEYURhdGFWYWxpZGF0b3IodGhpcy5fdmFsdWUpO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fdmFsdWUpOyovXHJcbiAgICB0aGlzLnR5cGUgPSB0aGlzLmNvbmZpZy50eXBlOyAgICBcclxuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc2V0QXBpS2V5KHRoaXMuYXBpS2V5ID8gdGhpcy5hcGlLZXkgOiB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgdGhpcy5pbnB1dFN0cmluZyQucGlwZShcclxuICAgICAgZGVib3VuY2UoKCkgPT4gdGltZXIodGhpcy5jb25maWcuZGVsYXkgPyB0aGlzLmNvbmZpZy5kZWxheSA6IDUwMCkpLFxyXG4gICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0RGF0YSh4LCB0aGlzLnR5cGUsIHRoaXMubGltaXQsIHRoaXMub3B0aW9ucykuc3Vic2NyaWJlKCh5OiBEYURhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHkuc3VnZ2VzdGlvbnM7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy52YWx1ZSkge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERhdGEodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5pbnB1dFN0cmluZyQubmV4dCh2YWx1ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG4gIH1cclxuXHJcbiAgb25DbGljayhlOiBNb3VzZUV2ZW50LCBpdGVtOiBEYURhdGFTdWdnZXN0aW9uKSB7XHJcbiAgICAvL2UucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gaXRlbS52YWx1ZTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGl0ZW0udmFsdWUpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gaXRlbTtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgICAvL3RoaXMud3JpdGVWYWx1ZShpdGVtLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRTdHJpbmcuZW1pdChpdGVtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBvbk91dHNpZGVDbGljaygpIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgb25BcnJvd0Rvd24oKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA+PSB0aGlzLmRhdGEubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cysrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgfVxyXG5cclxuICBvbkFycm93VXAoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA9PT0gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IHRoaXMuZGF0YS5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMtLTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Rm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gIH1cclxuXHJcbiAgb25FbnRlcigpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gdGhpcy5kYXRhW3RoaXMuY3VycmVudEZvY3VzXTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWU7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZSk7XHJcbiAgICAvLyB0aGlzLndyaXRlVmFsdWUodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24uZGF0YSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkU3RyaW5nLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0Rm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArIFwiaXRlbVwiKTtcclxuICAgIHRoaXMuX3IuYWRkQ2xhc3MoYWN0aXZlRWwsIFwiYWN0aXZlXCIpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGlkICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgXCJpdGVtXCIpO1xyXG4gICAgICB0aGlzLl9yLnJlbW92ZUNsYXNzKGFjdGl2ZUVsLCBcImFjdGl2ZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcclxuICAgKiB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0ZWQgPSBmbjtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmbiBhIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudHMgZGlzYWJsZWQgc3RhdGUgZm9yIHRoaXMgZWxlbWVudFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWRcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwiZGlzYWJsZWQhXCIpO1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==