dynamic-mat-table
Version:
dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.
146 lines • 23 kB
JavaScript
import { ChangeDetectionStrategy, Component, HostBinding, Output, ViewChild, Input, EventEmitter, ChangeDetectorRef, QueryList, ContentChildren } from '@angular/core';
import { TableService } from '../../dynamic-mat-table.service';
import { TextFilter } from './compare/text-filter';
import { NumberFilter } from './compare/number-filter';
import { transition, trigger, query, style, stagger, animate } from '@angular/animations';
import { TableIntl } from '../../../international/table-Intl';
import { MatMenuTrigger } from '@angular/material/menu';
import { isNullorUndefined } from '../../../cores/type';
const listAnimation = trigger('listAnimation', [
transition('* <=> *', [
query(':enter', [style({ opacity: 0 }), stagger('10ms', animate('400ms ease-out', style({ opacity: 1 })))], { optional: true }),
])
]);
export class HeaderFilterComponent {
constructor(languagePack, service, cdr) {
this.languagePack = languagePack;
this.service = service;
this.cdr = cdr;
this.filterChanged = new EventEmitter();
this.filterList = [];
}
get filters() {
if (isNullorUndefined(this.filterList) === true || this.filterList.length === 0) {
this.filterList = [];
this.addNewFilter(this.field.type || 'text');
}
return this.filterList;
}
set filters(values) {
this.filterList = values;
}
get hasValue() {
return this.filterList && this.filterList.filter(f => f.hasValue() === true).length > 0;
}
get showTrigger() {
if (this.menu === undefined) {
return false;
}
else {
return this.menu.menuOpen || this.hasValue;
}
}
ngOnDestroy() {
if (this.eventsSubscription) {
this.eventsSubscription.unsubscribe();
}
}
ngOnInit() {
if (isNullorUndefined(this.filters)) {
this.filters = [];
this.addNewFilter(this.field.type);
}
}
addNewFilter(type = 'text') {
switch (type || 'text') {
case 'text': {
this.filterList.push(new TextFilter(this.languagePack));
break;
}
case 'number': {
this.filterList.push(new NumberFilter(this.languagePack));
break;
}
case 'date': {
// this.compare = new DateCompare(service);
break;
}
case 'boolean': {
// this.compare = new BooleanCompare(service);
break;
}
default: this.filterList.push(new TextFilter(this.languagePack));
}
this.filters[this.filters.length - 1].selectedIndex = 0;
return this.filters[this.filters.length - 1];
}
ngAfterViewInit() {
if (this.menu) {
this.eventsSubscription = this.menu.menuOpened.subscribe(() => this.focusToLastInput());
}
}
focusToLastInput() {
setTimeout(() => {
if (this.filterInputList.length > 0) {
this.filterInputList.last.focus();
}
});
}
filterAction_OnClick(index, action) {
if (action === 0 || action === 1) { // and or
this.filters[index].type = action === 0 ? 'and' : 'or';
if (this.filters.length === index + 1) {
this.addNewFilter(this.field.type);
this.focusToLastInput();
}
}
else if (action === 2 && this.filters.length > 1) { // delete
setTimeout(() => {
this.filters.splice(index, 1);
this.cdr.detectChanges();
this.focusToLastInput();
}); // bug for delete filter item(unwanted reaction close menu)
}
}
clearColumn_OnClick() {
this.filterList = [];
this.filterChanged.emit(this.filterList);
}
applyFilter_OnClick() {
this.filterChanged.emit(this.filterList);
}
}
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
HeaderFilterComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'header-filter',
template: "<ng-content></ng-content>\r\n\r\n<mat-menu filter-event #filterMenu=\"matMenu\" class=\"menu\">\r\n <ng-template matMenuContent>\r\n\r\n <div filter-event class=\"menu-title\">\r\n {{field?.header}}\r\n </div>\r\n <div [@listAnimation]=\"filters.length\" filter-event *ngFor=\"let filter of filters; let index = index\"\r\n class=\"filter-panel\">\r\n\r\n <mat-form-field>\r\n <mat-select [value]=\"filter.selectedIndex\" [panelClass]=\"'mat-elevation-z10'\"\r\n (selectionChange)=\"filter.selectedIndex = $event.value;\" placeholder='Conditions'\r\n (keyup.enter)=\"applyFilter_OnClick()\">\r\n <mat-option *ngFor=\"let op of filter.getOperations(); let selectedIndex=index\" [value]=\"selectedIndex\">\r\n {{ op.text }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <div *ngFor=\"let ctrl of filter?.parameters\">\r\n <mat-form-field class=\"input-field\">\r\n <mat-label>{{ctrl.text}}</mat-label>\r\n <input matInput #filterInput=\"matInput\" [(ngModel)]=\"ctrl.value\" [placeholder]=\"\"\r\n (keyup.enter)=\"applyFilter_OnClick()\" autocomplete=\"off\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"or-and\">\r\n <span *ngIf=\"filters?.length !== index+1\" class=\"selected-filter-type\">{{ filter?.type === 'and' ?\r\n languagePack.filterLabels.And : languagePack.filterLabels.Or}}</span>\r\n <span class=\"svg\">\r\n <mat-icon (click)=\"filterAction_OnClick(index,0)\">add</mat-icon>\r\n </span>\r\n <span class=\"svg\">\r\n <mat-icon (click)=\"filterAction_OnClick(index,1)\" style=\"transform: rotate(90deg);\">drag_handle</mat-icon>\r\n </span>\r\n <span class=\"svg\">\r\n <mat-icon (click)=\"filterAction_OnClick(index,2)\">clear</mat-icon>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n <div filter-event class=\"menu-action\">\r\n <button mat-raised-button type=\"button\" (click)=\"clearColumn_OnClick()\">{{ languagePack.filterLabels.Clear\r\n }}</button>\r\n <button mat-raised-button type=\"button\" color=\"primary\" (click)=\"applyFilter_OnClick()\">{{\r\n languagePack.filterLabels.Search}}</button>\r\n </div>\r\n </ng-template>\r\n</mat-menu>\r\n\r\n<span class=\"trigger\" [matMenuTriggerFor]=\"filterMenu\" *ngIf=\"field.filter !== 'none'\">\r\n <mat-icon>filter_list</mat-icon>\r\n</span>\r\n",
changeDetection: ChangeDetectionStrategy.OnPush,
animations: [listAnimation],
styles: ["@media print{.print-preview{background-color:#fff;position:fixed;width:100%;height:auto;z-index:99999999;margin:0;padding:0;top:0;left:0;overflow:visible;display:block}}.disable-backdrop-click .cdk-overlay-backdrop.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{pointer-events:none}:host{display:flex;align-items:center;width:100%;align-self:stretch}.trigger{color:#0000004d;display:flex;opacity:0;transform:translateY(-5px);cursor:pointer;transition-duration:.4s;transition-property:opacity,transform;position:sticky;right:0px;z-index:1;padding-left:0 8px}:host.has-value .trigger{opacity:1;color:#0000008a}:host:hover .trigger,:host.show-trigger .trigger{opacity:1;transform:translateY(-1px)}::ng-deep .mat-menu-content:not(:empty){padding:0!important}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background-color:inherit}.input-field{margin-top:-15px}.menu-title{font-weight:bolder;top:-8px;position:sticky;background-color:#fff;z-index:1}.menu-action{position:sticky;bottom:-8px;padding-top:10px;padding-bottom:0;background-color:#fff}.menu-action button{width:calc(50% - 10px);margin:5px;border-radius:10px}.filter-panel{border-radius:5px;background-color:#fdfbfb;border:solid 1px #efefef;transition:all .5s;padding:5px;overflow:hidden;font-size:14px;margin-top:10px;display:flex;flex-direction:column}.filter-panel:nth-child(2){margin-top:0!important}.filter-panel:hover{border:solid 1px #d1d1d1}.filter-panel:hover .svg{opacity:1;transform:translateY(-1px)}.or-and{display:inherit!important;text-align:right;margin:-12px 0;height:35px;cursor:inherit;font-size:12px}.svg{color:#0000004d;display:flex;opacity:0;transform:translateY(-5px);transition-duration:.4s;transition-property:opacity,transform;margin-left:5px;padding:2px;border-radius:5px;color:#4c4c4c;cursor:pointer;display:inline-block!important;height:24px}.svg mat-icon{margin:0;vertical-align:top;border-radius:5px}.svg mat-icon:hover{color:#fff;background-color:#89898a}.svg:hover{background-color:#f8f8f8}.selected-filter-type{float:left;color:#fff;background-color:#89898a;border-radius:5px;padding:0 4px;line-height:24px}::ng-deep .menu{padding:8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}\n"]
},] }
];
/**
* @type {function(): !Array<(null|{
* type: ?,
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
* })>}
* @nocollapse
*/
HeaderFilterComponent.ctorParameters = () => [
{ type: TableIntl },
{ type: TableService },
{ type: ChangeDetectorRef }
];
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
HeaderFilterComponent.propDecorators = {
field: [{ type: Input }],
filterChanged: [{ type: Output }],
filterInputList: [{ type: ContentChildren, args: ['filterInput',] }],
menu: [{ type: ViewChild, args: [MatMenuTrigger, { static: true },] }],
filters: [{ type: Input }],
hasValue: [{ type: HostBinding, args: ['class.has-value',] }],
showTrigger: [{ type: HostBinding, args: ['class.show-trigger',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLW1hdC10YWJsZS9zcmMvbGliL2R5bmFtaWMtbWF0LXRhYmxlL2V4dGVuc2lvbnMvZmlsdGVyL2hlYWRlci1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUNqRixLQUFLLEVBQUUsWUFBWSxFQUFVLGlCQUFpQixFQUFFLFNBQVMsRUFBMkIsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHeEQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRTtJQUM3QyxVQUFVLENBQUMsU0FBUyxFQUFFO1FBQ3BCLEtBQUssQ0FBQyxRQUFRLEVBQ1osQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFL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Q0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLFNBQVM7WUFDN0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkRBQTJEO1NBQ2hFO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7OztZQXhIRixTQUFTLFNBQUM7Z0JBQ1QsOENBQThDO2dCQUM5QyxRQUFRLEVBQUUsZUFBZTtnQkFDekIscStFQUE2QztnQkFFN0MsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07Z0JBQy9DLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQzs7YUFDNUI7Ozs7Ozs7Ozs7WUF0QlEsU0FBUztZQUxULFlBQVk7WUFGaUIsaUJBQWlCOzs7O29CQStCcEQsS0FBSzs0QkFDTCxNQUFNOzhCQUVOLGVBQWUsU0FBQyxhQUFhO21CQUM3QixTQUFTLFNBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtzQkFJMUMsS0FBSzt1QkFZTCxXQUFXLFNBQUMsaUJBQWlCOzBCQUs3QixXQUFXLFNBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIE91dHB1dCwgVmlld0NoaWxkLFxyXG4gICAgICAgICBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmLCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiwgT25EZXN0cm95LCBDb250ZW50Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGFibGVGaWVsZCB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1tYXQtdGFibGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFRleHRGaWx0ZXIgfSBmcm9tICcuL2NvbXBhcmUvdGV4dC1maWx0ZXInO1xyXG5pbXBvcnQgeyBOdW1iZXJGaWx0ZXIgfSBmcm9tICcuL2NvbXBhcmUvbnVtYmVyLWZpbHRlcic7XHJcbmltcG9ydCB7IEFic3RyYWN0RmlsdGVyIH0gZnJvbSAnLi9jb21wYXJlL2Fic3RyYWN0LWZpbHRlcic7XHJcbmltcG9ydCB7IHRyYW5zaXRpb24sIHRyaWdnZXIsIHF1ZXJ5LCBzdHlsZSwgc3RhZ2dlciwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZUludGwgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hdGlvbmFsL3RhYmxlLUludGwnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgaXNOdWxsb3JVbmRlZmluZWQgfSBmcm9tICcuLi8uLi8uLi9jb3Jlcy90eXBlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5jb25zdCBsaXN0QW5pbWF0aW9uID0gdHJpZ2dlcignbGlzdEFuaW1hdGlvbicsIFtcclxuICB0cmFuc2l0aW9uKCcqIDw9PiAqJywgW1xyXG4gICAgcXVlcnkoJzplbnRlcicsXHJcbiAgICAgIFtzdHlsZSh7IG9wYWNpdHk6IDAgfSksIHN0YWdnZXIoJzEwbXMnLCBhbmltYXRlKCc0MDBtcyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSkpXSxcclxuICAgICAgeyBvcHRpb25hbDogdHJ1ZSB9XHJcbiAgICApLFxyXG4gIF0pXHJcbl0pO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnaGVhZGVyLWZpbHRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2hlYWRlci1maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBhbmltYXRpb25zOiBbbGlzdEFuaW1hdGlvbl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEhlYWRlckZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBmaWVsZD86IFRhYmxlRmllbGQ8YW55PjtcclxuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFic3RyYWN0RmlsdGVyW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxBYnN0cmFjdEZpbHRlcltdPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKCdmaWx0ZXJJbnB1dCcpIGZpbHRlcklucHV0TGlzdCAhOiBRdWVyeUxpc3Q8TWF0SW5wdXQ+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0TWVudVRyaWdnZXIsIHsgc3RhdGljOiB0cnVlIH0pIG1lbnUgITogTWF0TWVudVRyaWdnZXI7XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyTGlzdDogQWJzdHJhY3RGaWx0ZXJbXSA9IFtdO1xyXG4gIHByaXZhdGUgZXZlbnRzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgQElucHV0KClcclxuICBnZXQgZmlsdGVycygpOiBBYnN0cmFjdEZpbHRlcltdIHtcclxuICAgIGlmICggaXNOdWxsb3JVbmRlZmluZWQodGhpcy5maWx0ZXJMaXN0KSA9PT0gdHJ1ZSB8fCB0aGlzLmZpbHRlckxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyTGlzdCA9IFtdO1xyXG4gICAgICB0aGlzLmFkZE5ld0ZpbHRlcih0aGlzLmZpZWxkLnR5cGUgfHwgJ3RleHQnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZpbHRlckxpc3Q7XHJcbiAgfVxyXG4gIHNldCBmaWx0ZXJzKHZhbHVlczogQWJzdHJhY3RGaWx0ZXJbXSkge1xyXG4gICAgdGhpcy5maWx0ZXJMaXN0ID0gdmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5oYXMtdmFsdWUnKVxyXG4gIGdldCBoYXNWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckxpc3QgJiYgdGhpcy5maWx0ZXJMaXN0LmZpbHRlciggZiA9PiBmLmhhc1ZhbHVlKCkgPT09IHRydWUpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNob3ctdHJpZ2dlcicpXHJcbiAgZ2V0IHNob3dUcmlnZ2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYodGhpcy5tZW51ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWVudS5tZW51T3BlbiB8fCB0aGlzLmhhc1ZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGxhbmd1YWdlUGFjazogVGFibGVJbnRsLCBwdWJsaWMgc2VydmljZTogVGFibGVTZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZXZlbnRzU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxvclVuZGVmaW5lZCh0aGlzLmZpbHRlcnMpKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLmFkZE5ld0ZpbHRlcih0aGlzLmZpZWxkLnR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkTmV3RmlsdGVyKHR5cGU6IHN0cmluZyA9ICd0ZXh0Jykge1xyXG4gICAgc3dpdGNoICh0eXBlIHx8ICd0ZXh0Jykge1xyXG4gICAgICBjYXNlICd0ZXh0Jzoge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTGlzdC5wdXNoKG5ldyBUZXh0RmlsdGVyKHRoaXMubGFuZ3VhZ2VQYWNrKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTGlzdC5wdXNoKG5ldyBOdW1iZXJGaWx0ZXIodGhpcy5sYW5ndWFnZVBhY2spKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdkYXRlJzoge1xyXG4gICAgICAgIC8vIHRoaXMuY29tcGFyZSA9IG5ldyBEYXRlQ29tcGFyZShzZXJ2aWNlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdib29sZWFuJzoge1xyXG4gICAgICAgIC8vIHRoaXMuY29tcGFyZSA9IG5ldyBCb29sZWFuQ29tcGFyZShzZXJ2aWNlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB0aGlzLmZpbHRlckxpc3QucHVzaChuZXcgVGV4dEZpbHRlcih0aGlzLmxhbmd1YWdlUGFjaykpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGggLSAxXS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDFdO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMubWVudSkge1xyXG4gICAgICB0aGlzLmV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMubWVudS5tZW51T3BlbmVkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvY3VzVG9MYXN0SW5wdXQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1c1RvTGFzdElucHV0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dExpc3QubGFzdC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZpbHRlckFjdGlvbl9PbkNsaWNrKGluZGV4LCBhY3Rpb24pIHtcclxuICAgIGlmIChhY3Rpb24gPT09IDAgfHwgYWN0aW9uID09PSAxKSB7IC8vIGFuZCBvclxyXG4gICAgICB0aGlzLmZpbHRlcnNbaW5kZXhdLnR5cGUgPSBhY3Rpb24gPT09IDAgPyAnYW5kJyA6ICdvcic7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMubGVuZ3RoID09PSBpbmRleCArIDEpIHtcclxuICAgICAgICB0aGlzLmFkZE5ld0ZpbHRlcih0aGlzLmZpZWxkLnR5cGUpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNUb0xhc3RJbnB1dCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gMiAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMSkgeyAvLyBkZWxldGVcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNUb0xhc3RJbnB1dCgpO1xyXG4gICAgICB9KTsgLy8gYnVnIGZvciBkZWxldGUgZmlsdGVyIGl0ZW0odW53YW50ZWQgcmVhY3Rpb24gY2xvc2UgbWVudSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyQ29sdW1uX09uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmZpbHRlckxpc3QgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlZC5lbWl0KHRoaXMuZmlsdGVyTGlzdCk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcl9PbkNsaWNrKCkge1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VkLmVtaXQodGhpcy5maWx0ZXJMaXN0KTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=