@lucasferreiralsf/angular-frontend-library
Version:
This is a set of custom angular components to easy the development of any Subway frontend project.
406 lines • 33.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ViewChild, Renderer2 } from '@angular/core';
import { SelectionModel } from '@angular/cdk/collections';
import { MatPaginator } from '@angular/material';
import { DataTableService } from './data-table.service';
import { map } from 'rxjs/operators';
import { PopoverService } from './popover/popover.service';
import { trigger, transition, useAnimation } from '@angular/animations';
import { flipInX, flipOutX } from 'ng-animate';
/**
* @record
*/
export function DataTableColumnNamesInterface() { }
if (false) {
/** @type {?} */
DataTableColumnNamesInterface.prototype.columnNameApi;
/** @type {?} */
DataTableColumnNamesInterface.prototype.displayName;
}
/**
* @record
*/
export function DataTableInputDataInterface() { }
if (false) {
/** @type {?} */
DataTableInputDataInterface.prototype.id;
/** @type {?} */
DataTableInputDataInterface.prototype.actions;
}
/**
* @record
*/
export function DataTableActionsInterface() { }
if (false) {
/** @type {?} */
DataTableActionsInterface.prototype.actionName;
/** @type {?} */
DataTableActionsInterface.prototype.actionDescription;
/** @type {?} */
DataTableActionsInterface.prototype.actionIcon;
/** @type {?} */
DataTableActionsInterface.prototype.actionFunction;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDelete;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDeleteTitle;
/** @type {?|undefined} */
DataTableActionsInterface.prototype.isDeleteDescription;
}
/**
* @record
*/
export function DataTableTopActionButtonInterface() { }
if (false) {
/** @type {?} */
DataTableTopActionButtonInterface.prototype.actionName;
/** @type {?} */
DataTableTopActionButtonInterface.prototype.eventSlug;
/** @type {?} */
DataTableTopActionButtonInterface.prototype.buttonType;
/** @type {?|undefined} */
DataTableTopActionButtonInterface.prototype.buttonColor;
}
var DataTableComponent = /** @class */ (function () {
function DataTableComponent(dataTableService, popoverService, renderer) {
this.dataTableService = dataTableService;
this.popoverService = popoverService;
this.renderer = renderer;
this.selectColumn = false;
this.columnNames = [];
this.actions = [];
this.inputData = [];
this.topActionButtons = [];
this.displayedColumns = [];
this.columnsToDisplay = [];
this.selection = new SelectionModel(true, []);
this.columnsNameApi = [];
this.topButtonStyle = {
height: '32px',
'line-height': '32px'
};
}
/**
* @return {?}
*/
DataTableComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.data = this.dataTableService.setDataSource(this.inputData);
this.columnsNameApi = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.columnNameApi; }));
this.displayColumns();
this.dataTableService.inputDataEvent.subscribe((/**
* @param {?} inputData
* @return {?}
*/
function (inputData) {
_this.load(inputData);
}));
};
/**
* @param {?} inputData
* @return {?}
*/
DataTableComponent.prototype.load = /**
* @param {?} inputData
* @return {?}
*/
function (inputData) {
var _this = this;
this.inputData = inputData;
this.columnsNameApi = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.columnNameApi; }));
this.data = this.dataTableService.setDataSource(this.inputData);
this.noData = this.data.connect().pipe(map((/**
* @param {?} data
* @return {?}
*/
function (data) { return data.length === 0; })));
this.data.paginator = this.paginator;
this.addActionsToData();
this.displayColumns();
this.popoverService.buttonClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.buttonRowClick(event.event, event.elementId);
}));
};
/**
* @return {?}
*/
DataTableComponent.prototype.filterLimparButtonClick = /**
* @return {?}
*/
function () {
this.dataTableService.filterLimparButtonClick();
};
/**
* @return {?}
*/
DataTableComponent.prototype.filterPesquisarButtonClick = /**
* @return {?}
*/
function () {
this.dataTableService.filterPesquisarButtonClick();
};
/**
* @param {?} eventSlug
* @return {?}
*/
DataTableComponent.prototype.topButtonClick = /**
* @param {?} eventSlug
* @return {?}
*/
function (eventSlug) {
this.dataTableService.topButtonClick(eventSlug);
};
/**
* @param {?} event
* @param {?} index
* @return {?}
*/
DataTableComponent.prototype.buttonRowClick = /**
* @param {?} event
* @param {?} index
* @return {?}
*/
function (event, index) {
// console.log(`buttonRowClick: ${event.toLowerCase()}, ${index.toLowerCase()}`);
this.dataTableService.buttonRowClick(event.toLowerCase(), index);
};
/**
* @return {?}
*/
DataTableComponent.prototype.addActionsToData = /**
* @return {?}
*/
function () {
var _this = this;
this.data.data.map((/**
* @param {?} e
* @return {?}
*/
function (e) {
// tslint:disable-next-line: no-string-literal
e['actions'] = Object.assign({}, _this.actions);
}));
};
/**
* @return {?}
*/
DataTableComponent.prototype.isAllSelected = /**
* @return {?}
*/
function () {
/** @type {?} */
var numSelected = this.selection.selected.length;
/** @type {?} */
var numRows = this.data.data.length;
return numSelected === numRows;
};
/**
* @return {?}
*/
DataTableComponent.prototype.masterToggle = /**
* @return {?}
*/
function () {
var _this = this;
this.isAllSelected()
? this.selection.clear()
: this.data.data.forEach((/**
* @param {?} row
* @return {?}
*/
function (row) { return _this.selection.select(row); }));
};
/**
* @return {?}
*/
DataTableComponent.prototype.displayColumns = /**
* @return {?}
*/
function () {
if (this.selectColumn) {
this.addSelectToDisplayedColumns();
}
if (this.actions.length >= 0) {
this.addActionsToDisplayedColumns();
}
};
/**
* @return {?}
*/
DataTableComponent.prototype.addSelectToDisplayedColumns = /**
* @return {?}
*/
function () {
/** @type {?} */
var select = ['select'];
if (this.columnsNameApi && this.columnsNameApi.length !== 0) {
this.columnsNameApi = select.concat(this.columnsNameApi);
this.displayedColumns = this.columnsNameApi;
this.columnsToDisplay = this.displayedColumns.slice();
}
else {
this.displayedColumns = select.concat(Object.keys(this.data[0]));
this.columnsToDisplay = this.displayedColumns.slice();
}
};
/**
* @return {?}
*/
DataTableComponent.prototype.addActionsToDisplayedColumns = /**
* @return {?}
*/
function () {
/** @type {?} */
var actions = ['actions'];
if (this.columnsNameApi && this.columnsNameApi.length !== 0) {
this.columnsNameApi.push(actions[0]);
this.displayedColumns = this.columnsNameApi;
this.columnsToDisplay = this.displayedColumns.slice();
}
else {
this.displayedColumns = actions.concat(Object.keys(this.data[0]));
this.columnsToDisplay = this.displayedColumns.slice();
}
};
/**
* @param {?} columnNameApi
* @return {?}
*/
DataTableComponent.prototype.verifyNameColumn = /**
* @param {?} columnNameApi
* @return {?}
*/
function (columnNameApi) {
/** @type {?} */
var columnNameApiArray = this.columnNames.map((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.columnNameApi; }));
/** @type {?} */
var indexcolumnNameApi = columnNameApiArray.indexOf(columnNameApi);
if (indexcolumnNameApi >= 0) {
return this.columnNames[indexcolumnNameApi].displayName;
}
else {
return columnNameApi;
}
};
/**
* @return {?}
*/
DataTableComponent.prototype.addColumn = /**
* @return {?}
*/
function () {
/** @type {?} */
var randomColumn = Math.floor(Math.random() * this.displayedColumns.length);
this.columnsToDisplay.push(this.displayedColumns[randomColumn]);
};
/**
* @return {?}
*/
DataTableComponent.prototype.removeColumn = /**
* @return {?}
*/
function () {
if (this.columnsToDisplay.length) {
this.columnsToDisplay.pop();
}
};
DataTableComponent.decorators = [
{ type: Component, args: [{
selector: 'sb-data-table',
template: "<div>\r\n <div fxLayout fxLayoutAlign=\"space-between center\" class=\"mr-16 ml-16 mb-5\">\r\n <div #topButtonAction fxLayout=\"row wrap\" fxLayoutAlign=\"flex-start center\" fxLayoutGap=\"10px grid\">\r\n <sb-button\r\n *ngFor=\"let buttonElement of topActionButtons\"\r\n [materialTypeButton]=\"buttonElement.buttonType\"\r\n [color]=\"buttonElement.buttonColor\"\r\n [actionName]=\"buttonElement.actionName\"\r\n [customStyles]=\"topButtonStyle\"\r\n (buttonClick)=\"topButtonClick(buttonElement.eventSlug)\"\r\n ></sb-button>\r\n </div>\r\n <sb-filter-table (limpar)=\"filterLimparButtonClick()\" (pesquisa)=\"filterPesquisarButtonClick()\">\r\n <ng-content select=\".sb-data-table-content\"></ng-content>\r\n </sb-filter-table>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" style=\"width: 100%;\" class=\"table-striped table-hover\">\r\n <!-- Checkbox Column -->\r\n\r\n <ng-container [matColumnDef]=\"column\" *ngFor=\"let column of displayedColumns\">\r\n <div *ngIf=\"column == 'select'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n >\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </div>\r\n <div *ngIf=\"column !== 'select' && column !== 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n {{ verifyNameColumn(column) }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\">{{ element[column] }}</td>\r\n </div>\r\n <div *ngIf=\"column == 'actions'\">\r\n <th mat-header-cell *matHeaderCellDef>A\u00E7\u00F5es</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div fxLayout>\r\n <div *ngFor=\"let buttonElement of (element.actions | keyvalue)\">\r\n <button\r\n mat-icon-button\r\n *ngIf=\"!buttonElement.value.isDelete\"\r\n (click)=\"buttonRowClick(buttonElement.value.actionName, element.id)\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n >\r\n <mat-icon>{{ buttonElement.value.actionIcon }}</mat-icon>\r\n </button>\r\n <sb-popover\r\n *ngIf=\"buttonElement.value.isDelete\"\r\n matTooltip=\"{{ buttonElement.value.actionDescription }}\"\r\n elementId=\"{{ element.id }}\"\r\n popoverTitle=\"{{ buttonElement.value.isDeleteTitle }}\"\r\n popoverDescription=\"{{ buttonElement.value.isDeleteDescription }}\"\r\n ></sb-popover>\r\n </div>\r\n </div>\r\n </td>\r\n </div>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: columnsToDisplay\" (click)=\"selection.toggle(row)\"></tr>\r\n </table>\r\n\r\n <div @flipInOut *ngIf=\"data.data.length == 0\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxLayoutGap=\"5px\" class=\"m-30\">\r\n <img src=\"../../../assets/img/nodata.svg\" />\r\n <p class=\" mat-caption\">\r\n Sem Registros\r\n </p>\r\n </div>\r\n\r\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 100]\" class=\"mt-10\"></mat-paginator>\r\n</div>\r\n",
animations: [
trigger('flipInOut', [
transition('void => *', useAnimation(flipInX, {
params: { timing: 0.3, delay: 0, a: '10px', b: '0' }
})),
transition('* => void', useAnimation(flipOutX, {
params: { timing: 0.3, delay: 0 }
}))
])
],
styles: ["td.mat-cell:last-of-type,td.mat-footer-cell:last-of-type,th.mat-header-cell:last-of-type{width:180px;text-align:center}"]
}] }
];
/** @nocollapse */
DataTableComponent.ctorParameters = function () { return [
{ type: DataTableService },
{ type: PopoverService },
{ type: Renderer2 }
]; };
DataTableComponent.propDecorators = {
selectColumn: [{ type: Input }],
columnNames: [{ type: Input }],
actions: [{ type: Input }],
inputData: [{ type: Input }],
topActionButtons: [{ type: Input }],
paginator: [{ type: ViewChild, args: [MatPaginator,] }]
};
return DataTableComponent;
}());
export { DataTableComponent };
if (false) {
/** @type {?} */
DataTableComponent.prototype.selectColumn;
/** @type {?} */
DataTableComponent.prototype.columnNames;
/** @type {?} */
DataTableComponent.prototype.actions;
/** @type {?} */
DataTableComponent.prototype.inputData;
/** @type {?} */
DataTableComponent.prototype.topActionButtons;
/** @type {?} */
DataTableComponent.prototype.paginator;
/** @type {?} */
DataTableComponent.prototype.data;
/** @type {?} */
DataTableComponent.prototype.displayedColumns;
/** @type {?} */
DataTableComponent.prototype.columnsToDisplay;
/** @type {?} */
DataTableComponent.prototype.selection;
/** @type {?} */
DataTableComponent.prototype.columnsNameApi;
/** @type {?} */
DataTableComponent.prototype.noData;
/** @type {?} */
DataTableComponent.prototype.topButtonStyle;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.dataTableService;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.popoverService;
/**
* @type {?}
* @private
*/
DataTableComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHVjYXNmZXJyZWlyYWxzZi9hbmd1bGFyLWZyb250ZW5kLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFzQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7O0FBRS9DLG1EQUdDOzs7SUFGQyxzREFBc0I7O0lBQ3RCLG9EQUFvQjs7Ozs7QUFHdEIsaURBR0M7OztJQUZDLHlDQUFXOztJQUNYLDhDQUFtQzs7Ozs7QUFHckMsK0NBUUM7OztJQVBDLCtDQUFtQjs7SUFDbkIsc0RBQTBCOztJQUMxQiwrQ0FBbUI7O0lBQ25CLG1EQUFvQjs7SUFDcEIsNkNBQW1COztJQUNuQixrREFBdUI7O0lBQ3ZCLHdEQUE2Qjs7Ozs7QUFHL0IsdURBS0M7OztJQUpDLHVEQUFtQjs7SUFDbkIsc0RBQWtCOztJQUNsQix1REFBbUI7O0lBQ25CLHdEQUFxQjs7QUFHdkI7SUEwQ0UsNEJBQ1UsZ0JBQWtDLEVBQ2xDLGNBQThC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USxFQUFFLGVBQWU7b0JBQ3pCLG12SEFBMEM7b0JBRTFDLFVBQVUsRUFBRTt3QkFDVixPQUFPLENBQUMsV0FBVyxFQUFFOzRCQUNuQixVQUFVLENBQ1IsV0FBVyxFQUNYLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0NBQ3BCLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7NkJBQ3JELENBQUMsQ0FDSDs0QkFDRCxVQUFVLENBQ1IsV0FBVyxFQUNYLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0NBQ3JCLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTs2QkFDbEMsQ0FBQyxDQUNIO3lCQUNGLENBQUM7cUJBQ0g7O2lCQUNGOzs7O2dCQXJEUSxnQkFBZ0I7Z0JBRWhCLGNBQWM7Z0JBUnJCLFNBQVM7OzsrQkE2RFIsS0FBSzs4QkFDTCxLQUFLOzBCQUNMLEtBQUs7NEJBQ0wsS0FBSzttQ0FDTCxLQUFLOzRCQUVMLFNBQVMsU0FBQyxZQUFZOztJQTZJekIseUJBQUM7Q0FBQSxBQXpLRCxJQXlLQztTQXBKWSxrQkFBa0I7OztJQUM3QiwwQ0FBOEI7O0lBQzlCLHlDQUEyRDs7SUFDM0QscUNBQW1EOztJQUNuRCx1Q0FBdUQ7O0lBQ3ZELDhDQUFvRTs7SUFFcEUsdUNBQWlEOztJQUVqRCxrQ0FBOEI7O0lBQzlCLDhDQUFnQzs7SUFDaEMsOENBQWdDOztJQUNoQyx1Q0FBeUM7O0lBQ3pDLDRDQUE4Qjs7SUFDOUIsb0NBQU87O0lBRVAsNENBR0U7Ozs7O0lBR0EsOENBQTBDOzs7OztJQUMxQyw0Q0FBc0M7Ozs7O0lBQ3RDLHNDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLXRhYmxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFBvcG92ZXJTZXJ2aWNlIH0gZnJvbSAnLi9wb3BvdmVyL3BvcG92ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBmbGlwSW5YLCBmbGlwT3V0WCB9IGZyb20gJ25nLWFuaW1hdGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVDb2x1bW5OYW1lc0ludGVyZmFjZSB7XHJcbiAgY29sdW1uTmFtZUFwaTogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlSW5wdXREYXRhSW50ZXJmYWNlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIGFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbnNJbnRlcmZhY2U7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQWN0aW9uc0ludGVyZmFjZSB7XHJcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xyXG4gIGFjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgYWN0aW9uSWNvbjogc3RyaW5nO1xyXG4gIGFjdGlvbkZ1bmN0aW9uOiBhbnk7XHJcbiAgaXNEZWxldGU/OiBib29sZWFuO1xyXG4gIGlzRGVsZXRlVGl0bGU/OiBzdHJpbmc7XHJcbiAgaXNEZWxldGVEZXNjcmlwdGlvbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVUb3BBY3Rpb25CdXR0b25JbnRlcmZhY2Uge1xyXG4gIGFjdGlvbk5hbWU6IHN0cmluZztcclxuICBldmVudFNsdWc6IHN0cmluZztcclxuICBidXR0b25UeXBlOiBzdHJpbmc7XHJcbiAgYnV0dG9uQ29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ItZGF0YS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdmbGlwSW5PdXQnLCBbXHJcbiAgICAgIHRyYW5zaXRpb24oXHJcbiAgICAgICAgJ3ZvaWQgPT4gKicsXHJcbiAgICAgICAgdXNlQW5pbWF0aW9uKGZsaXBJblgsIHtcclxuICAgICAgICAgIHBhcmFtczogeyB0aW1pbmc6IDAuMywgZGVsYXk6IDAsIGE6ICcxMHB4JywgYjogJzAnIH1cclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICB0cmFuc2l0aW9uKFxyXG4gICAgICAgICcqID0+IHZvaWQnLFxyXG4gICAgICAgIHVzZUFuaW1hdGlvbihmbGlwT3V0WCwge1xyXG4gICAgICAgICAgcGFyYW1zOiB7IHRpbWluZzogMC4zLCBkZWxheTogMCB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHNlbGVjdENvbHVtbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNvbHVtbk5hbWVzOiBEYXRhVGFibGVDb2x1bW5OYW1lc0ludGVyZmFjZVtdID0gW107XHJcbiAgQElucHV0KCkgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uc0ludGVyZmFjZVtdID0gW107XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBEYXRhVGFibGVJbnB1dERhdGFJbnRlcmZhY2VbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHRvcEFjdGlvbkJ1dHRvbnM6IERhdGFUYWJsZVRvcEFjdGlvbkJ1dHRvbkludGVyZmFjZVtdID0gW107XHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuXHJcbiAgZGF0YTogTWF0VGFibGVEYXRhU291cmNlPGFueT47XHJcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICBjb2x1bW5zVG9EaXNwbGF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbCh0cnVlLCBbXSk7XHJcbiAgY29sdW1uc05hbWVBcGk6IHN0cmluZ1tdID0gW107XHJcbiAgbm9EYXRhO1xyXG5cclxuICB0b3BCdXR0b25TdHlsZToge30gPSB7XHJcbiAgICBoZWlnaHQ6ICczMnB4JyxcclxuICAgICdsaW5lLWhlaWdodCc6ICczMnB4J1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkYXRhVGFibGVTZXJ2aWNlOiBEYXRhVGFibGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb3BvdmVyU2VydmljZTogUG9wb3ZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnNldERhdGFTb3VyY2UodGhpcy5pbnB1dERhdGEpO1xyXG4gICAgdGhpcy5jb2x1bW5zTmFtZUFwaSA9IHRoaXMuY29sdW1uTmFtZXMubWFwKGUgPT4gZS5jb2x1bW5OYW1lQXBpKTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMoKTtcclxuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5pbnB1dERhdGFFdmVudC5zdWJzY3JpYmUoaW5wdXREYXRhID0+IHtcclxuICAgICAgdGhpcy5sb2FkKGlucHV0RGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWQoaW5wdXREYXRhKSB7XHJcbiAgICB0aGlzLmlucHV0RGF0YSA9IGlucHV0RGF0YTtcclxuICAgIHRoaXMuY29sdW1uc05hbWVBcGkgPSB0aGlzLmNvbHVtbk5hbWVzLm1hcChlID0+IGUuY29sdW1uTmFtZUFwaSk7XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc2V0RGF0YVNvdXJjZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICB0aGlzLm5vRGF0YSA9IHRoaXMuZGF0YS5jb25uZWN0KCkucGlwZShtYXAoZGF0YSA9PiBkYXRhLmxlbmd0aCA9PT0gMCkpO1xyXG4gICAgdGhpcy5kYXRhLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xyXG4gICAgdGhpcy5hZGRBY3Rpb25zVG9EYXRhKCk7XHJcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zKCk7XHJcbiAgICB0aGlzLnBvcG92ZXJTZXJ2aWNlLmJ1dHRvbkNsaWNrRXZlbnQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgdGhpcy5idXR0b25Sb3dDbGljayhldmVudC5ldmVudCwgZXZlbnQuZWxlbWVudElkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyTGltcGFyQnV0dG9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZmlsdGVyTGltcGFyQnV0dG9uQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIGZpbHRlclBlc3F1aXNhckJ1dHRvbkNsaWNrKCkge1xyXG4gICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmZpbHRlclBlc3F1aXNhckJ1dHRvbkNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICB0b3BCdXR0b25DbGljayhldmVudFNsdWc6IHN0cmluZykge1xyXG4gICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnRvcEJ1dHRvbkNsaWNrKGV2ZW50U2x1Zyk7XHJcbiAgfVxyXG5cclxuICBidXR0b25Sb3dDbGljayhldmVudDogc3RyaW5nLCBpbmRleCkge1xyXG4gICAgLy8gY29uc29sZS5sb2coYGJ1dHRvblJvd0NsaWNrOiAke2V2ZW50LnRvTG93ZXJDYXNlKCl9LCAke2luZGV4LnRvTG93ZXJDYXNlKCl9YCk7XHJcbiAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuYnV0dG9uUm93Q2xpY2soZXZlbnQudG9Mb3dlckNhc2UoKSwgaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkQWN0aW9uc1RvRGF0YSgpIHtcclxuICAgIHRoaXMuZGF0YS5kYXRhLm1hcChlID0+IHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zdHJpbmctbGl0ZXJhbFxyXG4gICAgICBlWydhY3Rpb25zJ10gPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmFjdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhLmRhdGEubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKClcclxuICAgICAgPyB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICAgIDogdGhpcy5kYXRhLmRhdGEuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheUNvbHVtbnMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RDb2x1bW4pIHtcclxuICAgICAgdGhpcy5hZGRTZWxlY3RUb0Rpc3BsYXllZENvbHVtbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuYWRkQWN0aW9uc1RvRGlzcGxheWVkQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkU2VsZWN0VG9EaXNwbGF5ZWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gWydzZWxlY3QnXTtcclxuXHJcbiAgICBpZiAodGhpcy5jb2x1bW5zTmFtZUFwaSAmJiB0aGlzLmNvbHVtbnNOYW1lQXBpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNOYW1lQXBpID0gc2VsZWN0LmNvbmNhdCh0aGlzLmNvbHVtbnNOYW1lQXBpKTtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zTmFtZUFwaTtcclxuICAgICAgdGhpcy5jb2x1bW5zVG9EaXNwbGF5ID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnNsaWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBzZWxlY3QuY29uY2F0KE9iamVjdC5rZXlzKHRoaXMuZGF0YVswXSkpO1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkgPSB0aGlzLmRpc3BsYXllZENvbHVtbnMuc2xpY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEFjdGlvbnNUb0Rpc3BsYXllZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBhY3Rpb25zID0gWydhY3Rpb25zJ107XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1uc05hbWVBcGkgJiYgdGhpcy5jb2x1bW5zTmFtZUFwaS5sZW5ndGggIT09IDApIHtcclxuICAgICAgdGhpcy5jb2x1bW5zTmFtZUFwaS5wdXNoKGFjdGlvbnNbMF0pO1xyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNOYW1lQXBpO1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkgPSB0aGlzLmRpc3BsYXllZENvbHVtbnMuc2xpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IGFjdGlvbnMuY29uY2F0KE9iamVjdC5rZXlzKHRoaXMuZGF0YVswXSkpO1xyXG4gICAgICB0aGlzLmNvbHVtbnNUb0Rpc3BsYXkgPSB0aGlzLmRpc3BsYXllZENvbHVtbnMuc2xpY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZlcmlmeU5hbWVDb2x1bW4oY29sdW1uTmFtZUFwaSkge1xyXG4gICAgY29uc3QgY29sdW1uTmFtZUFwaUFycmF5OiBzdHJpbmdbXSA9IHRoaXMuY29sdW1uTmFtZXMubWFwKFxyXG4gICAgICBlID0+IGUuY29sdW1uTmFtZUFwaVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGluZGV4Y29sdW1uTmFtZUFwaTogbnVtYmVyID0gY29sdW1uTmFtZUFwaUFycmF5LmluZGV4T2YoXHJcbiAgICAgIGNvbHVtbk5hbWVBcGlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGluZGV4Y29sdW1uTmFtZUFwaSA+PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbk5hbWVzW2luZGV4Y29sdW1uTmFtZUFwaV0uZGlzcGxheU5hbWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gY29sdW1uTmFtZUFwaTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZENvbHVtbigpIHtcclxuICAgIGNvbnN0IHJhbmRvbUNvbHVtbiA9IE1hdGguZmxvb3IoXHJcbiAgICAgIE1hdGgucmFuZG9tKCkgKiB0aGlzLmRpc3BsYXllZENvbHVtbnMubGVuZ3RoXHJcbiAgICApO1xyXG4gICAgdGhpcy5jb2x1bW5zVG9EaXNwbGF5LnB1c2godGhpcy5kaXNwbGF5ZWRDb2x1bW5zW3JhbmRvbUNvbHVtbl0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29sdW1uKCkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1uc1RvRGlzcGxheS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zVG9EaXNwbGF5LnBvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=