UNPKG

ngx-ui-hero

Version:

Simple, fast and reliable utilities for Angular.

276 lines 50.1 kB
import { Component, EventEmitter, Inject, Input, IterableDiffers, Optional, Output, ViewChild } from '@angular/core';
import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgModel } from '@angular/forms';
import { ElementBase } from '../../base/element-base';
import { INPUT_FORMS_CONFIG } from '../../input-forms-config.constants';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "../../../ui/directives/debounce.directive";
import * as i4 from "../../../ui/directives/click-outside.directive";
import * as i5 from "../../../ui/directives/auto-focus.directive";
import * as i6 from "../../../ui/components/spinner/spinner.component";
import * as i7 from "ngx-bootstrap/tooltip";
import * as i8 from "../input-validations/input-validations.component";
let identifier = 0;
export class InputDropdownSearchComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.clickOutsideEnabled = true;
        this.searchCounter = 0;
        this.selectedItemIndex = -1;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.emptyResultsMessage = 'No results found at this moment.';
        this.minCharsToSearch = 3;
        this.onChange = new EventEmitter();
        this.onSearch = new EventEmitter();
        this.identifier = `input-dropdown-search-${identifier++}`;
        if (config.dropDown) {
            Object.assign(this, config.dropDown);
        }
        this._differData = this.iterableDiffers.find([]).create(null);
    }
    get data() {
        return this._data;
    }
    set data(value) {
        this._data = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInData = this._differData.diff(this._data);
        if (changesInData || !this.modelInitialized || this.value != this._lastModelInitialized) {
            this.Init();
        }
    }
    Init() {
        this.clearSearch();
        if (!this.internalData || this.internalData.length == 0) {
            return;
        }
        if (this.value != null && this.value != undefined) {
            this.setSelectedItemByTheCurrentModelValue();
            this._lastModelInitialized = this.value;
        }
        else {
            this.selectedDisplayText = '';
            this._lastModelInitialized = undefined;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if (this.clickOutsideEnabled) {
            if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
                return;
            if (value == undefined) {
                if (this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = !this.showDropdown;
            }
            else {
                if (!value && this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = value;
            }
            if (this.lazyLoadedData) {
                this.search = '';
                this.internalData = [];
            }
            else {
                this.clearSearch(true);
            }
        }
        else {
            this.clickOutsideEnabled = true;
        }
    }
    Select(row) {
        if (this.disabled) {
            this.ToggleDropDown(null, false);
            return;
        }
        this.value = this.renderPropertyValue(this.valueProperty, row);
        this.onChange.emit(this.value);
        this.ToggleDropDown(null, false);
    }
    OnSearch() {
        if (this.lazyLoadedData) {
            this.onSearch.emit(this.search);
            this.searchCounter += 1;
            return;
        }
        if (!this.search || this.search.length < this.minCharsToSearch) {
            this.clearSearchResults();
            return;
        }
        this.filterData();
    }
    ClearSelection(e) {
        this.value = null;
        this.selectedDisplayText = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        if (e)
            e.stopPropagation();
    }
    SetLoading(value) {
        this.loading = value;
    }
    OnArrowsPressed(event) {
        if (event.keyCode == 13) {
            this.Select(this.internalData[this.selectedItemIndex]);
        }
        else if (event.keyCode >= 37 && event.keyCode <= 40) {
            this.handleArrows(event.keyCode);
        }
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    handleOptionsScrollerDown() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition >= scrollPositionStart && currentPosition < scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 6) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleOptionsScrollerUp() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition > scrollPositionStart && currentPosition <= scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 1) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleArrows(keyCode) {
        switch (keyCode) {
            case 38: //ArrouUp
                if (this.selectedItemIndex > 0) {
                    this.selectedItemIndex -= 1;
                }
                this.handleOptionsScrollerUp();
                break;
            case 40: //ArrouDown
                if (this.selectedItemIndex < (this.internalData.length - 1)) {
                    this.selectedItemIndex += 1;
                }
                this.handleOptionsScrollerDown();
                break;
        }
    }
    setSelectedItemByTheCurrentModelValue() {
        if (this.value == null || this.value == undefined)
            return;
        let row = this.data.find(x => this.value == this.renderPropertyValue(this.valueProperty, x));
        if (row) {
            this.selectedDisplayText = this.renderPropertyValue(this.displayTextProperty, row);
        }
    }
    filterData() {
        this.internalData = this.data.filter(x => {
            let value = this.renderPropertyValue(this.displayTextProperty, x);
            if (value && value.toString().toUpperCase().indexOf(this.search.toUpperCase()) >= 0) {
                return true;
            }
            return false;
        });
    }
    clearSearch(clearSearchInput) {
        if (clearSearchInput) {
            this.search = '';
        }
        this.clearSearchResults();
    }
    clearSearchResults() {
        this.selectedItemIndex = -1;
        this.internalData = Object.assign([], this.data);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
}
InputDropdownSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownSearchComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
InputDropdownSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputDropdownSearchComponent, selector: "input-dropdown-search", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", emptyResultsMessage: "emptyResultsMessage", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", lazyLoadedData: "lazyLoadedData", minCharsToSearch: "minCharsToSearch", data: "data" }, outputs: { onChange: "onChange", onSearch: "onSearch" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputDropdownSearchComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-dropdown-search\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || (value != null && value != undefined)),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && (value == null || value == undefined)\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{value != null && value != undefined && selectedDisplayText ? selectedDisplayText : placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"(value != null && value != undefined) && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce \n          (callback)=\"OnSearch()\" (arrowsCallback)=\"OnArrowsPressed($event)\" />\n      </div>\n\n      <div class=\"loading\" *ngIf=\"loading\">\n        <spinner></spinner>\n      </div>\n\n      <div *ngIf=\"!loading && internalData?.length > 0\">\n        <div class=\"result-list\">\n          <div class=\"list-item\" \n            *ngFor=\"let item of internalData; let i = index;\" \n            (click)=\"Select(item)\" \n            [ngClass]=\"{\n              'active': value == item[valueProperty],\n              'focused': selectedItemIndex == i\n            }\">\n            {{item[displayTextProperty]}}\n          </div>\n        </div>\n      </div>\n\n      <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-search{position:relative}.ui-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-dropdown-search>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.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"] }, { kind: "directive", type: i3.DebounceDirective, selector: "[debounce]", inputs: ["delay"], outputs: ["callback", "arrowsCallback"] }, { kind: "directive", type: i4.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: i5.AutoFocusDirective, selector: "[auto-focus]" }, { kind: "component", type: i6.SpinnerComponent, selector: "spinner", inputs: ["noMargins"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i8.InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownSearchComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-dropdown-search', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputDropdownSearchComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-dropdown-search\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || (value != null && value != undefined)),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && (value == null || value == undefined)\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{value != null && value != undefined && selectedDisplayText ? selectedDisplayText : placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"(value != null && value != undefined) && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce \n          (callback)=\"OnSearch()\" (arrowsCallback)=\"OnArrowsPressed($event)\" />\n      </div>\n\n      <div class=\"loading\" *ngIf=\"loading\">\n        <spinner></spinner>\n      </div>\n\n      <div *ngIf=\"!loading && internalData?.length > 0\">\n        <div class=\"result-list\">\n          <div class=\"list-item\" \n            *ngFor=\"let item of internalData; let i = index;\" \n            (click)=\"Select(item)\" \n            [ngClass]=\"{\n              'active': value == item[valueProperty],\n              'focused': selectedItemIndex == i\n            }\">\n            {{item[displayTextProperty]}}\n          </div>\n        </div>\n      </div>\n\n      <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-search{position:relative}.ui-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-dropdown-search>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"] }]
        }], ctorParameters: function () { return [{ type: undefined, decorators: [{
                    type: Optional
                }, {
                    type: Inject,
                    args: [NG_VALIDATORS]
                }] }, { type: undefined, decorators: [{
                    type: Optional
                }, {
                    type: Inject,
                    args: [NG_ASYNC_VALIDATORS]
                }] }, { type: undefined, decorators: [{
                    type: Inject,
                    args: [INPUT_FORMS_CONFIG]
                }] }, { type: i0.IterableDiffers }]; }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], lazyLoadedData: [{
                type: Input
            }], minCharsToSearch: [{
                type: Input
            }], onChange: [{
                type: Output
            }], onSearch: [{
                type: Output
            }], data: [{
                type: Input,
                args: ['data']
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZHJvcGRvd24tc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11aS1oZXJvL3NyYy9saWIvaW5wdXQtZm9ybXMvY29tcG9uZW50cy9pbnB1dC1kcm9wZG93bi1zZWFyY2gvaW5wdXQtZHJvcGRvd24tc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11aS1oZXJvL3NyYy9saWIvaW5wdXQtZm9ybXMvY29tcG9uZW50cy9pbnB1dC1kcm9wZG93bi1zZWFyY2gvaW5wdXQtZHJvcGRvd24tc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7O0FBSXhFLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQVluQixNQUFNLE9BQU8sNEJBQTZCLFNBQVEsV0FBZ0I7SUFxQ2hFLFlBQ3FDLFVBQTBCLEVBQ3BCLGVBQW9DLEVBQ3hDLE1BQXdCLEVBQ3JELGVBQWdDO1FBRXhDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSE4sV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFDckQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBakMxQyx3QkFBbUIsR0FB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USxDQUFDO0lBQ2xCLENBQUM7OzBIQTNQVSw0QkFBNEIsa0JBc0NqQixhQUFhLDZCQUNiLG1CQUFtQiw2QkFDOUIsa0JBQWtCOzhHQXhDbEIsNEJBQTRCLHVZQU41QixDQUFDO1lBQ1YsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsNEJBQTRCO1lBQ3pDLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxpRUFpQlMsT0FBTyxxRkNyQ3BCLGl4RkFnRUE7NEZEMUNhLDRCQUE0QjtrQkFWeEMsU0FBUzsrQkFDRSx1QkFBdUIsYUFHdEIsQ0FBQzs0QkFDVixPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLDhCQUE4Qjs0QkFDekMsS0FBSyxFQUFFLElBQUk7eUJBQ1osQ0FBQzs7MEJBd0NDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQ2hDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsTUFBTTsyQkFBRSxrQkFBa0I7MEVBekJPLEtBQUs7c0JBQXhDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDbEIsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNXLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsUUFBUTtzQkFBeEIsTUFBTTtnQkFNSCxJQUFJO3NCQURQLEtBQUs7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBJdGVyYWJsZURpZmZlcnMsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19BU1lOQ19WQUxJREFUT1JTLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRWxlbWVudEJhc2UgfSBmcm9tICcuLi8uLi9iYXNlL2VsZW1lbnQtYmFzZSc7XG5pbXBvcnQgeyBBc3luY1ZhbGlkYXRvckFycmF5LCBWYWxpZGF0b3JBcnJheSB9IGZyb20gJy4uLy4uL2Jhc2UvdmFsaWRhdGUnO1xuaW1wb3J0IHsgSW5wdXRGb3Jtc0NvbmZpZyB9IGZyb20gJy4uLy4uL2lucHV0LWZvcm1zLWNvbmZpZyc7XG5pbXBvcnQgeyBJTlBVVF9GT1JNU19DT05GSUcgfSBmcm9tICcuLi8uLi9pbnB1dC1mb3Jtcy1jb25maWcuY29uc3RhbnRzJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5sZXQgaWRlbnRpZmllciA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lucHV0LWRyb3Bkb3duLXNlYXJjaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1kcm9wZG93bi1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbnB1dC1kcm9wZG93bi1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBJbnB1dERyb3Bkb3duU2VhcmNoQ29tcG9uZW50LFxuICAgIG11bHRpOiB0cnVlXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIElucHV0RHJvcGRvd25TZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBFbGVtZW50QmFzZTxhbnk+IGltcGxlbWVudHMgT25Jbml0IHsgXG4gIHByaXZhdGUgX2xhc3RNb2RlbEluaXRpYWxpemVkOiBhbnk7XG4gIHByaXZhdGUgX2RpZmZlckRhdGE6IGFueTtcbiAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8YW55PjtcbiAgc2hvd0Ryb3Bkb3duOiBib29sZWFuO1xuICBjb21ib1RvdWNoZWQ6IGJvb2xlYW47XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIG1vZGVsSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIGNsaWNrT3V0c2lkZUVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBzZWFyY2g6IHN0cmluZztcbiAgc2VsZWN0ZWREaXNwbGF5VGV4dDogc3RyaW5nO1xuICBpbnRlcm5hbERhdGE6IEFycmF5PGFueT47XG4gIHNlYXJjaENvdW50ZXI6IG51bWJlciA9IDA7XG4gIHNlbGVjdGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcbiAgXG4gIEBWaWV3Q2hpbGQoTmdNb2RlbCwge3N0YXRpYzogdHJ1ZX0pIG1vZGVsOiBOZ01vZGVsO1xuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXIgPSAnU2VsZWN0Li4uJztcbiAgQElucHV0KCkgcHVibGljIHNlYXJjaFBsYWNlaG9sZGVyID0gJ1NlYXJjaC4uLic7XG4gIEBJbnB1dCgpIHB1YmxpYyBlbXB0eVJlc3VsdHNNZXNzYWdlPzogc3RyaW5nID0gJ05vIHJlc3VsdHMgZm91bmQgYXQgdGhpcyBtb21lbnQuJztcbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXlUZXh0UHJvcGVydHk6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIHZhbHVlUHJvcGVydHk6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGxhenlMb2FkZWREYXRhOiBib29sZWFuO1xuICBASW5wdXQoKSBwdWJsaWMgbWluQ2hhcnNUb1NlYXJjaDogbnVtYmVyID0gMztcbiAgQE91dHB1dCgpIHB1YmxpYyBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgZ2V0IGRhdGEoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH0gICAgXG4gIEBJbnB1dCgnZGF0YScpXG4gIHNldCBkYXRhKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIHRoaXMuSW5pdCgpO1xuICB9XG4gIFxuICBwdWJsaWMgaWRlbnRpZmllciA9IGBpbnB1dC1kcm9wZG93bi1zZWFyY2gtJHtpZGVudGlmaWVyKyt9YDsgIFxuIFxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHZhbGlkYXRvcnM6IFZhbGlkYXRvckFycmF5LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckFycmF5LFxuICAgIEBJbmplY3QoIElOUFVUX0ZPUk1TX0NPTkZJRyApIHB1YmxpYyBjb25maWc6IElucHV0Rm9ybXNDb25maWcsXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgKSB7XG4gICAgc3VwZXIodmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCBjb25maWcpO1xuXG4gICAgaWYgKGNvbmZpZy5kcm9wRG93bikge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjb25maWcuZHJvcERvd24pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpZmZlckRhdGEgPSB0aGlzLml0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLkluaXQoKTtcbiAgfVxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgbGV0IGNoYW5nZXNJbkRhdGEgPSB0aGlzLl9kaWZmZXJEYXRhLmRpZmYodGhpcy5fZGF0YSk7XG5cbiAgICBpZiAoY2hhbmdlc0luRGF0YSB8fCAhdGhpcy5tb2RlbEluaXRpYWxpemVkIHx8IHRoaXMudmFsdWUgIT0gdGhpcy5fbGFzdE1vZGVsSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuSW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmludGVybmFsRGF0YSB8fCB0aGlzLmludGVybmFsRGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwgJiYgdGhpcy52YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtQnlUaGVDdXJyZW50TW9kZWxWYWx1ZSgpO1xuICAgICAgdGhpcy5fbGFzdE1vZGVsSW5pdGlhbGl6ZWQgPSB0aGlzLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGlzcGxheVRleHQgPSAnJztcbiAgICAgIHRoaXMuX2xhc3RNb2RlbEluaXRpYWxpemVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLm1vZGVsSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgVG9nZ2xlRHJvcERvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHZhbHVlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUVuYWJsZWQpIHtcbiAgICAgIGlmICgodmFsdWUgPT0gZmFsc2UgJiYgIXRoaXMuc2hvd0Ryb3Bkb3duKSB8fCAodmFsdWUgPT0gdW5kZWZpbmVkICYmIHRoaXMuZGlzYWJsZWQpKSByZXR1cm47XG4gICAgXG4gICAgICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dEcm9wZG93bikge1xuICAgICAgICAgIHRoaXMuc2V0Q29tYm9Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gIXRoaXMuc2hvd0Ryb3Bkb3duOyAgICAgIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnNob3dEcm9wZG93bikge1xuICAgICAgICAgIHRoaXMuc2V0Q29tYm9Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmxhenlMb2FkZWREYXRhKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKHRydWUpO1xuICAgICAgfSAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZUVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBTZWxlY3Qocm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5Ub2dnbGVEcm9wRG93bihudWxsLCBmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMucmVuZGVyUHJvcGVydHlWYWx1ZSh0aGlzLnZhbHVlUHJvcGVydHksIHJvdyk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMudmFsdWUpOyAgICBcbiAgICB0aGlzLlRvZ2dsZURyb3BEb3duKG51bGwsIGZhbHNlKTtcbiAgfVxuICBPblNlYXJjaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYXp5TG9hZGVkRGF0YSkge1xuICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHRoaXMuc2VhcmNoKTtcbiAgICAgIHRoaXMuc2VhcmNoQ291bnRlciArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWFyY2ggfHwgdGhpcy5zZWFyY2gubGVuZ3RoIDwgdGhpcy5taW5DaGFyc1RvU2VhcmNoKSB7XG4gICAgICB0aGlzLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyRGF0YSgpO1xuICB9XG4gIENsZWFyU2VsZWN0aW9uKGU/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkRGlzcGxheVRleHQgPSBudWxsO1xuICAgIHRoaXMuY29tYm9Ub3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcblxuICAgIGlmIChlKSBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIFNldExvYWRpbmcodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB2YWx1ZTtcbiAgfVxuICBPbkFycm93c1ByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgdGhpcy5TZWxlY3QodGhpcy5pbnRlcm5hbERhdGFbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA+PSAzNyAmJiBldmVudC5rZXlDb2RlIDw9IDQwKSB7XG4gICAgICB0aGlzLmhhbmRsZUFycm93cyhldmVudC5rZXlDb2RlKTtcbiAgICB9XG4gIH1cbiAgT25Db21ib1ByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgdGhpcy5Ub2dnbGVEcm9wRG93bihudWxsKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPcHRpb25zU2Nyb2xsZXJEb3duKCk6IHZvaWQge1xuICAgIHZhciBzY3JvbGwgPSAwO1xuICAgIHZhciBzY3JvbGxQb3NpdGlvblN0YXJ0ID0gJChgIyR7dGhpcy5pZGVudGlmaWVyfSAucmVzdWx0LWxpc3RgKS5zY3JvbGxUb3AoKTtcbiAgICB2YXIgc2Nyb2xsUG9zaXRpb25FbmQgPSBzY3JvbGxQb3NpdGlvblN0YXJ0ICsgKDM4ICogNik7XG4gICAgdmFyIGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggKiAzODtcblxuICAgIGlmIChjdXJyZW50UG9zaXRpb24gPj0gc2Nyb2xsUG9zaXRpb25TdGFydCAmJiBjdXJyZW50UG9zaXRpb24gPCBzY3JvbGxQb3NpdGlvbkVuZCkge1xuICAgICAgc2Nyb2xsID0gc2Nyb2xsUG9zaXRpb25TdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsID0gKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggLSA2KSAqIDM4O1xuICAgIH1cbiAgICBcbiAgICAkKGAjJHt0aGlzLmlkZW50aWZpZXJ9IC5yZXN1bHQtbGlzdGApLnNjcm9sbFRvcChzY3JvbGwpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlT3B0aW9uc1Njcm9sbGVyVXAoKTogdm9pZCB7XG4gICAgdmFyIHNjcm9sbCA9IDA7XG4gICAgdmFyIHNjcm9sbFBvc2l0aW9uU3RhcnQgPSAkKGAjJHt0aGlzLmlkZW50aWZpZXJ9IC5yZXN1bHQtbGlzdGApLnNjcm9sbFRvcCgpO1xuICAgIHZhciBzY3JvbGxQb3NpdGlvbkVuZCA9IHNjcm9sbFBvc2l0aW9uU3RhcnQgKyAoMzggKiA2KTtcbiAgICB2YXIgY3VycmVudFBvc2l0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCAqIDM4O1xuXG4gICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA+IHNjcm9sbFBvc2l0aW9uU3RhcnQgJiYgY3VycmVudFBvc2l0aW9uIDw9IHNjcm9sbFBvc2l0aW9uRW5kKSB7XG4gICAgICBzY3JvbGwgPSBzY3JvbGxQb3NpdGlvblN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JvbGwgPSAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCAtIDEpICogMzg7XG4gICAgfVxuICAgIFxuICAgICQoYCMke3RoaXMuaWRlbnRpZmllcn0gLnJlc3VsdC1saXN0YCkuc2Nyb2xsVG9wKHNjcm9sbCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd3Moa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICBjYXNlIDM4OiAvL0Fycm91VXBcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVPcHRpb25zU2Nyb2xsZXJVcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDA6IC8vQXJyb3VEb3duXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4IDwgKHRoaXMuaW50ZXJuYWxEYXRhLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCArPSAxO1xuICAgICAgICB9ICAgXG4gICAgICAgIFxuICAgICAgICB0aGlzLmhhbmRsZU9wdGlvbnNTY3JvbGxlckRvd24oKTsgICBcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRJdGVtQnlUaGVDdXJyZW50TW9kZWxWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsIHx8IHRoaXMudmFsdWUgPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBsZXQgcm93ID0gdGhpcy5kYXRhLmZpbmQoeCA9PiB0aGlzLnZhbHVlID09IHRoaXMucmVuZGVyUHJvcGVydHlWYWx1ZSh0aGlzLnZhbHVlUHJvcGVydHksIHgpKTtcbiAgICBpZiAocm93KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGlzcGxheVRleHQgPSB0aGlzLnJlbmRlclByb3BlcnR5VmFsdWUodGhpcy5kaXNwbGF5VGV4dFByb3BlcnR5LCByb3cpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbHRlckRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbERhdGEgPSB0aGlzLmRhdGEuZmlsdGVyKHggPT4ge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZW5kZXJQcm9wZXJ0eVZhbHVlKHRoaXMuZGlzcGxheVRleHRQcm9wZXJ0eSwgeCk7XG5cbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0aGlzLnNlYXJjaC50b1VwcGVyQ2FzZSgpKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhclNlYXJjaChjbGVhclNlYXJjaElucHV0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChjbGVhclNlYXJjaElucHV0KSB7XG4gICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xuICB9XG4gIHByaXZhdGUgY2xlYXJTZWFyY2hSZXN1bHRzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSAtMTtcbiAgICB0aGlzLmludGVybmFsRGF0YSA9IE9iamVjdC5hc3NpZ24oW10sIHRoaXMuZGF0YSk7ICBcbiAgfVxuICBwcml2YXRlIHNldENvbWJvVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbWJvVG91Y2hlZCA9IHRydWU7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJQcm9wZXJ0eVZhbHVlKHByb3BlcnR5UGF0aDogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IHByb3BlcnR5UGF0aC5zcGxpdCggXCIuXCIgKTtcbiAgICBsZXQgcHJvcGVydHk6IGFueSA9IG9iamVjdCB8fCB7fTtcbiAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eVtwYXJ0c1tpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG4gXG59XG4iLCI8ZGl2IFtpZF09XCJpZGVudGlmaWVyXCIgY2xhc3M9XCJ1aS1kcm9wZG93bi1zZWFyY2hcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cbiAgICB7e2xhYmVsfX1cbiAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLXN5bWJvbFwiICpuZ0lmPVwiaXNSZXF1aXJlZFwiPiAqPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIG1sLTJcIiB0b29sdGlwPVwie3toZWxwfX1cIiBjb250YWluZXI9XCJib2R5XCIgKm5nSWY9XCJoZWxwXCI+PC9pPlxuICA8L2xhYmVsPlxuXG4gIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIC8+XG4gIDxkaXYgY2xhc3M9XCJjb21ib2JveCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2hhcy12YWxpZGF0aW9ucyc6IHNob3dWYWxpZGF0aW9ucyxcbiAgICAgICdvcGVuJzogc2hvd0Ryb3Bkb3duLCBcbiAgICAgICdkaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgJ2lzLXZhbGlkJzogIXNob3dEcm9wZG93biAmJiAhZGlzYWJsZWQgJiYgY29tYm9Ub3VjaGVkICYmICghaXNSZXF1aXJlZCB8fCAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSB1bmRlZmluZWQpKSxcbiAgICAgICdpcy1pbnZhbGlkJzogIXNob3dEcm9wZG93biAmJiAhZGlzYWJsZWQgJiYgY29tYm9Ub3VjaGVkICYmIGlzUmVxdWlyZWQgJiYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkKVxuICAgIH1cIlxuICAgIChjbGljayk9XCJUb2dnbGVEcm9wRG93bigkZXZlbnQpXCIgKGtleXVwKT1cIk9uQ29tYm9QcmVzc2VkKCRldmVudClcIiB0YWJpbmRleD1cIjBcIj5cblxuICAgIDxzcGFuIGNsYXNzPVwibXItYXV0byB0ZXh0LXRydW5jYXRlXCI+e3t2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9IHVuZGVmaW5lZCAmJiBzZWxlY3RlZERpc3BsYXlUZXh0ID8gc2VsZWN0ZWREaXNwbGF5VGV4dCA6IHBsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lcyBidG4tY2xlYXItc2VsZWN0aW9uXCIgKm5nSWY9XCIodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSB1bmRlZmluZWQpICYmICFkaXNhYmxlZFwiIChjbGljayk9XCJDbGVhclNlbGVjdGlvbigkZXZlbnQpXCI+PC9pPlxuICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJ7J2ZhLWNhcmV0LWRvd24nOiAhc2hvd0Ryb3Bkb3duLCAnZmEtY2FyZXQtdXAnOiBzaG93RHJvcGRvd259XCI+PC9pPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9ucyBzaGFkb3cgZmFkZUluRG93blwiICpuZ0lmPVwic2hvd0Ryb3Bkb3duXCIgKGNsaWNrT3V0c2lkZSk9XCJUb2dnbGVEcm9wRG93bigkZXZlbnQsIGZhbHNlKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJvcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvLWZvY3VzXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBcbiAgICAgICAgICBuYW1lPVwie3tpZGVudGlmaWVyfX0tc2VhcmNoXCIgXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hcIiBcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7c2VhcmNoUGxhY2Vob2xkZXJ9fVwiXG4gICAgICAgICAgZGVib3VuY2UgXG4gICAgICAgICAgKGNhbGxiYWNrKT1cIk9uU2VhcmNoKClcIiAoYXJyb3dzQ2FsbGJhY2spPVwiT25BcnJvd3NQcmVzc2VkKCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgIDxzcGlubmVyPjwvc3Bpbm5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgaW50ZXJuYWxEYXRhPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHQtbGlzdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1cIiBcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGludGVybmFsRGF0YTsgbGV0IGkgPSBpbmRleDtcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJTZWxlY3QoaXRlbSlcIiBcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2FjdGl2ZSc6IHZhbHVlID09IGl0ZW1bdmFsdWVQcm9wZXJ0eV0sXG4gICAgICAgICAgICAgICdmb2N1c2VkJzogc2VsZWN0ZWRJdGVtSW5kZXggPT0gaVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAge3tpdGVtW2Rpc3BsYXlUZXh0UHJvcGVydHldfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1yZXN1bHRzXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAoIWxhenlMb2FkZWREYXRhIHx8IHNlYXJjaENvdW50ZXIgPiAwKSAmJiAoIWludGVybmFsRGF0YSB8fCBpbnRlcm5hbERhdGEubGVuZ3RoID09IDApXCI+e3tlbXB0eVJlc3VsdHNNZXNzYWdlfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxpbnB1dC12YWxpZGF0aW9uc1xuICAqbmdJZj1cInNob3dWYWxpZGF0aW9ucyAmJiAhZGlzYWJsZWQgJiYgY29tYm9Ub3VjaGVkICYmIChpbnZhbGlkIHwgYXN5bmMpXCJcbiAgW21lc3NhZ2VzXT1cImZhaWx1cmVzIHwgYXN5bmNcIj5cbjwvaW5wdXQtdmFsaWRhdGlvbnM+XG5cbjxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cImRlc2NyaXB0aW9uXCI+e3tkZXNjcmlwdGlvbn19PC9zbWFsbD5cbiJdfQ==