ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
118 lines • 26.3 kB
JavaScript
import { Component, Inject, Injector, ViewChild, ViewEncapsulation } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Util } from '../../../util/util';
import { OSearchInputComponent } from '../../input/search-input/o-search-input.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
import * as i3 from "@angular/flex-layout/flex";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/material/list";
import * as i6 from "@angular/material/divider";
import * as i7 from "@angular/cdk/scrolling";
import * as i8 from "../search-input/o-search-input.component";
import * as i9 from "../../../pipes/o-translate.pipe";
export const DEFAULT_INPUTS_O_LIST_PICKER_DIALOG = [
'data',
'visibleColumns: visible-columns',
'filter'
];
export class OListPickerDialogComponent {
constructor(dialogRef, injector, data) {
this.dialogRef = dialogRef;
this.injector = injector;
this.filter = true;
this.visibleData = [];
this.itemSize = 30;
this.data = [];
if (data.data && Util.isArray(data.data)) {
this.data = data.data;
this.visibleData = this.data;
}
if (data.visibleColumns && Util.isArray(data.visibleColumns)) {
this.visibleColsArray = data.visibleColumns;
}
if (data.filter !== undefined) {
this.filter = data.filter;
}
if (data.menuColumns) {
this.menuColumns = data.menuColumns;
}
if (data.renderer) {
this.renderer = data.renderer;
}
this.searchVal = data.searchVal;
}
ngAfterViewInit() {
if (Util.isDefined(this.searchVal) && this.searchInput !== undefined && this.searchVal.length > 0) {
this.searchInput.getFormControl().setValue(this.searchVal, {
emitEvent: false
});
setTimeout(() => this.searchInput.onSearch.emit(this.searchVal));
}
}
onClickListItem(e, value) {
this.dialogRef.close(value);
}
trackByFn(index, item) {
return index;
}
onFilterList(searchVal) {
this.visibleData = this.transform(this.data, {
filtervalue: searchVal,
filtercolumns: this.visibleColsArray
});
}
isEmptyData() {
return Util.isDefined(this.visibleData) ? this.visibleData.length === 0 : true;
}
transform(value, args) {
if (!args || args.length <= 1) {
return value;
}
const filterValue = args['filtervalue'] ? args['filtervalue'] : '';
const filterColumns = args['filtercolumns'];
if (!filterColumns || !filterValue || filterValue.length === 0) {
return value;
}
if (value === undefined || value === null) {
return value;
}
return value.filter(item => {
for (let i = 0; i < filterColumns.length; i++) {
const colName = filterColumns[i];
if (this._isBlank(colName)) {
continue;
}
let origValue = item[colName];
if (origValue) {
origValue = origValue.toString();
if (this._isBlank(origValue)) {
continue;
}
if (origValue.toUpperCase().indexOf(filterValue.toUpperCase()) > -1) {
return item;
}
}
}
});
}
_isBlank(value) {
return !Util.isDefined(value) || value.length === 0;
}
}
OListPickerDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OListPickerDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i0.Injector }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
OListPickerDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OListPickerDialogComponent, selector: "o-list-picker-dialog", inputs: { data: "data", visibleColumns: ["visible-columns", "visibleColumns"], filter: "filter" }, host: { properties: { "class.o-list-picker-dialog": "true" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "<div mat-dialog-title *ngIf=\"filter\">\n <o-search-input #searchInput [columns]=\"menuColumns\" show-menu=\"no\" (onSearch)=\"onFilterList($event)\" class=\"o-list-picker-search\"\n appearance=\"fill\"></o-search-input>\n</div>\n<div mat-dialog-content [class.o-list-picker-has-filter]=\"filter\" fxFlex>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize\">\n <mat-list>\n <mat-list-item *ngIf=\"isEmptyData()\">\n {{ 'LIST.EMPTY' | oTranslate }}\n <ng-container *ngIf=\"filter && searchInput && searchInput.getValue() && searchInput.getValue().length > 0\">\n {{ 'LIST.EMPTY_USING_FILTER' | oTranslate : { values: [searchInput.getValue()] } }}\n </ng-container>\n </mat-list-item>\n <ng-container *cdkVirtualFor=\"let item of visibleData; trackBy: trackByFn\">\n <mat-list-item (click)=\"onClickListItem($event, item)\">\n <ng-container *ngIf=\"renderer\">\n <ng-template *ngTemplateOutlet=\"renderer?.templateref; context:{ value: item }\">\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!renderer\">\n <span>{{ item['_parsedVisibleColumnText'] }}</span>\n </ng-container>\n </mat-list-item>\n <mat-divider></mat-divider>\n </ng-container>\n </mat-list>\n </cdk-virtual-scroll-viewport>\n\n</div>\n<mat-dialog-actions align=\"end\">\n <button type=\"button\" mat-stroked-button mat-dialog-close class=\"o-button-default cancel\">{{ 'CANCEL' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog{display:flex;flex-direction:column;height:100%}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title{margin-top:-30px}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper{padding-bottom:0}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper .mdc-line-ripple:after,.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper .mdc-line-ripple:before{border:none}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport{height:100%}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport mat-list mat-list-item{cursor:pointer}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport mat-list mat-list-item .mdc-list-item__primary-text{white-space:pre-wrap}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i5.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i5.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i7.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i7.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i7.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i8.OSearchInputComponent, selector: "o-search-input", inputs: ["placeholder", "label", "width", "float-label", "appearance", "columns", "filter-case-sensitive", "show-case-sensitive-checkbox", "show-menu"], outputs: ["onSearch"] }, { kind: "pipe", type: i9.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OListPickerDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'o-list-picker-dialog', inputs: DEFAULT_INPUTS_O_LIST_PICKER_DIALOG, encapsulation: ViewEncapsulation.None, host: {
'[class.o-list-picker-dialog]': 'true'
}, template: "<div mat-dialog-title *ngIf=\"filter\">\n <o-search-input #searchInput [columns]=\"menuColumns\" show-menu=\"no\" (onSearch)=\"onFilterList($event)\" class=\"o-list-picker-search\"\n appearance=\"fill\"></o-search-input>\n</div>\n<div mat-dialog-content [class.o-list-picker-has-filter]=\"filter\" fxFlex>\n <cdk-virtual-scroll-viewport [itemSize]=\"itemSize\">\n <mat-list>\n <mat-list-item *ngIf=\"isEmptyData()\">\n {{ 'LIST.EMPTY' | oTranslate }}\n <ng-container *ngIf=\"filter && searchInput && searchInput.getValue() && searchInput.getValue().length > 0\">\n {{ 'LIST.EMPTY_USING_FILTER' | oTranslate : { values: [searchInput.getValue()] } }}\n </ng-container>\n </mat-list-item>\n <ng-container *cdkVirtualFor=\"let item of visibleData; trackBy: trackByFn\">\n <mat-list-item (click)=\"onClickListItem($event, item)\">\n <ng-container *ngIf=\"renderer\">\n <ng-template *ngTemplateOutlet=\"renderer?.templateref; context:{ value: item }\">\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!renderer\">\n <span>{{ item['_parsedVisibleColumnText'] }}</span>\n </ng-container>\n </mat-list-item>\n <mat-divider></mat-divider>\n </ng-container>\n </mat-list>\n </cdk-virtual-scroll-viewport>\n\n</div>\n<mat-dialog-actions align=\"end\">\n <button type=\"button\" mat-stroked-button mat-dialog-close class=\"o-button-default cancel\">{{ 'CANCEL' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog{display:flex;flex-direction:column;height:100%}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title{margin-top:-30px}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper{padding-bottom:0}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper .mdc-line-ripple:after,.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-title .o-search-input mat-form-field .mat-mdc-text-field-wrapper .mdc-line-ripple:before{border:none}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport{height:100%}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport mat-list mat-list-item{cursor:pointer}.cdk-overlay-list-picker .mat-mdc-dialog-container .o-list-picker-dialog .mat-mdc-dialog-content .cdk-virtual-scroll-viewport mat-list mat-list-item .mdc-list-item__primary-text{white-space:pre-wrap}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i0.Injector }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DIALOG_DATA]
}] }]; }, propDecorators: { searchInput: [{
type: ViewChild,
args: ['searchInput']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1saXN0LXBpY2tlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvbGlzdHBpY2tlci9vLWxpc3QtcGlja2VyLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9saXN0cGlja2VyL28tbGlzdC1waWNrZXItZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7Ozs7OztBQUcxRixNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRztJQUNqRCxNQUFNO0lBQ04saUNBQWlDO0lBQ2pDLFFBQVE7Q0FDVCxDQUFDO0FBWUYsTUFBTSxPQUFPLDBCQUEwQjtJQWVyQyxZQUNTLFNBQW1ELEVBQ2hELFFBQWtCLEVBQ0gsSUFBUztRQUYzQixjQUFTLEdBQVQsU0FBUyxDQUEwQztRQUNoRCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBZnZCLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFDdkIsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFFdEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQU1uQixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBU3pCLElBQUksSUFBSSxDQUFDLElBQUksSUFB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QW9CRSxNQUFNOzJCQUFDLGVBQWU7NENBVGxCLFdBQVc7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9TZWFyY2hJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2lucHV0L3NlYXJjaC1pbnB1dC9vLXNlYXJjaC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0xpc3RQaWNrZXJDdXN0b21SZW5kZXJlciB9IGZyb20gJy4vbGlzdHBpY2tlci1yZW5kZXJlci9vLWxpc3QtcGlja2VyLXJlbmRlcmVyLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fTElTVF9QSUNLRVJfRElBTE9HID0gW1xuICAnZGF0YScsXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcbiAgJ2ZpbHRlcidcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tbGlzdC1waWNrZXItZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tbGlzdC1waWNrZXItZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vby1saXN0LXBpY2tlci1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX0xJU1RfUElDS0VSX0RJQUxPRyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1saXN0LXBpY2tlci1kaWFsb2ddJzogJ3RydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT0xpc3RQaWNrZXJEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBwdWJsaWMgZmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHZpc2libGVEYXRhOiBhbnkgPSBbXTtcbiAgcHVibGljIHNlYXJjaFZhbDogc3RyaW5nO1xuICBwdWJsaWMgaXRlbVNpemU6IG51bWJlciA9IDMwO1xuICBwdWJsaWMgcmVuZGVyZXI6IE9MaXN0UGlja2VyQ3VzdG9tUmVuZGVyZXI7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnKVxuICBwdWJsaWMgc2VhcmNoSW5wdXQ6IE9TZWFyY2hJbnB1dENvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgZGF0YTogYW55W10gPSBbXTtcbiAgcHVibGljIG1lbnVDb2x1bW5zOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB2aXNpYmxlQ29sc0FycmF5OiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8T0xpc3RQaWNrZXJEaWFsb2dDb21wb25lbnQ+LFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIGRhdGE6IGFueVxuICApIHtcbiAgICBpZiAoZGF0YS5kYXRhICYmIFV0aWwuaXNBcnJheShkYXRhLmRhdGEpKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhLmRhdGE7XG4gICAgICB0aGlzLnZpc2libGVEYXRhID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgICBpZiAoZGF0YS52aXNpYmxlQ29sdW1ucyAmJiBVdGlsLmlzQXJyYXkoZGF0YS52aXNpYmxlQ29sdW1ucykpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHNBcnJheSA9IGRhdGEudmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmlsdGVyID0gZGF0YS5maWx0ZXI7XG4gICAgfVxuICAgIGlmIChkYXRhLm1lbnVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm1lbnVDb2x1bW5zID0gZGF0YS5tZW51Q29sdW1ucztcbiAgICB9XG4gICAgaWYgKGRhdGEucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIgPSBkYXRhLnJlbmRlcmVyO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaFZhbCA9IGRhdGEuc2VhcmNoVmFsO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zZWFyY2hWYWwpICYmIHRoaXMuc2VhcmNoSW5wdXQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0LmdldEZvcm1Db250cm9sKCkuc2V0VmFsdWUodGhpcy5zZWFyY2hWYWwsIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICAvL1RPRE8gaW1wcm92ZTogQWRkZWQgc2V0VGltZW91dCBmb3IgcmVzb2x2aW5nIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3IgZXJyb3IgYmVjYXVzZSB0aGUgb2JzZXJ2YWJsZXMgZG9udCB3b3JrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoSW5wdXQub25TZWFyY2guZW1pdCh0aGlzLnNlYXJjaFZhbCkpO1xuICAgIH1cbiAgfVxuXG5cbiAgcHVibGljIG9uQ2xpY2tMaXN0SXRlbShlOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIG9uRmlsdGVyTGlzdChzZWFyY2hWYWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZURhdGEgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLmRhdGEsIHtcbiAgICAgIGZpbHRlcnZhbHVlOiBzZWFyY2hWYWwsXG4gICAgICBmaWx0ZXJjb2x1bW5zOiB0aGlzLnZpc2libGVDb2xzQXJyYXlcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0VtcHR5RGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy52aXNpYmxlRGF0YSkgPyB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA9PT0gMCA6IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybSh2YWx1ZTogYW55W10sIGFyZ3M6IGFueSk6IGFueSB7XG4gICAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGFyZ3NbJ2ZpbHRlcnZhbHVlJ10gPyBhcmdzWydmaWx0ZXJ2YWx1ZSddIDogJyc7XG4gICAgY29uc3QgZmlsdGVyQ29sdW1ucyA9IGFyZ3NbJ2ZpbHRlcmNvbHVtbnMnXTtcblxuICAgIGlmICghZmlsdGVyQ29sdW1ucyB8fCAhZmlsdGVyVmFsdWUgfHwgZmlsdGVyVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbE5hbWUgPSBmaWx0ZXJDb2x1bW5zW2ldO1xuICAgICAgICBpZiAodGhpcy5faXNCbGFuayhjb2xOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcmlnVmFsdWUgPSBpdGVtW2NvbE5hbWVdO1xuICAgICAgICBpZiAob3JpZ1ZhbHVlKSB7XG4gICAgICAgICAgb3JpZ1ZhbHVlID0gb3JpZ1ZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzQmxhbmsob3JpZ1ZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9yaWdWYWx1ZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoZmlsdGVyVmFsdWUudG9VcHBlckNhc2UoKSkgPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pc0JsYW5rKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVV0aWwuaXNEZWZpbmVkKHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cblxufVxuIiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlICpuZ0lmPVwiZmlsdGVyXCI+XG4gIDxvLXNlYXJjaC1pbnB1dCAjc2VhcmNoSW5wdXQgW2NvbHVtbnNdPVwibWVudUNvbHVtbnNcIiBzaG93LW1lbnU9XCJub1wiIChvblNlYXJjaCk9XCJvbkZpbHRlckxpc3QoJGV2ZW50KVwiIGNsYXNzPVwiby1saXN0LXBpY2tlci1zZWFyY2hcIlxuICAgIGFwcGVhcmFuY2U9XCJmaWxsXCI+PC9vLXNlYXJjaC1pbnB1dD5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgW2NsYXNzLm8tbGlzdC1waWNrZXItaGFzLWZpbHRlcl09XCJmaWx0ZXJcIiBmeEZsZXg+XG4gIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCI+XG4gICAgPG1hdC1saXN0PlxuICAgICAgPG1hdC1saXN0LWl0ZW0gKm5nSWY9XCJpc0VtcHR5RGF0YSgpXCI+XG4gICAgICAgIHt7ICdMSVNULkVNUFRZJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlciAmJiBzZWFyY2hJbnB1dCAmJiBzZWFyY2hJbnB1dC5nZXRWYWx1ZSgpICYmIHNlYXJjaElucHV0LmdldFZhbHVlKCkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIHt7ICdMSVNULkVNUFRZX1VTSU5HX0ZJTFRFUicgfCBvVHJhbnNsYXRlIDogeyB2YWx1ZXM6IFtzZWFyY2hJbnB1dC5nZXRWYWx1ZSgpXSB9IH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtbGlzdC1pdGVtPlxuICAgICAgPG5nLWNvbnRhaW5lciAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIHZpc2libGVEYXRhOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPG1hdC1saXN0LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tMaXN0SXRlbSgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbmRlcmVyXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW5kZXJlcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyB2YWx1ZTogaXRlbSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVuZGVyZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW1bJ19wYXJzZWRWaXNpYmxlQ29sdW1uVGV4dCddIH19PC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1saXN0LWl0ZW0+XG4gICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtbGlzdD5cbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbjwvZGl2PlxuPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjbGFzcz1cIm8tYnV0dG9uLWRlZmF1bHQgY2FuY2VsXCI+e3sgJ0NBTkNFTCcgfCBvVHJhbnNsYXRlIH19PC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbiJdfQ==