UNPKG

mm-m3-list

Version:

Created as a helper for H5-SDK in order to display a panel B of an M3 panel whether via Bookmark or SearchRequest. Do not use this library to load a transactional program or programs that will require to load thousands of data at one go. By default this

325 lines 36 kB
import { Component, ViewChild, Input, EventEmitter, Output } from '@angular/core'; import { SohoDataGridComponent } from 'ids-enterprise-ng'; import { BehaviorSubject } from 'rxjs'; import { finalize } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@infor-up/m3-odin-angular"; import * as i2 from "ids-enterprise-ng"; import * as i3 from "@angular/common/http"; import * as i4 from "@angular/common"; class ProgramInstance { constructor(formService, instanceId) { this.formService = formService; this.instanceId = instanceId; } executeCommand(commandType, commandValue, params) { const request = { commandType, commandValue, params, instanceId: this.instanceId }; return this.formService.executeRequest(request); } } export class MMM3ListComponent { constructor(formService, messageService, http) { this.formService = formService; this.messageService = messageService; this.http = http; /** * Busy indicator */ this.isBusy = false; /** * Custom gridOptions. Column definitions will not be overrwitten */ this.gridOptions = undefined; /** * Columns to be ignored */ this.ignoredColumns = []; /** * Key-value pair to overwrite the column heading. Key would be the column name and value will be the overriding column label */ this.columnHeadings = {}; /** * Flag if to add the default filterable column from bookmark */ this.useDefaultFilter = true; /** * List of columns that will have a filter */ this.filterables = []; /** * List of columns that are editable */ this.editables = []; /** * Number of page down request for a bookmark. Default would load upto 99 rows */ this.requestCount = 3; /** * If selection checkbox will be added as a column */ this.enableCheckbox = false; /** * Emits when first set of data has been loaded */ this.firstDataRetrieved = new EventEmitter(); /** * Emits when data has been loaded */ this.dataRetrieved = new EventEmitter(); /** * Subject and observable for shown records */ this.dataSubject$ = new BehaviorSubject([]); this.data = this.dataSubject$.asObservable(); /** * Will contain the complete data after all records has been loaded. * Used for when the gridOption groupable is enabled */ this.allItems = []; /** * Default gridOptions */ this.defaultOptions = { columns: [], selectable: 'mixed', disableRowDeactivation: true, filterable: false, paging: false, rowHeight: 'short' }; } ngOnInit() { this.allItems = []; if (!this.gridOptions) { this.gridOptions = this.defaultOptions; } else { this.gridOptions = { ...this.defaultOptions, ...this.gridOptions }; } } onResponse(response) { this.instanceId = response.instanceId; if (response.result !== 0) { this.onError(response); return; } if (response.panel.list) { const panel = response.panel; const items = panel.list.items; this.createColumns(panel); this.allItems = [...this.allItems, ...items]; // Do not show initial data if groupable is used. // All data needs to be retrieved before showing data. if (!this.gridOptions.groupable) { this.dataSubject$.next(items); } // Emit event that first set of records has been fetched setTimeout(() => { this.firstDataRetrieved.emit(); }); if (this.searchRequest) { this.dataLoaded(); return; } if (this.bookmark && !this.searchRequest) { if (items.length < 33) { this.dataLoaded(); return; } const programInstance = new ProgramInstance(this.formService, this.instanceId); this.loadAllRows(programInstance, 1); } } else { this.dataLoaded(); } } createColumns(panel) { const columns = []; if (this.gridOptions.columns.length === 0) { if (this.enableCheckbox) { columns.push({ id: 'selectionCheckbox', sortable: false, resizable: false, width: 50, formatter: Soho.Formatters.SelectionCheckbox, align: 'center' }); } panel.list.columns.forEach((col) => { if (this.ignoredColumns.indexOf(col.fullName) === -1) { columns.push({ id: col.fullName, field: col.fullName, name: this.columnHeadings[col.fullName] ? this.columnHeadings[col.fullName] : col.header, align: col.isRight ? 'right' : 'left', filterType: col.positionField && this.useDefaultFilter || this.filterables.indexOf(col.fullName) > -1 ? col.isRight ? 'integer' : 'text' : null, editor: this.editables.indexOf(col.fullName) > -1 ? Soho.Editors.Input : null }); } }); if (this.additionalColumns) { this.additionalColumns.forEach((column) => { if (column.idx) { columns.splice(column.idx, 0, column); } else { columns.push(column); } }); } this.dataGrid.updateColumns(columns, null); } } /** * Recursive funciton to load all rows */ loadAllRows(programInstance, count) { if (count > this.requestCount) { this.dataLoaded(); return; } programInstance.executeCommand('PAGE', 'DOWN').subscribe(response => { const panel = response.panel; if (panel.list.items.length === 0) { this.dataLoaded(); return; } // Add new data to existing const newItems = [...this.allItems, ...panel.list.items]; this.allItems = [...newItems]; if (!this.gridOptions.groupable) { this.dataSubject$.next(newItems); } this.loadAllRows(programInstance, ++count); }); } openBookmark() { this.allItems = []; const defaultBookmark = { isStateless: false, values: {} }; this.isBusy = true; this.formService .executeBookmark({ ...defaultBookmark, ...this.bookmark }) .subscribe((r) => this.onResponse(r), (r) => this.onError(r), () => { if (!this.gridOptions.groupable) { this.isBusy = false; } }); } executeSearch() { this.isBusy = true; this.formService.executeSearch(this.searchRequest).subscribe((r) => { this.onResponse(r); }, (r) => { this.onError(r); }, () => { this.isBusy = false; }); } selectedRows() { const selectedRows = []; this.dataGrid.selectedRows().forEach(item => { selectedRows.push(item.data); }); return selectedRows; } getItems() { return this.dataGrid.dataset; } updateItems(items) { this.dataSubject$.next(items); } dataLoaded() { if (this.gridOptions.groupable) { this.dataSubject$.next(this.allItems); } this.closeInstance(); } closeInstance() { this.formService .executeCommand('CLOSE', this.instanceId) .pipe(finalize(() => { this.isBusy = false; setTimeout(() => { this.dataRetrieved.emit(); }); })) .subscribe(); return; } onError(response) { const message = response.message || 'Unable to open bookmark'; const buttons = [{ text: 'OK', click: (e, modal) => { modal.close(); } }]; this.messageService.error() .title('Bookmark error') .message(message) .buttons(buttons) .open(); } } MMM3ListComponent.ɵfac = function MMM3ListComponent_Factory(t) { return new (t || MMM3ListComponent)(i0.ɵɵdirectiveInject(i1.FormService), i0.ɵɵdirectiveInject(i2.SohoMessageService), i0.ɵɵdirectiveInject(i3.HttpClient)); }; MMM3ListComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MMM3ListComponent, selectors: [["mm-m3-list"]], viewQuery: function MMM3ListComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(SohoDataGridComponent, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dataGrid = _t.first); } }, inputs: { bookmark: "bookmark", searchRequest: "searchRequest", gridOptions: "gridOptions", additionalColumns: "additionalColumns", ignoredColumns: "ignoredColumns", columnHeadings: "columnHeadings", useDefaultFilter: "useDefaultFilter", filterables: "filterables", editables: "editables", requestCount: "requestCount", enableCheckbox: "enableCheckbox" }, outputs: { firstDataRetrieved: "firstDataRetrieved", dataRetrieved: "dataRetrieved" }, decls: 3, vars: 6, consts: [["soho-busyindicator", "", 3, "activated", "displayDelay"], ["soho-datagrid", "", 3, "gridOptions", "data"]], template: function MMM3ListComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0); i0.ɵɵelement(1, "div", 1); i0.ɵɵpipe(2, "async"); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("activated", ctx.isBusy)("displayDelay", 0); i0.ɵɵadvance(1); i0.ɵɵproperty("gridOptions", ctx.gridOptions)("data", i0.ɵɵpipeBind1(2, 4, ctx.data)); } }, dependencies: [i2.SohoBusyIndicatorDirective, i2.SohoDataGridComponent, i4.AsyncPipe], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MMM3ListComponent, [{ type: Component, args: [{ selector: 'mm-m3-list', template: ` <div soho-busyindicator [activated]="isBusy" [displayDelay]="0"> <div soho-datagrid [gridOptions]="gridOptions" [data]="data | async"></div> </div>` }] }], function () { return [{ type: i1.FormService }, { type: i2.SohoMessageService }, { type: i3.HttpClient }]; }, { bookmark: [{ type: Input }], searchRequest: [{ type: Input }], gridOptions: [{ type: Input }], additionalColumns: [{ type: Input }], ignoredColumns: [{ type: Input }], columnHeadings: [{ type: Input }], useDefaultFilter: [{ type: Input }], filterables: [{ type: Input }], editables: [{ type: Input }], requestCount: [{ type: Input }], enableCheckbox: [{ type: Input }], firstDataRetrieved: [{ type: Output }], dataRetrieved: [{ type: Output }], dataGrid: [{ type: ViewChild, args: [SohoDataGridComponent] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW0tbTMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tbS1tMy1saXN0L3NyYy9saWIvbW0tbTMtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFHMUMsTUFBTSxlQUFlO0lBR25CLFlBQVksV0FBd0IsRUFBRSxVQUFrQjtRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW1CLEVBQUUsWUFBb0IsRUFBRSxNQUFlO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHO1lBQ2QsV0FBVztZQUNYLFlBQVk7WUFDWixNQUFNO1lBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQVNELE1BQU0sT0FBTyxpQkFBaUI7SUF5RzVCLFlBQTZCLFdBQXdCLEVBQVUsY0FBa0MsRUFBVSxJQUFnQjtRQUE5RixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFvQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUF4RzNIOztXQUVHO1FBQ0gsV0FBTSxHQUFHLEtBQUssQ0FBQztRQWlCZjs7V0FF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Qzs7a0ZBcFRVLGlCQUFpQjtvRUFBakIsaUJBQWlCO3VCQStFakIscUJBQXFCOzs7OztRQW5GaEMsOEJBQWdFO1FBQ2hFLHlCQUEyRTs7UUFDM0UsaUJBQU07O1FBRmtCLHNDQUFvQixtQkFBQTtRQUN6QixlQUEyQjtRQUEzQiw2Q0FBMkIsd0NBQUE7O3VGQUduQyxpQkFBaUI7Y0FQN0IsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxZQUFZO2dCQUN0QixRQUFRLEVBQUU7OztTQUdIO2FBQ1I7d0hBZVUsUUFBUTtrQkFBaEIsS0FBSztZQUtHLGFBQWE7a0JBQXJCLEtBQUs7WUFLRyxXQUFXO2tCQUFuQixLQUFLO1lBS0csaUJBQWlCO2tCQUF6QixLQUFLO1lBS0csY0FBYztrQkFBdEIsS0FBSztZQUtHLGNBQWM7a0JBQXRCLEtBQUs7WUFLRyxnQkFBZ0I7a0JBQXhCLEtBQUs7WUFLRyxXQUFXO2tCQUFuQixLQUFLO1lBS0csU0FBUztrQkFBakIsS0FBSztZQUtHLFlBQVk7a0JBQXBCLEtBQUs7WUFLRyxjQUFjO2tCQUF0QixLQUFLO1lBS0ksa0JBQWtCO2tCQUEzQixNQUFNO1lBS0csYUFBYTtrQkFBdEIsTUFBTTtZQUsyQixRQUFRO2tCQUF6QyxTQUFTO21CQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJRm9ybVJlc3BvbnNlLCBJQm9va21hcmssIElTZWFyY2hSZXF1ZXN0LCBQYW5lbCB9IGZyb20gJ0BpbmZvci11cC9tMy1vZGluJztcclxuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICdAaW5mb3ItdXAvbTMtb2Rpbi1hbmd1bGFyJztcclxuaW1wb3J0IHsgU29ob0RhdGFHcmlkQ29tcG9uZW50LCBTb2hvTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdpZHMtZW50ZXJwcmlzZS1uZyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuY2xhc3MgUHJvZ3JhbUluc3RhbmNlIHtcclxuICBmb3JtU2VydmljZTogRm9ybVNlcnZpY2U7XHJcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSwgaW5zdGFuY2VJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm1TZXJ2aWNlID0gZm9ybVNlcnZpY2U7XHJcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZFR5cGU6IHN0cmluZywgY29tbWFuZFZhbHVlOiBzdHJpbmcsIHBhcmFtcz86IHN0cmluZyk6IE9ic2VydmFibGU8SUZvcm1SZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgY29tbWFuZFR5cGUsXHJcbiAgICAgIGNvbW1hbmRWYWx1ZSxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmluc3RhbmNlSWRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UuZXhlY3V0ZVJlcXVlc3QocmVxdWVzdCk7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21tLW0zLWxpc3QnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgPGRpdiBzb2hvLWJ1c3lpbmRpY2F0b3IgW2FjdGl2YXRlZF09XCJpc0J1c3lcIiBbZGlzcGxheURlbGF5XT1cIjBcIj5cclxuICA8ZGl2IHNvaG8tZGF0YWdyaWQgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCIgW2RhdGFdPVwiZGF0YSB8IGFzeW5jXCI+PC9kaXY+XHJcbiAgPC9kaXY+YFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTU1NM0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKlxyXG4gICAqIEJ1c3kgaW5kaWNhdG9yXHJcbiAgICovXHJcbiAgaXNCdXN5ID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc3RhbmNlIGlkLiBXaWxsIGJlIHVzZWQgdG8gY2xvc2UgdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgYSBib29rbWFyayBsaXN0IGluIHRoZSBzZXJ2ZXJcclxuICAgKi9cclxuICBwcml2YXRlIGluc3RhbmNlSWQ6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQm9va21hcmsgZGVmaW5pdGlvbiB0byBvcGVuXHJcbiAgICovXHJcbiAgQElucHV0KCkgYm9va21hcms6IElCb29rbWFyaztcclxuXHJcbiAgLyoqXHJcbiAgICogU2VhcmNoIGRlZmluaXRpb24gdG8gb3BlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNlYXJjaFJlcXVlc3Q6IElTZWFyY2hSZXF1ZXN0O1xyXG5cclxuICAvKipcclxuICAgKiBDdXN0b20gZ3JpZE9wdGlvbnMuIENvbHVtbiBkZWZpbml0aW9ucyB3aWxsIG5vdCBiZSBvdmVycndpdHRlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zID0gdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBBZGRpdGlvbmFsIGNvbHVtbnNcclxuICAgKi9cclxuICBASW5wdXQoKSBhZGRpdGlvbmFsQ29sdW1uczogU29ob0RhdGFHcmlkQ29sdW1uW107XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbHVtbnMgdG8gYmUgaWdub3JlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGlnbm9yZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBLZXktdmFsdWUgcGFpciB0byBvdmVyd3JpdGUgdGhlIGNvbHVtbiBoZWFkaW5nLiBLZXkgd291bGQgYmUgdGhlIGNvbHVtbiBuYW1lIGFuZCB2YWx1ZSB3aWxsIGJlIHRoZSBvdmVycmlkaW5nIGNvbHVtbiBsYWJlbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNvbHVtbkhlYWRpbmdzID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZsYWcgaWYgdG8gYWRkIHRoZSBkZWZhdWx0IGZpbHRlcmFibGUgY29sdW1uIGZyb20gYm9va21hcmtcclxuICAgKi9cclxuICBASW5wdXQoKSB1c2VEZWZhdWx0RmlsdGVyID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBvZiBjb2x1bW5zIHRoYXQgd2lsbCBoYXZlIGEgZmlsdGVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgZmlsdGVyYWJsZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3Qgb2YgY29sdW1ucyB0aGF0IGFyZSBlZGl0YWJsZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGVkaXRhYmxlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogTnVtYmVyIG9mIHBhZ2UgZG93biByZXF1ZXN0IGZvciBhIGJvb2ttYXJrLiBEZWZhdWx0IHdvdWxkIGxvYWQgdXB0byA5OSByb3dzXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWVzdENvdW50ID0gMztcclxuXHJcbiAgLyoqXHJcbiAgICogSWYgc2VsZWN0aW9uIGNoZWNrYm94IHdpbGwgYmUgYWRkZWQgYXMgYSBjb2x1bW5cclxuICAgKi9cclxuICBASW5wdXQoKSBlbmFibGVDaGVja2JveCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIGZpcnN0IHNldCBvZiBkYXRhIGhhcyBiZWVuIGxvYWRlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBmaXJzdERhdGFSZXRyaWV2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gZGF0YSBoYXMgYmVlbiBsb2FkZWRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgZGF0YVJldHJpZXZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSBncmlkIGluc3RhbmNlXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZChTb2hvRGF0YUdyaWRDb21wb25lbnQpIGRhdGFHcmlkOiBTb2hvRGF0YUdyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YmplY3QgYW5kIG9ic2VydmFibGUgZm9yIHNob3duIHJlY29yZHNcclxuICAgKi9cclxuICBwcml2YXRlIGRhdGFTdWJqZWN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xyXG4gIGRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2lsbCBjb250YWluIHRoZSBjb21wbGV0ZSBkYXRhIGFmdGVyIGFsbCByZWNvcmRzIGhhcyBiZWVuIGxvYWRlZC5cclxuICAgKiBVc2VkIGZvciB3aGVuIHRoZSBncmlkT3B0aW9uIGdyb3VwYWJsZSBpcyBlbmFibGVkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhbGxJdGVtcyA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IGdyaWRPcHRpb25zXHJcbiAgICovXHJcbiAgZGVmYXVsdE9wdGlvbnM6IFNvaG9EYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICBjb2x1bW5zOiBbXSwgICAgICAvLyBDYW5ub3QgYmUgb3ZlcndyaXR0ZW4gZnJvbSBoZXJlXHJcbiAgICBzZWxlY3RhYmxlOiAnbWl4ZWQnLFxyXG4gICAgZGlzYWJsZVJvd0RlYWN0aXZhdGlvbjogdHJ1ZSxcclxuICAgIGZpbHRlcmFibGU6IGZhbHNlLFxyXG4gICAgcGFnaW5nOiBmYWxzZSxcclxuICAgIHJvd0hlaWdodDogJ3Nob3J0J1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLCBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBTb2hvTWVzc2FnZVNlcnZpY2UsIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmFsbEl0ZW1zID0gW107XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb25zID0gey4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsIC4uLnRoaXMuZ3JpZE9wdGlvbnN9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblJlc3BvbnNlKHJlc3BvbnNlOiBJRm9ybVJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmluc3RhbmNlSWQgPSByZXNwb25zZS5pbnN0YW5jZUlkO1xyXG5cclxuICAgIGlmIChyZXNwb25zZS5yZXN1bHQgIT09IDApIHtcclxuICAgICAgdGhpcy5vbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5wYW5lbC5saXN0KSB7XHJcbiAgICAgIGNvbnN0IHBhbmVsID0gcmVzcG9uc2UucGFuZWw7XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0gcGFuZWwubGlzdC5pdGVtcztcclxuXHJcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1ucyhwYW5lbCk7XHJcblxyXG4gICAgICB0aGlzLmFsbEl0ZW1zID0gWy4uLnRoaXMuYWxsSXRlbXMsIC4uLml0ZW1zXTtcclxuXHJcbiAgICAgIC8vIERvIG5vdCBzaG93IGluaXRpYWwgZGF0YSBpZiBncm91cGFibGUgaXMgdXNlZC5cclxuICAgICAgLy8gQWxsIGRhdGEgbmVlZHMgdG8gYmUgcmV0cmlldmVkIGJlZm9yZSBzaG93aW5nIGRhdGEuXHJcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5ncm91cGFibGUpIHtcclxuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0JC5uZXh0KGl0ZW1zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRW1pdCBldmVudCB0aGF0IGZpcnN0IHNldCBvZiByZWNvcmRzIGhhcyBiZWVuIGZldGNoZWRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXJzdERhdGFSZXRyaWV2ZWQuZW1pdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmRhdGFMb2FkZWQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmJvb2ttYXJrICYmICF0aGlzLnNlYXJjaFJlcXVlc3QpIHtcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgMzMpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbUluc3RhbmNlID0gbmV3IFByb2dyYW1JbnN0YW5jZSh0aGlzLmZvcm1TZXJ2aWNlLCB0aGlzLmluc3RhbmNlSWQpO1xyXG4gICAgICAgIHRoaXMubG9hZEFsbFJvd3MocHJvZ3JhbUluc3RhbmNlLCAxKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbnMocGFuZWw6IFBhbmVsKSB7XHJcbiAgICBjb25zdCBjb2x1bW5zOiBTb2hvRGF0YUdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgaWYgKHRoaXMuZW5hYmxlQ2hlY2tib3gpIHtcclxuICAgICAgICBjb2x1bW5zLnB1c2goe1xyXG4gICAgICAgICAgaWQ6ICdzZWxlY3Rpb25DaGVja2JveCcsXHJcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgd2lkdGg6IDUwLFxyXG4gICAgICAgICAgZm9ybWF0dGVyOiBTb2hvLkZvcm1hdHRlcnMuU2VsZWN0aW9uQ2hlY2tib3gsXHJcbiAgICAgICAgICBhbGlnbjogJ2NlbnRlcid9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcGFuZWwubGlzdC5jb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlZENvbHVtbnMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgaWQ6IGNvbC5mdWxsTmFtZSxcclxuICAgICAgICAgICAgZmllbGQ6IGNvbC5mdWxsTmFtZSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5jb2x1bW5IZWFkaW5nc1tjb2wuZnVsbE5hbWVdID8gdGhpcy5jb2x1bW5IZWFkaW5nc1tjb2wuZnVsbE5hbWVdIDogY29sLmhlYWRlcixcclxuICAgICAgICAgICAgYWxpZ246IGNvbC5pc1JpZ2h0ID8gJ3JpZ2h0JyA6ICdsZWZ0JyxcclxuICAgICAgICAgICAgZmlsdGVyVHlwZTogY29sLnBvc2l0aW9uRmllbGQgJiYgdGhpcy51c2VEZWZhdWx0RmlsdGVyIHx8IHRoaXMuZmlsdGVyYWJsZXMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID4gLTEgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuaXNSaWdodCA/ICdpbnRlZ2VyJyA6ICd0ZXh0JyA6IG51bGwsXHJcbiAgICAgICAgICAgIGVkaXRvcjogdGhpcy5lZGl0YWJsZXMuaW5kZXhPZihjb2wuZnVsbE5hbWUpID4gLTEgPyBTb2hvLkVkaXRvcnMuSW5wdXQgOiBudWxsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5hZGRpdGlvbmFsQ29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBTb2hvRGF0YUdyaWRDb2x1bW4gfCBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW4uaWR4KSB7XHJcbiAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGNvbHVtbi5pZHgsIDAsIGNvbHVtbik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRhdGFHcmlkLnVwZGF0ZUNvbHVtbnMoY29sdW1ucywgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmUgZnVuY2l0b24gdG8gbG9hZCBhbGwgcm93c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZEFsbFJvd3MocHJvZ3JhbUluc3RhbmNlOiBQcm9ncmFtSW5zdGFuY2UsIGNvdW50OiBudW1iZXIpIHtcclxuICAgIGlmIChjb3VudCA+IHRoaXMucmVxdWVzdENvdW50KSB7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcHJvZ3JhbUluc3RhbmNlLmV4ZWN1dGVDb21tYW5kKCdQQUdFJywgJ0RPV04nKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICBjb25zdCBwYW5lbCA9IHJlc3BvbnNlLnBhbmVsO1xyXG4gICAgICBpZiAocGFuZWwubGlzdC5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBZGQgbmV3IGRhdGEgdG8gZXhpc3RpbmdcclxuICAgICAgY29uc3QgbmV3SXRlbXMgPSBbLi4udGhpcy5hbGxJdGVtcywgLi4ucGFuZWwubGlzdC5pdGVtc107XHJcblxyXG4gICAgICB0aGlzLmFsbEl0ZW1zID0gWy4uLm5ld0l0ZW1zXTtcclxuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmdyb3VwYWJsZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVN1YmplY3QkLm5leHQobmV3SXRlbXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRBbGxSb3dzKHByb2dyYW1JbnN0YW5jZSwgKytjb3VudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5Cb29rbWFyaygpIHtcclxuICAgIHRoaXMuYWxsSXRlbXMgPSBbXTtcclxuICAgIGNvbnN0IGRlZmF1bHRCb29rbWFyazogSUJvb2ttYXJrID0ge1xyXG4gICAgICBpc1N0YXRlbGVzczogZmFsc2UsXHJcbiAgICAgIHZhbHVlczoge31cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc0J1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtU2VydmljZVxyXG4gICAgICAuZXhlY3V0ZUJvb2ttYXJrKHsuLi5kZWZhdWx0Qm9va21hcmssIC4uLnRoaXMuYm9va21hcmt9KVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBJRm9ybVJlc3BvbnNlKSA9PiB0aGlzLm9uUmVzcG9uc2UociksXHJcbiAgICAgICAgKHIpID0+IHRoaXMub25FcnJvcihyKSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuZ3JvdXBhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZVNlYXJjaCgpIHtcclxuICAgIHRoaXMuaXNCdXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9ybVNlcnZpY2UuZXhlY3V0ZVNlYXJjaCh0aGlzLnNlYXJjaFJlcXVlc3QpLnN1YnNjcmliZSgocjogSUZvcm1SZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLm9uUmVzcG9uc2Uocik7XHJcbiAgICB9LCAocikgPT4ge1xyXG4gICAgICB0aGlzLm9uRXJyb3Iocik7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkUm93cygpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5zZWxlY3RlZFJvd3MoKS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBzZWxlY3RlZFJvd3MucHVzaChpdGVtLmRhdGEpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhR3JpZC5kYXRhc2V0O1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSXRlbXMoaXRlbXM6IGFueSkge1xyXG4gICAgdGhpcy5kYXRhU3ViamVjdCQubmV4dChpdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5ncm91cGFibGUpIHtcclxuICAgICAgdGhpcy5kYXRhU3ViamVjdCQubmV4dCh0aGlzLmFsbEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsb3NlSW5zdGFuY2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VJbnN0YW5jZSgpIHtcclxuICAgIHRoaXMuZm9ybVNlcnZpY2VcclxuICAgICAgLmV4ZWN1dGVDb21tYW5kKCdDTE9TRScsIHRoaXMuaW5zdGFuY2VJZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0J1c3kgPSBmYWxzZTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFSZXRyaWV2ZWQuZW1pdCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRXJyb3IocmVzcG9uc2U6IElGb3JtUmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlIHx8ICdVbmFibGUgdG8gb3BlbiBib29rbWFyayc7XHJcbiAgICBjb25zdCBidXR0b25zID0gW3sgdGV4dDogJ09LJywgY2xpY2s6IChlOiBhbnksIG1vZGFsOiBhbnkpID0+IHsgbW9kYWwuY2xvc2UoKTsgfSB9XTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoKVxyXG4gICAgLnRpdGxlKCdCb29rbWFyayBlcnJvcicpXHJcbiAgICAubWVzc2FnZShtZXNzYWdlKVxyXG4gICAgLmJ1dHRvbnMoYnV0dG9ucylcclxuICAgIC5vcGVuKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==