UNPKG

ngx-ntk-query-builder

Version:

Angular query builder

170 lines 55.3 kB
import { Component, forwardRef, Input } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "./services/operators.service"; import * as i3 from "@angular/common"; import * as i4 from "@angular/forms"; export class NgxQueryBuilderComponent { // private privateLanguage = 'en'; set language(value) { // this.privateLanguage = value; if (value && value.length > 0) { this.translate.use(value); } } // get language(): string { // return this.privateLanguage; // } constructor(translate, operatorsService) { this.translate = translate; this.operatorsService = operatorsService; this.fieldMap = {}; this.settings = {}; this.disabled = false; this.data = this.getEmptyRuleSetData(); /**** ControlValueAccessor START ****/ this.onChange = (data) => { }; this.onTouched = () => { }; translate.setDefaultLang('en'); translate.use('en'); } ngOnInit() { if (typeof this.fieldMap !== 'object') { throw new Error('fieldMap must be an object'); } if (typeof this.settings !== 'object') { throw new Error('settings must be an object'); } } writeValue(data) { this.data = data || this.getEmptyRuleSetData(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } /**** ControlValueAccessor END ****/ addRule() { if (this.disabled) { return; } this.data.rules.push({ field: this.getFields()[0].value, type: this.getFields()[0].type, operator: this.operatorsService.getDefaultOperator() }); this.onChange(this.data); this.onTouched(); } removeRule(index) { if (this.disabled) { return; } this.data.rules.splice(index, 1); this.onChange(this.data); this.onTouched(); } addRuleSet() { if (this.disabled) { return; } this.data.rules.push(this.getEmptyRuleSetData()); this.onChange(this.data); this.onTouched(); } removeRuleSet(index) { if (this.disabled) { return; } if (this.hasParentRuleSet()) { this.parent.rules.splice(index, 1); } this.onChange(this.data); this.onTouched(); } changeCondition(value) { if (this.disabled) { return; } this.data.condition = value; this.onChange(this.data); this.onTouched(); } changeField(rule, index) { this.data.rules[index].type = this.fieldMap[rule.field].type; this.data.rules[index].operator = this.operatorsService.getDefaultOperator(); this.data.rules[index].value = undefined; this.onChange(this.data); this.onTouched(); } hasParentRuleSet() { return !!this.parent; } getEmptyRuleSetData() { return { condition: 'and', rules: [] }; } getFields() { return Object.keys(this.fieldMap).map((value) => { const field = this.fieldMap[value]; field.value = value; return field; }); } getInputType(rule) { if (!this.fieldMap[rule.field]) { throw new Error(`No configuration for field '${rule.field}' was found!`); } const type = this.fieldMap[rule.field].type; if (this.operatorsService.getOperatorsWithoutInput().includes(rule.operator)) { return null; // No displayed input } if (this.operatorsService.MULTI_SELECT_OPERATORS.includes(rule.operator)) { return (type === this.operatorsService.INPUT_TYPE_SELECT) ? this.operatorsService.INPUT_TYPE_MULTI_SELECT : type; } return type; } getRuleOptions(rule) { return this.fieldMap[rule.field].options ? this.fieldMap[rule.field].options : []; } convertToRuleSet(model) { return model; } convertToRule(model) { return model; } } NgxQueryBuilderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxQueryBuilderComponent, deps: [{ token: i1.TranslateService }, { token: i2.OperatorsService }], target: i0.ɵɵFactoryTarget.Component }); NgxQueryBuilderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: NgxQueryBuilderComponent, selector: "ngx-ntk-query-builder", inputs: { fieldMap: "fieldMap", settings: "settings", disabled: "disabled", data: "data", parent: "parent", index: "index", language: "language" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxQueryBuilderComponent), multi: true }], ngImport: i0, template: "<div class=\"ngx-ntk-query-builder\" [ngClass]=\"{'disabled': disabled}\">\r\n <div class=\"ngx-ntk-query-group-controls\">\r\n <div class=\"ngx-condition-switcher\">\r\n <div>\r\n <input name=\"{{'condition' + index}}\" type=\"radio\" class=\"ngx-switch-radio\" [(ngModel)]=\"data.condition\"\r\n value=\"and\" #andOption>\r\n <label (click)=\"changeCondition(andOption.value)\" class=\"ngx-ntk-query-control ngx-switch-label\">\r\n {{'querybuilder.And' |\r\n translate}}</label>\r\n </div>\r\n <div>\r\n <input name=\"{{'condition' + index}}\" type=\"radio\" class=\"ngx-switch-radio\" [(ngModel)]=\"data.condition\"\r\n value=\"or\" #orOption>\r\n <label (click)=\"changeCondition(orOption.value)\"\r\n class=\"ngx-ntk-query-control ngx-switch-label\">{{'querybuilder.Or' |\r\n translate}}</label>\r\n </div>\r\n </div>\r\n <div class=\"ngx-actions\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-add\" (click)=\"addRule()\">\r\n {{'querybuilder.AddRule' | translate}}\r\n </button>\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-add\"\r\n (click)=\"addRuleSet()\">\r\n {{'querybuilder.AddGroup' | translate}}\r\n </button>\r\n <ng-container *ngIf=\"hasParentRuleSet()\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-remove\"\r\n (click)=\"removeRuleSet(index)\">\r\n {{'querybuilder.Remove' | translate}}\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-ntk-query-conditions\">\r\n <ul *ngIf=\"data.rules && data.rules.length > 0\">\r\n <li *ngFor=\"let child of data.rules; let i = index\" class=\"ngx-connector\">\r\n <!-- rule -->\r\n <ng-container *ngIf=\"!child['rules']\">\r\n <div class=\"ngx-rule-wrap\">\r\n <div class=\"ngx-rule\">\r\n <div class=\"ngx-field\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['field']\"\r\n (change)=\"changeField(convertToRule(child), i)\" [disabled]=\"disabled\">\r\n <option *ngFor=\"let field of getFields()\" [value]=\"field.value\">\r\n {{field.name}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"ngx-operator\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['operator']\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let operator of operatorsService.getOperators(convertToRule(child), fieldMap)\"\r\n [value]=\"operator\">\r\n {{this.translate.instant(operatorsService.getOperatorDisplayName(operator)) }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"ngx-value\" [ngSwitch]=\"getInputType(convertToRule(child))\">\r\n <!-- STING -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_STRING\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"text\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_INTEGER\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"number\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- DOUBLE -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_DOUBLE\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"number\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_DATE\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"date\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- TIME -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_TIME\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"time\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- BOOLEAN -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_BOOLEAN\">\r\n <div class=\"ngx-ntk-query-boolean-wrap\">\r\n <div class=\"ngx-boolean\">\r\n <input id=\"{{'booleanYes' + i}}\" name=\"{{'boolean' + i}}\" type=\"radio\" class=\"ngx-radio-btn\"\r\n [(ngModel)]=\"child['value']\" [value]=\"true\" [disabled]=\"disabled\">\r\n <label for=\"{{'booleanYes' + i}}\" class=\"ngx-label\">{{'querybuilder.Yes' | translate}}</label>\r\n </div>\r\n <div class=\"ngx-boolean\">\r\n <input id=\"{{'booleanNo' + i}}\" name=\"{{'boolean' + i}}\" type=\"radio\" class=\"ngx-radio-btn\"\r\n [(ngModel)]=\"child['value']\" [value]=\"false\" [disabled]=\"disabled\">\r\n <label for=\"{{'booleanNo' + i}}\" class=\"ngx-label\">{{'querybuilder.No' | translate}}</label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- SELECT -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_SELECT\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let opt of getRuleOptions(convertToRule(child))\" [value]=\"opt.value\">\r\n {{opt.name}}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- MULTI_SELECT -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_MULTI_SELECT\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-multi-select\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\" multiple>\r\n <option *ngFor=\"let opt of getRuleOptions(convertToRule(child))\" [ngValue]=\"opt.value\">\r\n {{opt.name}}\r\n </option>\r\n </select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-rule-controls\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-remove\"\r\n (click)=\"removeRule(i)\">\r\n {{'querybuilder.Remove' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- rule set -->\r\n <ng-container *ngIf=\"child['rules']\">\r\n <ngx-ntk-query-builder [data]=\"convertToRuleSet(child) \" [fieldMap]=\"fieldMap\" [parent]=\"data\"\r\n [disabled]=\"disabled\" [index]=\"i\">\r\n </ngx-ntk-query-builder>\r\n </ng-container>\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: [".ngx-ntk-query-builder.disabled{opacity:.5}.ngx-ntk-query-builder.disabled .ngx-ntk-query-btn-add:hover{background-color:#5cb85c;border-color:#4cae4c}.ngx-ntk-query-builder.disabled .ngx-ntk-query-btn-remove:hover{background-color:#dc3545;border-color:#dc3545}.ngx-ntk-query-group-controls{display:flex}.ngx-ntk-query-group-controls .ngx-condition-switcher{flex:1 0 auto}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-label{float:left;margin-bottom:0;font-weight:400;text-align:center;text-shadow:none;box-sizing:border-box;background-color:#337ab7;border-color:#2e6da4;color:#fff;transition-duration:.3s}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-label:hover{cursor:pointer;background-color:#286090}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-radio{position:absolute;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-radio:checked+.ngx-switch-label{color:#fff;background-color:#286090;border-color:#204d74}.ngx-ntk-query-group-controls .ngx-actions{display:flex;margin-right:10px}.ngx-ntk-query-conditions ul{margin:0;padding:0 10px 0 25px}.ngx-ntk-query-conditions li{list-style:none}.ngx-ntk-query-conditions li.ngx-connector{position:relative;border:1px solid #cccccc;margin:8px 0;padding:10px}.ngx-ntk-query-conditions li.ngx-connector:before{top:-9px;border-width:0 0 2px 2px}.ngx-ntk-query-conditions li.ngx-connector:after{border-width:0 0 0 2px;top:50%}.ngx-ntk-query-conditions li.ngx-connector:before,.ngx-ntk-query-conditions li.ngx-connector:after{content:\"\";left:-14px;border-color:#ccc;border-style:solid;width:12px;height:calc(50% + 9px);position:absolute}.ngx-ntk-query-conditions li.ngx-connector:last-child:after{content:none}.ngx-ntk-query-conditions .ngx-rule-wrap{display:flex;flex-wrap:wrap}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule{flex:1;margin-right:10px;display:flex;flex-wrap:wrap}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-field,.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-operator,.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-value{display:flex;align-items:center;padding:5px 0;margin-right:15px}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule-controls{padding:8px 0}.ngx-ntk-query-control{padding:0 .75rem;height:40px;line-height:40px;font-size:1rem}.ngx-ntk-query-input,.ngx-ntk-query-select,.ngx-ntk-query-multi-select{display:block;width:100%;color:#495057;padding:.5rem .75rem;background-color:#fff;box-sizing:border-box;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem}.ngx-ntk-query-multi-select{height:auto;max-height:200px}.ngx-ntk-query-boolean-wrap{display:flex;color:#495057}.ngx-ntk-query-btn{display:inline-block;font-weight:400;color:#fff;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;outline:none;transition-duration:.3s}.ngx-ntk-query-btn-add{background-color:#5cb85c;border-color:#4cae4c}.ngx-ntk-query-btn-add:hover{background-color:#449d44;border-color:#398439}.ngx-ntk-query-btn-remove{background-color:#dc3545;border-color:#dc3545}.ngx-ntk-query-btn-remove:hover{background-color:#c82333;border-color:#bd2130}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NgxQueryBuilderComponent, selector: "ngx-ntk-query-builder", inputs: ["fieldMap", "settings", "disabled", "data", "parent", "index", "language"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxQueryBuilderComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-ntk-query-builder', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxQueryBuilderComponent), multi: true }], template: "<div class=\"ngx-ntk-query-builder\" [ngClass]=\"{'disabled': disabled}\">\r\n <div class=\"ngx-ntk-query-group-controls\">\r\n <div class=\"ngx-condition-switcher\">\r\n <div>\r\n <input name=\"{{'condition' + index}}\" type=\"radio\" class=\"ngx-switch-radio\" [(ngModel)]=\"data.condition\"\r\n value=\"and\" #andOption>\r\n <label (click)=\"changeCondition(andOption.value)\" class=\"ngx-ntk-query-control ngx-switch-label\">\r\n {{'querybuilder.And' |\r\n translate}}</label>\r\n </div>\r\n <div>\r\n <input name=\"{{'condition' + index}}\" type=\"radio\" class=\"ngx-switch-radio\" [(ngModel)]=\"data.condition\"\r\n value=\"or\" #orOption>\r\n <label (click)=\"changeCondition(orOption.value)\"\r\n class=\"ngx-ntk-query-control ngx-switch-label\">{{'querybuilder.Or' |\r\n translate}}</label>\r\n </div>\r\n </div>\r\n <div class=\"ngx-actions\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-add\" (click)=\"addRule()\">\r\n {{'querybuilder.AddRule' | translate}}\r\n </button>\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-add\"\r\n (click)=\"addRuleSet()\">\r\n {{'querybuilder.AddGroup' | translate}}\r\n </button>\r\n <ng-container *ngIf=\"hasParentRuleSet()\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-remove\"\r\n (click)=\"removeRuleSet(index)\">\r\n {{'querybuilder.Remove' | translate}}\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-ntk-query-conditions\">\r\n <ul *ngIf=\"data.rules && data.rules.length > 0\">\r\n <li *ngFor=\"let child of data.rules; let i = index\" class=\"ngx-connector\">\r\n <!-- rule -->\r\n <ng-container *ngIf=\"!child['rules']\">\r\n <div class=\"ngx-rule-wrap\">\r\n <div class=\"ngx-rule\">\r\n <div class=\"ngx-field\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['field']\"\r\n (change)=\"changeField(convertToRule(child), i)\" [disabled]=\"disabled\">\r\n <option *ngFor=\"let field of getFields()\" [value]=\"field.value\">\r\n {{field.name}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"ngx-operator\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['operator']\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let operator of operatorsService.getOperators(convertToRule(child), fieldMap)\"\r\n [value]=\"operator\">\r\n {{this.translate.instant(operatorsService.getOperatorDisplayName(operator)) }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"ngx-value\" [ngSwitch]=\"getInputType(convertToRule(child))\">\r\n <!-- STING -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_STRING\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"text\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- INTEGER -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_INTEGER\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"number\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- DOUBLE -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_DOUBLE\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"number\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- DATE -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_DATE\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"date\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- TIME -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_TIME\">\r\n <input class=\"ngx-ntk-query-control ngx-ntk-query-input\" type=\"time\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n </ng-container>\r\n\r\n <!-- BOOLEAN -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_BOOLEAN\">\r\n <div class=\"ngx-ntk-query-boolean-wrap\">\r\n <div class=\"ngx-boolean\">\r\n <input id=\"{{'booleanYes' + i}}\" name=\"{{'boolean' + i}}\" type=\"radio\" class=\"ngx-radio-btn\"\r\n [(ngModel)]=\"child['value']\" [value]=\"true\" [disabled]=\"disabled\">\r\n <label for=\"{{'booleanYes' + i}}\" class=\"ngx-label\">{{'querybuilder.Yes' | translate}}</label>\r\n </div>\r\n <div class=\"ngx-boolean\">\r\n <input id=\"{{'booleanNo' + i}}\" name=\"{{'boolean' + i}}\" type=\"radio\" class=\"ngx-radio-btn\"\r\n [(ngModel)]=\"child['value']\" [value]=\"false\" [disabled]=\"disabled\">\r\n <label for=\"{{'booleanNo' + i}}\" class=\"ngx-label\">{{'querybuilder.No' | translate}}</label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- SELECT -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_SELECT\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-select\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let opt of getRuleOptions(convertToRule(child))\" [value]=\"opt.value\">\r\n {{opt.name}}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- MULTI_SELECT -->\r\n <ng-container *ngSwitchCase=\"operatorsService.INPUT_TYPE_MULTI_SELECT\">\r\n <select class=\"ngx-ntk-query-control ngx-ntk-query-multi-select\" [(ngModel)]=\"child['value']\"\r\n [disabled]=\"disabled\" multiple>\r\n <option *ngFor=\"let opt of getRuleOptions(convertToRule(child))\" [ngValue]=\"opt.value\">\r\n {{opt.name}}\r\n </option>\r\n </select>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-rule-controls\">\r\n <button type=\"button\" class=\"ngx-ntk-query-control ngx-ntk-query-btn ngx-ntk-query-btn-remove\"\r\n (click)=\"removeRule(i)\">\r\n {{'querybuilder.Remove' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- rule set -->\r\n <ng-container *ngIf=\"child['rules']\">\r\n <ngx-ntk-query-builder [data]=\"convertToRuleSet(child) \" [fieldMap]=\"fieldMap\" [parent]=\"data\"\r\n [disabled]=\"disabled\" [index]=\"i\">\r\n </ngx-ntk-query-builder>\r\n </ng-container>\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: [".ngx-ntk-query-builder.disabled{opacity:.5}.ngx-ntk-query-builder.disabled .ngx-ntk-query-btn-add:hover{background-color:#5cb85c;border-color:#4cae4c}.ngx-ntk-query-builder.disabled .ngx-ntk-query-btn-remove:hover{background-color:#dc3545;border-color:#dc3545}.ngx-ntk-query-group-controls{display:flex}.ngx-ntk-query-group-controls .ngx-condition-switcher{flex:1 0 auto}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-label{float:left;margin-bottom:0;font-weight:400;text-align:center;text-shadow:none;box-sizing:border-box;background-color:#337ab7;border-color:#2e6da4;color:#fff;transition-duration:.3s}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-label:hover{cursor:pointer;background-color:#286090}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-radio{position:absolute;clip:rect(0,0,0,0);height:1px;width:1px;border:0;overflow:hidden}.ngx-ntk-query-group-controls .ngx-condition-switcher .ngx-switch-radio:checked+.ngx-switch-label{color:#fff;background-color:#286090;border-color:#204d74}.ngx-ntk-query-group-controls .ngx-actions{display:flex;margin-right:10px}.ngx-ntk-query-conditions ul{margin:0;padding:0 10px 0 25px}.ngx-ntk-query-conditions li{list-style:none}.ngx-ntk-query-conditions li.ngx-connector{position:relative;border:1px solid #cccccc;margin:8px 0;padding:10px}.ngx-ntk-query-conditions li.ngx-connector:before{top:-9px;border-width:0 0 2px 2px}.ngx-ntk-query-conditions li.ngx-connector:after{border-width:0 0 0 2px;top:50%}.ngx-ntk-query-conditions li.ngx-connector:before,.ngx-ntk-query-conditions li.ngx-connector:after{content:\"\";left:-14px;border-color:#ccc;border-style:solid;width:12px;height:calc(50% + 9px);position:absolute}.ngx-ntk-query-conditions li.ngx-connector:last-child:after{content:none}.ngx-ntk-query-conditions .ngx-rule-wrap{display:flex;flex-wrap:wrap}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule{flex:1;margin-right:10px;display:flex;flex-wrap:wrap}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-field,.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-operator,.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule .ngx-value{display:flex;align-items:center;padding:5px 0;margin-right:15px}.ngx-ntk-query-conditions .ngx-rule-wrap .ngx-rule-controls{padding:8px 0}.ngx-ntk-query-control{padding:0 .75rem;height:40px;line-height:40px;font-size:1rem}.ngx-ntk-query-input,.ngx-ntk-query-select,.ngx-ntk-query-multi-select{display:block;width:100%;color:#495057;padding:.5rem .75rem;background-color:#fff;box-sizing:border-box;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem}.ngx-ntk-query-multi-select{height:auto;max-height:200px}.ngx-ntk-query-boolean-wrap{display:flex;color:#495057}.ngx-ntk-query-btn{display:inline-block;font-weight:400;color:#fff;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;outline:none;transition-duration:.3s}.ngx-ntk-query-btn-add{background-color:#5cb85c;border-color:#4cae4c}.ngx-ntk-query-btn-add:hover{background-color:#449d44;border-color:#398439}.ngx-ntk-query-btn-remove{background-color:#dc3545;border-color:#dc3545}.ngx-ntk-query-btn-remove:hover{background-color:#c82333;border-color:#bd2130}\n"] }] }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.OperatorsService }]; }, propDecorators: { fieldMap: [{ type: Input }], settings: [{ type: Input }], disabled: [{ type: Input }], data: [{ type: Input }], parent: [{ type: Input }], index: [{ type: Input }], language: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW50ay1xdWVyeS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1udGstcXVlcnktYnVpbGRlci9zcmMvbGliL25neC1udGstcXVlcnktYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbnRrLXF1ZXJ5LWJ1aWxkZXIvc3JjL2xpYi9uZ3gtbnRrLXF1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFPbkMsa0NBQWtDO0lBQ2xDLElBQWEsUUFBUSxDQUFDLEtBQWE7UUFDakMsZ0NBQWdDO1FBQ2hDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUNELDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakMsSUFBSTtJQUNKLFlBQ1MsU0FBMkIsRUFDM0IsZ0JBQWtDO1FBRGxDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFsQmxDLGFBQVEsR0FBeUIsRUFBRSxDQUFDO1FBQ3BDLGFBQVEsR0FBeUIsRUFBRSxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsU0FBSSxHQUFpQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQTZCekQsc0NBQXNDO1FBQ3RDLGFBQVEsR0FBRyxDQUFDLElBQWtCLEVBQUUsRUFBRSxHQUFHLENBQUMs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QUFDO0lBQ0QsYUFBYSxDQUFDLEtBQStCO1FBQzNDLE9BQU8sS0FBa0IsQ0FBQztJQUM1QixDQUFDOztzSEFsS1Usd0JBQXdCOzBHQUF4Qix3QkFBd0Isb01BTnhCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7WUFDdkQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLDBCQ2RKLHNwUEFnSk0scXpLRGhJTyx3QkFBd0I7NEZBQXhCLHdCQUF3QjtrQkFWcEMsU0FBUzsrQkFDRSx1QkFBdUIsYUFHdEIsQ0FBQzs0QkFDVixPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1osQ0FBQztzSUFHTyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBRdWVyeUZpZWxkLCBRdWVyeUJ1aWxkZXJGaWVsZE1hcCwgUXVlcnlCdWlsZGVyU2V0dGluZ3MsIFF1ZXJ5UnVsZSwgUXVlcnlSdWxlU2V0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL25neC1udGstcXVlcnktYnVpbGRlci5pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgT3BlcmF0b3JzU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvb3BlcmF0b3JzLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtbnRrLXF1ZXJ5LWJ1aWxkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtbnRrLXF1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC1udGstcXVlcnktYnVpbGRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4UXVlcnlCdWlsZGVyQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlXHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFF1ZXJ5QnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIEBJbnB1dCgpIGZpZWxkTWFwOiBRdWVyeUJ1aWxkZXJGaWVsZE1hcCA9IHt9O1xyXG4gIEBJbnB1dCgpIHNldHRpbmdzOiBRdWVyeUJ1aWxkZXJTZXR0aW5ncyA9IHt9O1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGF0YTogUXVlcnlSdWxlU2V0ID0gdGhpcy5nZXRFbXB0eVJ1bGVTZXREYXRhKCk7XHJcbiAgQElucHV0KCkgcGFyZW50OiBRdWVyeVJ1bGVTZXQ7XHJcbiAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcclxuICAvLyBwcml2YXRlIHByaXZhdGVMYW5ndWFnZSA9ICdlbic7XHJcbiAgQElucHV0KCkgc2V0IGxhbmd1YWdlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIHRoaXMucHJpdmF0ZUxhbmd1YWdlID0gdmFsdWU7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZS51c2UodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnByaXZhdGVMYW5ndWFnZTtcclxuICAvLyB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIG9wZXJhdG9yc1NlcnZpY2U6IE9wZXJhdG9yc1NlcnZpY2VcclxuICApIHtcclxuICAgIHRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKTtcclxuICAgIHRyYW5zbGF0ZS51c2UoJ2VuJyk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkTWFwICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkTWFwIG11c3QgYmUgYW4gb2JqZWN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKioqIENvbnRyb2xWYWx1ZUFjY2Vzc29yIFNUQVJUICoqKiovXHJcbiAgb25DaGFuZ2UgPSAoZGF0YTogUXVlcnlSdWxlU2V0KSA9PiB7IH07XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG4gIHdyaXRlVmFsdWUoZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHRoaXMuZ2V0RW1wdHlSdWxlU2V0RGF0YSgpO1xyXG4gIH1cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoZGF0YTogUXVlcnlSdWxlU2V0KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuICAvKioqKiBDb250cm9sVmFsdWVBY2Nlc3NvciBFTkQgKioqKi9cclxuICBhZGRSdWxlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhLnJ1bGVzLnB1c2goe1xyXG4gICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZHMoKVswXS52YWx1ZSxcclxuICAgICAgdHlwZTogdGhpcy5nZXRGaWVsZHMoKVswXS50eXBlLFxyXG4gICAgICBvcGVyYXRvcjogdGhpcy5vcGVyYXRvcnNTZXJ2aWNlLmdldERlZmF1bHRPcGVyYXRvcigpXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUnVsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhLnJ1bGVzLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIGFkZFJ1bGVTZXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhLnJ1bGVzLnB1c2godGhpcy5nZXRFbXB0eVJ1bGVTZXREYXRhKCkpO1xyXG5cclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRhKTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVSdWxlU2V0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNQYXJlbnRSdWxlU2V0KCkpIHtcclxuICAgICAgdGhpcy5wYXJlbnQucnVsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlQ29uZGl0aW9uKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGEuY29uZGl0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUZpZWxkKHJ1bGU6IFF1ZXJ5UnVsZSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKHRoaXMuZGF0YS5ydWxlc1tpbmRleF0gYXMgUXVlcnlSdWxlKS50eXBlID0gdGhpcy5maWVsZE1hcFtydWxlLmZpZWxkXS50eXBlO1xyXG4gICAgKHRoaXMuZGF0YS5ydWxlc1tpbmRleF0gYXMgUXVlcnlSdWxlKS5vcGVyYXRvciA9IHRoaXMub3BlcmF0b3JzU2VydmljZS5nZXREZWZhdWx0T3BlcmF0b3IoKTtcclxuICAgICh0aGlzLmRhdGEucnVsZXNbaW5kZXhdIGFzIFF1ZXJ5UnVsZSkudmFsdWUgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG5cclxuICBoYXNQYXJlbnRSdWxlU2V0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5wYXJlbnQ7XHJcbiAgfVxyXG5cclxuICBnZXRFbXB0eVJ1bGVTZXREYXRhKCk6IFF1ZXJ5UnVsZVNldCB7XHJcbiAgICByZXR1cm4geyBjb25kaXRpb246ICdhbmQnLCBydWxlczogW10gfTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkcygpOiBRdWVyeUZpZWxkW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGRNYXApLm1hcCgodmFsdWUpID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkTWFwW3ZhbHVlXTtcclxuICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dFR5cGUocnVsZTogUXVlcnlSdWxlKTogc3RyaW5nIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZmllbGRNYXBbcnVsZS5maWVsZF0pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb25maWd1cmF0aW9uIGZvciBmaWVsZCAnJHtydWxlLmZpZWxkfScgd2FzIGZvdW5kIWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkTWFwW3J1bGUuZmllbGRdLnR5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3BlcmF0b3JzU2VydmljZS5nZXRPcGVyYXRvcnNXaXRob3V0SW5wdXQoKS5pbmNsdWRlcyhydWxlLm9wZXJhdG9yKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDsgLy8gTm8gZGlzcGxheWVkIGlucHV0XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3BlcmF0b3JzU2VydmljZS5NVUxUSV9TRUxFQ1RfT1BFUkFUT1JTLmluY2x1ZGVzKHJ1bGUub3BlcmF0b3IpKSB7XHJcbiAgICAgIHJldHVybiAodHlwZSA9PT0gdGhpcy5vcGVyYXRvcnNTZXJ2aWNlLklOUFVUX1RZUEVfU0VMRUNUKSA/IHRoaXMub3BlcmF0b3JzU2VydmljZS5JTlBVVF9UWVBFX01VTFRJX1NFTEVDVCA6IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHR5cGU7XHJcbiAgfVxyXG5cclxuICBnZXRSdWxlT3B0aW9ucyhydWxlOiBRdWVyeVJ1bGUpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRNYXBbcnVsZS5maWVsZF0ub3B0aW9ucyA/IHRoaXMuZmllbGRNYXBbcnVsZS5maWVsZF0ub3B0aW9ucyA6IFtdO1xyXG4gIH1cclxuICBjb252ZXJ0VG9SdWxlU2V0KG1vZGVsOiBRdWVyeVJ1bGVTZXQgfCBRdWVyeVJ1bGUpOiBRdWVyeVJ1bGVTZXQge1xyXG4gICAgcmV0dXJuIG1vZGVsIGFzIFF1ZXJ5UnVsZVNldDtcclxuICB9XHJcbiAgY29udmVydFRvUnVsZShtb2RlbDogUXVlcnlSdWxlU2V0IHwgUXVlcnlSdWxlKTogUXVlcnlSdWxlIHtcclxuICAgIHJldHVybiBtb2RlbCBhcyBRdWVyeVJ1bGU7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJuZ3gtbnRrLXF1ZXJ5LWJ1aWxkZXJcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogZGlzYWJsZWR9XCI+XHJcbiAgPGRpdiBjbGFzcz1cIm5neC1udGstcXVlcnktZ3JvdXAtY29udHJvbHNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtY29uZGl0aW9uLXN3aXRjaGVyXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGlucHV0IG5hbWU9XCJ7eydjb25kaXRpb24nICsgaW5kZXh9fVwiIHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwibmd4LXN3aXRjaC1yYWRpb1wiIFsobmdNb2RlbCldPVwiZGF0YS5jb25kaXRpb25cIlxyXG4gICAgICAgICAgdmFsdWU9XCJhbmRcIiAjYW5kT3B0aW9uPlxyXG4gICAgICAgIDxsYWJlbCAoY2xpY2spPVwiY2hhbmdlQ29uZGl0aW9uKGFuZE9wdGlvbi52YWx1ZSlcIiBjbGFzcz1cIm5neC1udGstcXVlcnktY29udHJvbCBuZ3gtc3dpdGNoLWxhYmVsXCI+XHJcbiAgICAgICAgICB7eydxdWVyeWJ1aWxkZXIuQW5kJyB8XHJcbiAgICAgICAgICB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxpbnB1dCBuYW1lPVwie3snY29uZGl0aW9uJyArIGluZGV4fX1cIiB0eXBlPVwicmFkaW9cIiBjbGFzcz1cIm5neC1zd2l0Y2gtcmFkaW9cIiBbKG5nTW9kZWwpXT1cImRhdGEuY29uZGl0aW9uXCJcclxuICAgICAgICAgIHZhbHVlPVwib3JcIiAjb3JPcHRpb24+XHJcbiAgICAgICAgPGxhYmVsIChjbGljayk9XCJjaGFuZ2VDb25kaXRpb24ob3JPcHRpb24udmFsdWUpXCJcclxuICAgICAgICAgIGNsYXNzPVwibmd4LW50ay1xdWVyeS1jb250cm9sIG5neC1zd2l0Y2gtbGFiZWxcIj57eydxdWVyeWJ1aWxkZXIuT3InIHxcclxuICAgICAgICAgIHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1udGstcXVlcnktY29udHJvbCBuZ3gtbnRrLXF1ZXJ5LWJ0biBuZ3gtbnRrLXF1ZXJ5LWJ0bi1hZGRcIiAoY2xpY2spPVwiYWRkUnVsZSgpXCI+XHJcbiAgICAgICAge3sncXVlcnlidWlsZGVyLkFkZFJ1bGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LW50ay1xdWVyeS1jb250cm9sIG5neC1udGstcXVlcnktYnRuIG5neC1udGstcXVlcnktYnRuLWFkZFwiXHJcbiAgICAgICAgKGNsaWNrKT1cImFkZFJ1bGVTZXQoKVwiPlxyXG4gICAgICAgIHt7J3F1ZXJ5YnVpbGRlci5BZGRHcm91cCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1BhcmVudFJ1bGVTZXQoKVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LW50ay1xdWVyeS1jb250cm9sIG5neC1udGstcXVlcnktYnRuIG5neC1udGstcXVlcnktYnRuLXJlbW92ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUnVsZVNldChpbmRleClcIj5cclxuICAgICAgICAgIHt7J3F1ZXJ5YnVpbGRlci5SZW1vdmUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibmd4LW50ay1xdWVyeS1jb25kaXRpb25zXCI+XHJcbiAgICA8dWwgKm5nSWY9XCJkYXRhLnJ1bGVzICYmIGRhdGEucnVsZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGRhdGEucnVsZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5neC1jb25uZWN0b3JcIj5cclxuICAgICAgICA8IS0tIHJ1bGUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjaGlsZFsncnVsZXMnXVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1ydWxlLXdyYXBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1ydWxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cIm5neC1udGstcXVlcnktY29udHJvbCBuZ3gtbnRrLXF1ZXJ5LXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY2hpbGRbJ2ZpZWxkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUZpZWxkKGNvbnZlcnRUb1J1bGUoY2hpbGQpLCBpKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBnZXRGaWVsZHMoKVwiIFt2YWx1ZV09XCJmaWVsZC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZmllbGQubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1vcGVyYXRvclwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cIm5neC1udGstcXVlcnktY29udHJvbCBuZ3gtbnRrLXF1ZXJ5LXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY2hpbGRbJ29wZXJhdG9yJ11cIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3BlcmF0b3Igb2Ygb3BlcmF0b3JzU2VydmljZS5nZXRPcGVyYXRvcnMoY29udmVydFRvUnVsZShjaGlsZCksIGZpZWxkTWFwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wZXJhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3t0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG9wZXJhdG9yc1NlcnZpY2UuZ2V0T3BlcmF0b3JEaXNwbGF5TmFtZShvcGVyYXRvcikpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC12YWx1ZVwiIFtuZ1N3aXRjaF09XCJnZXRJbnB1dFR5cGUoY29udmVydFRvUnVsZShjaGlsZCkpXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFNUSU5HIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwib3BlcmF0b3JzU2VydmljZS5JTlBVVF9UWVBFX1NUUklOR1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuZ3gtbnRrLXF1ZXJ5LWNvbnRyb2wgbmd4LW50ay1xdWVyeS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjaGlsZFsndmFsdWUnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIElOVEVHRVIgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJvcGVyYXRvcnNTZXJ2aWNlLklOUFVUX1RZUEVfSU5URUdFUlwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuZ3gtbnRrLXF1ZXJ5LWNvbnRyb2wgbmd4LW50ay1xdWVyeS1pbnB1dFwiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImNoaWxkWyd2YWx1ZSddXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5c