UNPKG

@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
/** * @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=