UNPKG

@hpe/angular-toolkit

Version:

Hewlett-Packard Enterprise : Angular toolkit for rapid project development

657 lines (656 loc) 66.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ //============================================================================= //=== //=== (C) Copyright 2018 Hewlett Packard Enterprise Development LP. //=== //=== Use of this source code is governed by an MIT-style license that can be //=== found in the LICENSE file //============================================================================= import * as tslib_1 from "tslib"; import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { ContextMenu, DataTable } from "primeng/primeng"; import { FilterChangeEvent } from "@hpe/angular-toolkit/model"; import { RowSelectedEvent } from "@hpe/angular-toolkit/model"; import { RowUnselectedEvent } from "@hpe/angular-toolkit/model"; import { MenuSelectionMode } from "@hpe/angular-toolkit/model"; import { Lib } from "@hpe/angular-toolkit/lib"; import { AbstractSubscriber } from "@hpe/angular-toolkit/service"; import { EventBusService } from "@hpe/angular-toolkit/service"; import { LabelService } from "@hpe/angular-toolkit/service"; var ListTable = /** @class */ (function (_super) { tslib_1.__extends(ListTable, _super); //------------------------------------------------------------------------- //--- //--- Constructor //--- //------------------------------------------------------------------------- function ListTable(eventBusService, labelService) { var _this = _super.call(this, eventBusService) || this; _this.labelService = labelService; //------------------------------------------------------------------------- _this.onFilterChange = new EventEmitter(); _this.onRowSelected = new EventEmitter(); _this.onRowUnselected = new EventEmitter(); _this.alignMap = { 'left': 'alignLeft', 'center': 'alignCenter', 'right': 'alignRight' }; _this.rowsPerPage = 8; _this.rowSet = [4, 8, 12, 16, 20, 50]; _this.loading = false; _this.multiSelection = false; return _this; } /** * @return {?} */ ListTable.prototype.exportAll = /** * @return {?} */ function () { this.pTable.exportCSV(); }; /** * @return {?} */ ListTable.prototype.exportSelected = /** * @return {?} */ function () { this.pTable.exportCSV({ selectionOnly: true }); }; Object.defineProperty(ListTable.prototype, "allValue", { //------------------------------------------------------------------------- //--- Localization methods //------------------------------------------------------------------------- get: /** * @return {?} */ function () { return this.labelService.getLabel("list-table", "all"); }, enumerable: true, configurable: true }); Object.defineProperty(ListTable.prototype, "noRecords", { //------------------------------------------------------------------------- get: /** * @return {?} */ function () { return this.labelService.getLabel("list-table", "noRecords"); }, enumerable: true, configurable: true }); //------------------------------------------------------------------------- //--- //--- Lifecycle events //--- //------------------------------------------------------------------------- /** * @param {?} changes * @return {?} */ ListTable.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var /** @type {?} */ rebuildColumnValues = false; if (changes["columns"]) { this.initColumns(); rebuildColumnValues = true; } if (changes["data"]) { this.initData(); rebuildColumnValues = true; } if (changes["visibleColumns"]) { this.initVisibleColumns(); } if (rebuildColumnValues) { this.initColumnValues(); } // "labels" ??? }; //------------------------------------------------------------------------- //--- //--- Events //--- //------------------------------------------------------------------------- /** * @param {?} event * @return {?} */ ListTable.prototype.onRowSelect = /** * @param {?} event * @return {?} */ function (event) { //--- In case of multi-selection, the selectedRow variable is an array of rows var /** @type {?} */ row = this.restoreRow(event.data); var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow); this.onRowSelected.emit(new RowSelectedEvent(row, rows)); }; //------------------------------------------------------------------------- /** * @param {?} event * @return {?} */ ListTable.prototype.onRowUnselect = /** * @param {?} event * @return {?} */ function (event) { //--- In case of multi-selection, the selectedRow variable is an array of rows var /** @type {?} */ row = this.restoreRow(event.data); var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow); this.onRowUnselected.emit(new RowUnselectedEvent(row, rows)); }; //------------------------------------------------------------------------- /** * @param {?} event * @return {?} */ ListTable.prototype.onContextMenuSelect = /** * @param {?} event * @return {?} */ function (event) { //--- In case of multi-selection, the selectedRow variable is an array of rows var /** @type {?} */ row = this.restoreRow(event.data); var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow); var /** @type {?} */ rse = new RowSelectedEvent(row, rows); //--- Emit event this.onRowSelected.emit(rse); //--- Setup context menu this.activeMenu = this.selectMenuItems(this.contextMenu, rse, null); }; //------------------------------------------------------------------------- /** * @param {?} event * @return {?} */ ListTable.prototype.onFilter = /** * @param {?} event * @return {?} */ function (event) { this.onFilterChange.emit(new FilterChangeEvent(this.getFilteredSize())); }; //------------------------------------------------------------------------- //--- //--- Local methods //--- //------------------------------------------------------------------------- /** * @param {?} value * @param {?} col * @return {?} */ ListTable.prototype.filter = /** * @param {?} value * @param {?} col * @return {?} */ function (value, col) { this.pTable.filter(value, col.field, col.filterMatchMode); }; /** * @return {?} */ ListTable.prototype.initColumns = /** * @return {?} */ function () { var _this = this; console.log("Initializing columns : " + JSON.stringify(this.columns)); this.colToIndex = new Map(); if (this.columns == null) { //--- Do nothing for now } else { var /** @type {?} */ index_1 = 0; this.columns.forEach(function (col) { _this.colToIndex.set(col.field, index_1++); col.displayHeader = _this.calcHeader(col); col.filterMatchMode = _this.calcFilterMatchMode(col); }); } }; /** * @param {?} col * @return {?} */ ListTable.prototype.calcHeader = /** * @param {?} col * @return {?} */ function (col) { return col.header || (this.labelGroup && this.labelService.getLabel(this.labelGroup, col.field)) || col.field; }; /** * @param {?} col * @return {?} */ ListTable.prototype.calcFilterMatchMode = /** * @param {?} col * @return {?} */ function (col) { if (col.filter == null) { return "contains"; } if (col.filter == "select") { return "equals"; } if (col.filter == "list") { return "in"; } return null; }; /** * @return {?} */ ListTable.prototype.initData = /** * @return {?} */ function () { var _this = this; console.log("Initializing data : " + JSON.stringify(this.data)); if (this.columns == null || this.data == null) { this.displayData = null; } else { this.displayData = []; this.data.forEach(function (row) { var /** @type {?} */ displayRow = {}; _this.displayData.push(displayRow); for (var /** @type {?} */ key in row) { var /** @type {?} */ cell = new ListTableCell(); displayRow[key] = cell; var /** @type {?} */ value = row[key]; var /** @type {?} */ colNdx = _this.colToIndex.get(key); var /** @type {?} */ col = _this.columns[colNdx]; cell.originalValue = value; cell.displayValue = _this.calcDisplayValue(row, col, value); cell.style = _this.calcDisplayStyle(row, col, value); } }); } }; /** * @param {?} row * @param {?} col * @param {?} value * @return {?} */ ListTable.prototype.calcDisplayValue = /** * @param {?} row * @param {?} col * @param {?} value * @return {?} */ function (row, col, value) { if (col.transcoder != null) { value = col.transcoder.transcode(value); } return (value != null) ? value.toString() : null; }; /** * @param {?} row * @param {?} col * @param {?} value * @return {?} */ ListTable.prototype.calcDisplayStyle = /** * @param {?} row * @param {?} col * @param {?} value * @return {?} */ function (row, col, value) { var /** @type {?} */ styles = ['cell']; if (col.alignment != null) { styles.push(this.alignMap[col.alignment]); } if (col.styler != null) { var /** @type {?} */ style = col.styler.style(value, row); if (style.icon != null) { styles.push("fa"); styles.push(style.icon); } if (style.extraClass != null) { styles.push(style.extraClass); } } return styles; }; /** * @return {?} */ ListTable.prototype.initVisibleColumns = /** * @return {?} */ function () { var _this = this; console.log("Initializing visible columns : " + JSON.stringify(this.visibleColumns)); if (this.columns == null || this.visibleColumns == null) { this.displayColumns = null; } else { this.displayColumns = []; this.visibleColumns.forEach(function (name) { var /** @type {?} */ index = _this.colToIndex.get(name); if (index != null) { _this.displayColumns.push(_this.columns[index]); } }); } }; /** * @return {?} */ ListTable.prototype.initColumnValues = /** * @return {?} */ function () { var _this = this; this.columnValues = new Map(); //--- exit if we still do not have columns or values if (this.columns == null || this.data == null) { return null; } console.log("Calculating column values for : "); this.columns.forEach(function (col) { console.log(" --> " + col.field); _this.columnValues.set(col.field, _this.getColumnValues(col)); }); }; /** * @param {?} col * @return {?} */ ListTable.prototype.getColumnValues = /** * @param {?} col * @return {?} */ function (col) { var /** @type {?} */ field = col.field; var /** @type {?} */ values = new Set(); //--- first, collect distinct values this.data.forEach(function (row) { var /** @type {?} */ value = row[field]; //--- null values causes issues with filters if (value != null) { values.add(value); } }); //--- second, build final list as an array of (value, label) entries var /** @type {?} */ list = []; //--- only the dropdown filter needs the "All" option if (col.filter == "select") { list.push({ label: this.allValue, value: null }); } values.forEach(function (value) { if (col.transcoder != null) { value = col.transcoder.transcode(value); } var /** @type {?} */ label = (value != null) ? value.toString() : null; list.push({ label: label, value: label }); }); return list; }; /** * @return {?} */ ListTable.prototype.getFilteredSize = /** * @return {?} */ function () { if (this.pTable) { if (this.pTable.filteredValue) { return this.pTable.filteredValue.length; } } if (this.data) { return this.data.length; } return null; }; /** * @param {?} data * @return {?} */ ListTable.prototype.restoreRow = /** * @param {?} data * @return {?} */ function (data) { var /** @type {?} */ row = {}; for (var /** @type {?} */ key in data) { row[key] = data[key].originalValue; } return row; }; /** * @param {?} rows * @return {?} */ ListTable.prototype.calcSelectedRows = /** * @param {?} rows * @return {?} */ function (rows) { var _this = this; var /** @type {?} */ result = []; if (rows != null) { rows.forEach(function (row) { result.push(_this.restoreRow(row)); }); } return result; }; /** * @param {?} menu * @param {?} rse * @param {?} parentId * @return {?} */ ListTable.prototype.selectMenuItems = /** * @param {?} menu * @param {?} rse * @param {?} parentId * @return {?} */ function (menu, rse, parentId) { var _this = this; //--- Filter menu items depending on selector var /** @type {?} */ result = []; menu.forEach(function (menu) { var /** @type {?} */ m = Lib.menu.clone(menu); //--- Concatenate parentId if (parentId != null) { m.id = parentId + "." + m.id; } m.command = function (event) { _this.fireEvent(m.id, rse); }; if (_this.menuSelector == null) { result.push(m); } else { var /** @type {?} */ mode = _this.menuSelector.select(m.id, rse); m.disabled = (mode == MenuSelectionMode.DISABLE); if (mode == MenuSelectionMode.EXCLUDE) { //--- Exclude menu from list } else { //--- Mode is INCLUDE or DISABLE result.push(m); } } //--- Recurse on children if (menu.items != null) { m.items = _this.selectMenuItems(menu.items, rse, m.id); if (menu.items != null && m.items == null) { m.disabled = true; } } }); return (result.length != 0) ? result : null; }; /** * @param {?} code * @param {?} event * @return {?} */ ListTable.prototype.fireEvent = /** * @param {?} code * @param {?} event * @return {?} */ function (code, event) { //--- Hide context-menu (it seems that with our config it does not disappear automatically) this.pContextMenu.hide(); var /** @type {?} */ tableEvent = { code: code, params: event }; _super.prototype.emitToApp.call(this, tableEvent); }; ListTable.decorators = [ { type: Component, args: [{ selector: 'hpe-list-table', template: "<!--\n=============================================================================\n===\n=== (C) Copyright 2018 Hewlett Packard Enterprise Development LP.\n===\n=== Use of this source code is governed by an MIT-style license that can be\n=== found in the LICENSE file\n=============================================================================\n-->\n\n<p-table #tt\n\t\t[columns] = \"displayColumns\"\n\t\t[value] = \"displayData\"\n\t\t[dataKey] = \"rowId\"\n\t\t[selectionMode] = \"multiSelection ? 'multiple' : 'single'\"\n\t\t[paginator] = \"true\"\n\t\t[rows] = \"rowsPerPage\"\n\t\t[rowsPerPageOptions] = \"rowSet\"\n\t\t[pageLinks] = \"10\"\n\t\t[loading] = \"loading\"\n\t\t[metaKeySelection] = \"true\"\n\t\t[contextMenu] = \"cm\"\n\t\t[(selection)] = \"selectedRow\"\n\t\t(onRowSelect) = \"onRowSelect($event)\"\n\t\t(onRowUnselect) = \"onRowUnselect($event)\"\n\t\tcontextMenuSelectionMode = \"joint\"\n\t\t(onContextMenuSelect) = \"onContextMenuSelect($event)\"\n\t\t(onFilter) = \"onFilter($event)\">\n\n\t<ng-template pTemplate=\"header\" let-columns>\n\t\t<tr>\n\t\t\t<th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\n\t\t\t\t{{col.displayHeader}}\n\t\t\t\t<p-sortIcon [field]=\"col.field\"></p-sortIcon>\n\t\t\t</th>\n\t\t</tr>\n\n\t\t<tr class=\"ui-fluid\">\n\t\t\t<th *ngFor=\"let col of columns\">\n\n\t\t\t\t<input *ngIf=\"col.filter == null\"\n\t\t\t\t\t\t\t\tpInputText\n\t\t\t\t\t\t\t\ttype = \"text\"\n\t\t\t\t\t\t\t\t(input) = \"filter($event.target.value, col)\"\n\t\t\t\t\t\t\t\tclass = \"filter\">\n\n\t\t\t\t<p-dropdown *ngIf = \"col.filter == 'select'\"\n\t\t\t\t\t\t\t\t[options] = \"columnValues.get(col.field)\"\n\t\t\t\t\t\t\t\t[style] = \"{'width':'100%'}\"\n\t\t\t\t\t\t\t\t(onChange) = \"filter($event.value, col)\"\n\t\t\t\t\t\t\t\t></p-dropdown>\n\n\t\t\t\t<p-multiSelect *ngIf = \"col.filter == 'list'\"\n\t\t\t\t\t\t\t\t[options] = \"columnValues.get(col.field)\"\n\t\t\t\t\t\t\t\t[defaultLabel] = \"allValue\"\n\t\t\t\t\t\t\t\t(onChange) = \"filter($event.value, col)\"\n\t\t\t\t\t\t\t\tclass = \"filter\"></p-multiSelect>\n\n\t\t\t</th>\n\t\t</tr>\n\t</ng-template>\n\n\t<ng-template pTemplate=\"body\" let-row let-columns=\"columns\">\n\t\t<tr [pSelectableRow]=\"row\" [pContextMenuRow]=\"row\">\n\t\t\t<td *ngFor=\"let col of columns\">\n\t\t\t\t<span [ngClass]=\"row[col.field].style\">{{row[col.field]}}</span>\n\t\t\t</td>\n\t\t</tr>\n\t</ng-template>\n\n\t<ng-template pTemplate=\"emptymessage\" let-columns>\n\t\t<tr>\n\t\t\t<td [attr.colspan]=\"columns.length\">\n\t\t\t\t{{noRecords}}\n\t\t\t</td>\n\t\t</tr>\n\t</ng-template>\n</p-table>\n\n<p-contextMenu #cm [model]=\"activeMenu\" appendTo=\"body\"></p-contextMenu>\n", styles: [".cell{width:100%;display:inline-block;padding:.7em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter{width:100%}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}:host ::ng-deep .ui-paginator{border:none;background-image:inherit}:host ::ng-deep .ui-table .ui-table-thead>tr>th{border:none}:host ::ng-deep .ui-table .ui-table-thead>tr>th:not(.ui-state-highlight){background-color:#fff}:host ::ng-deep .ui-table .ui-table-thead>tr>th:hover{background-color:#c6c9ca}:host ::ng-deep .ui-table .ui-table-tbody>tr.ui-state-highlight{background-color:#a0c0c0}:host ::ng-deep .ui-table .ui-table-thead>tr:last-child{border-bottom:2px solid #c6c9ca}:host ::ng-deep .ui-table .ui-sortable-column.ui-state-highlight{background-color:#5f7a76}:host ::ng-deep .ui-table .ui-table-tbody>tr>td{border-left:none;border-right:none}"] },] }, ]; /** @nocollapse */ ListTable.ctorParameters = function () { return [ { type: EventBusService, }, { type: LabelService, }, ]; }; ListTable.propDecorators = { "rowId": [{ type: Input },], "columns": [{ type: Input },], "data": [{ type: Input },], "visibleColumns": [{ type: Input },], "multiSelection": [{ type: Input },], "rowsPerPage": [{ type: Input },], "rowSet": [{ type: Input },], "loading": [{ type: Input },], "labelGroup": [{ type: Input },], "contextMenu": [{ type: Input },], "menuSelector": [{ type: Input },], "onFilterChange": [{ type: Output },], "onRowSelected": [{ type: Output },], "onRowUnselected": [{ type: Output },], "pTable": [{ type: ViewChild, args: ['tt',] },], "pContextMenu": [{ type: ViewChild, args: ['cm',] },], }; return ListTable; }(AbstractSubscriber)); export { ListTable }; function ListTable_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ListTable.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ListTable.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ListTable.propDecorators; /** @type {?} */ ListTable.prototype.rowId; /** @type {?} */ ListTable.prototype.columns; /** @type {?} */ ListTable.prototype.data; /** @type {?} */ ListTable.prototype.visibleColumns; /** @type {?} */ ListTable.prototype.multiSelection; /** @type {?} */ ListTable.prototype.rowsPerPage; /** @type {?} */ ListTable.prototype.rowSet; /** @type {?} */ ListTable.prototype.loading; /** @type {?} */ ListTable.prototype.labelGroup; /** @type {?} */ ListTable.prototype.contextMenu; /** @type {?} */ ListTable.prototype.menuSelector; /** @type {?} */ ListTable.prototype.onFilterChange; /** @type {?} */ ListTable.prototype.onRowSelected; /** @type {?} */ ListTable.prototype.onRowUnselected; /** @type {?} */ ListTable.prototype.pTable; /** @type {?} */ ListTable.prototype.pContextMenu; /** @type {?} */ ListTable.prototype.selectedRow; /** @type {?} */ ListTable.prototype.displayColumns; /** @type {?} */ ListTable.prototype.displayData; /** @type {?} */ ListTable.prototype.activeMenu; /** @type {?} */ ListTable.prototype.columnValues; /** @type {?} */ ListTable.prototype.colToIndex; /** @type {?} */ ListTable.prototype.alignMap; /** @type {?} */ ListTable.prototype.labelService; } var ListTableCell = /** @class */ (function () { function ListTableCell() { } /** * @return {?} */ ListTableCell.prototype.toString = /** * @return {?} */ function () { return this.displayValue; }; return ListTableCell; }()); function ListTableCell_tsickle_Closure_declarations() { /** @type {?} */ ListTableCell.prototype.originalValue; /** @type {?} */ ListTableCell.prototype.displayValue; /** @type {?} */ ListTableCell.prototype.style; } //============================================================================= //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BocGUvYW5ndWxhci10b29sa2l0L2d1aS9wYW5lbC8iLCJzb3VyY2VzIjpbImxpc3QtdGFibGUvbGlzdC10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUcsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQVF2RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTyw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBUSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTyw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQXFCLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBUyw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQVksOEJBQThCLENBQUM7O0lBNEZqQyxxQ0FBa0I7SUF3RGhELDJFQUEyRTtJQUN4RSxLQUFLO0lBQ0wsaUJBQWlCO0lBQ2pCLEtBQUs7SUFDTCwyRUFBMkU7SUFFM0UsbUJBQW9CLGVBQWlDLEVBQ2pDO1FBRHBCLFlBR0Msa0JBQU0sZUFBZSxDQUFDLFNBTXpCO1FBUnNCLGtCQUFZLEdBQVosWUFBWTs7K0JBekMyQixJQUFJLFlBQVksRUFBcUI7OEJBQ3JDLElBQUksWUFBWSxFQUFvQjtnQ0FDcEMsSUFBSSxZQUFZLEVBQXNCO3lCQTBCakY7WUFDbEIsTUFBTSxFQUFL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QUFZOzs7MEJBb0dsQixLQUFLOzRCQUNGLEtBQUs7eUJBQ0wsS0FBSzttQ0FDTCxLQUFLO21DQUNSLEtBQUs7Z0NBQ0wsS0FBSzsyQkFDTCxLQUFLOzRCQUNMLEtBQUs7K0JBQ0wsS0FBSztnQ0FDTCxLQUFLO2lDQUNMLEtBQUs7bUNBSUwsTUFBTTtrQ0FDTixNQUFNO29DQUNOLE1BQU07MkJBSU4sU0FBUyxTQUFDLElBQUk7aUNBQ2QsU0FBUyxTQUFDLElBQUk7O29CQWxKaEI7RUFxSCtCLGtCQUFrQjtTQUFwQyxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3aEJ0QixJQUFBOzs7Ozs7SUFRUSxnQ0FBUTs7OztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOzt3QkF0cEIzQjtJQXdwQkMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vPT09XG4vLz09PSAoQykgQ29weXJpZ2h0IDIwMTggSGV3bGV0dCBQYWNrYXJkIEVudGVycHJpc2UgRGV2ZWxvcG1lbnQgTFAuXG4vLz09PVxuLy89PT0gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbi8vPT09IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0NvbnRleHRNZW51LCBEYXRhVGFibGV9IGZyb20gXCJwcmltZW5nL3ByaW1lbmdcIjtcblxuaW1wb3J0IHtBcHBFdmVudH0gICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtDZWxsU3R5bGV9ICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtEcm9wZG93bkl0ZW19ICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51fSAgICAgICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtMaXN0VGFibGVDb2x1bW59ICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51U2VsZWN0b3J9ICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtGaWx0ZXJDaGFuZ2VFdmVudH0gIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtSb3dTZWxlY3RlZEV2ZW50fSAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtSb3dVbnNlbGVjdGVkRXZlbnR9IGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51U2VsZWN0aW9uTW9kZX0gIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtMaWJ9ICAgICAgICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9saWJcIjtcbmltcG9ydCB7QWJzdHJhY3RTdWJzY3JpYmVyfSBmcm9tIFwiQGhwZS9hbmd1bGFyLXRvb2xraXQvc2VydmljZVwiO1xuaW1wb3J0IHtFdmVudEJ1c1NlcnZpY2V9ICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9zZXJ2aWNlXCI7XG5pbXBvcnQge0xhYmVsU2VydmljZX0gICAgICAgZnJvbSBcIkBocGUvYW5ndWxhci10b29sa2l0L3NlcnZpY2VcIjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciAgICA6ICAgICAnaHBlLWxpc3QtdGFibGUnLFxuICAgIHRlbXBsYXRlOiBgPCEtLVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PVxuPT09IChDKSBDb3B5cmlnaHQgMjAxOCBIZXdsZXR0IFBhY2thcmQgRW50ZXJwcmlzZSBEZXZlbG9wbWVudCBMUC5cbj09PVxuPT09IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG49PT0gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi0tPlxuXG48cC10YWJsZSAjdHRcblx0XHRbY29sdW1uc10gICAgICAgICAgICAgICAgPSBcImRpc3BsYXlDb2x1bW5zXCJcblx0XHRbdmFsdWVdICAgICAgICAgICAgICAgICAgPSBcImRpc3BsYXlEYXRhXCJcblx0XHRbZGF0YUtleV0gICAgICAgICAgICAgICAgPSBcInJvd0lkXCJcblx0XHRbc2VsZWN0aW9uTW9kZV0gICAgICAgICAgPSBcIm11bHRpU2VsZWN0aW9uID8gJ211bHRpcGxlJyA6ICdzaW5nbGUnXCJcblx0XHRbcGFnaW5hdG9yXSAgICAgICAgICAgICAgPSBcInRydWVcIlxuXHRcdFtyb3dzXSAgICAgICAgICAgICAgICAgICA9IFwicm93c1BlclBhZ2VcIlxuXHRcdFtyb3dzUGVyUGFnZU9wdGlvbnNdICAgICA9IFwicm93U2V0XCJcblx0XHRbcGFnZUxpbmtzXSAgICAgICAgICAgICAgPSBcIjEwXCJcblx0XHRbbG9hZGluZ10gICAgICAgICAgICAgICAgPSBcImxvYWRpbmdcIlxuXHRcdFttZXRhS2V5U2VsZWN0aW9uXSAgICAgICA9IFwidHJ1ZVwiXG5cdFx0W2NvbnRleHRNZW51XSAgICAgICAgICAgID0gXCJjbVwiXG5cdFx0WyhzZWxlY3Rpb24pXSAgICAgICAgICAgID0gXCJzZWxlY3RlZFJvd1wiXG5cdFx0KG9uUm93U2VsZWN0KSAgICAgICAgICAgID0gXCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcblx0XHQob25Sb3dVbnNlbGVjdCkgICAgICAgICAgPSBcIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXG5cdFx0Y29udGV4dE1lbnVTZWxlY3Rpb25Nb2RlID0gXCJqb2ludFwiXG5cdFx0KG9uQ29udGV4dE1lbnVTZWxlY3QpICAgID0gXCJvbkNvbnRleHRNZW51U2VsZWN0KCRldmVudClcIlxuXHRcdChvbkZpbHRlcikgICAgICAgICAgICAgICA9IFwib25GaWx0ZXIoJGV2ZW50KVwiPlxuXG5cdDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cblx0XHQ8dHI+XG5cdFx0XHQ8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuZmllbGRcIj5cblx0XHRcdFx0e3tjb2wuZGlzcGxheUhlYWRlcn19XG5cdFx0XHRcdDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3Atc29ydEljb24+XG5cdFx0XHQ8L3RoPlxuXHRcdDwvdHI+XG5cblx0XHQ8dHIgY2xhc3M9XCJ1aS1mbHVpZFwiPlxuXHRcdFx0PHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuXG5cdFx0XHRcdDxpbnB1dCAgICAgICAgICAqbmdJZj1cImNvbC5maWx0ZXIgPT0gbnVsbFwiXG5cdFx0XHRcdFx0XHRcdFx0cElucHV0VGV4dFxuXHRcdFx0XHRcdFx0XHRcdHR5cGUgICAgPSBcInRleHRcIlxuXHRcdFx0XHRcdFx0XHRcdChpbnB1dCkgPSBcImZpbHRlcigkZXZlbnQudGFyZ2V0LnZhbHVlLCBjb2wpXCJcblx0XHRcdFx0XHRcdFx0XHRjbGFzcyAgID0gXCJmaWx0ZXJcIj5cblxuXHRcdFx0XHQ8cC1kcm9wZG93biAgICAgKm5nSWYgPSBcImNvbC5maWx0ZXIgPT0gJ3NlbGVjdCdcIlxuXHRcdFx0XHRcdFx0XHRcdFtvcHRpb25zXSAgPSBcImNvbHVtblZhbHVlcy5nZXQoY29sLmZpZWxkKVwiXG5cdFx0XHRcdFx0XHRcdFx0W3N0eWxlXSAgICA9IFwieyd3aWR0aCc6JzEwMCUnfVwiXG5cdFx0XHRcdFx0XHRcdFx0KG9uQ2hhbmdlKSA9IFwiZmlsdGVyKCRldmVudC52YWx1ZSwgY29sKVwiXG5cdFx0XHRcdFx0XHRcdFx0PjwvcC1kcm9wZG93bj5cblxuXHRcdFx0XHQ8cC1tdWx0aVNlbGVjdCAgKm5nSWYgPSBcImNvbC5maWx0ZXIgPT0gJ2xpc3QnXCJcblx0XHRcdFx0XHRcdFx0XHRbb3B0aW9uc10gICAgICA9IFwiY29sdW1uVmFsdWVzLmdldChjb2wuZmllbGQpXCJcblx0XHRcdFx0XHRcdFx0XHRbZGVmYXVsdExhYmVsXSA9IFwiYWxsVmFsdWVcIlxuXHRcdFx0XHRcdFx0XHRcdChvbkNoYW5nZSkgICAgID0gXCJmaWx0ZXIoJGV2ZW50LnZhbHVlLCBjb2wpXCJcblx0XHRcdFx0XHRcdFx0XHRjbGFzcyAgICAgICAgICA9IFwiZmlsdGVyXCI+PC9wLW11bHRpU2VsZWN0PlxuXG5cdFx0XHQ8L3RoPlxuXHRcdDwvdHI+XG5cdDwvbmctdGVtcGxhdGU+XG5cblx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxuXHRcdDx0ciBbcFNlbGVjdGFibGVSb3ddPVwicm93XCIgW3BDb250ZXh0TWVudVJvd109XCJyb3dcIj5cblx0XHRcdDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cblx0XHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwicm93W2NvbC5maWVsZF0uc3R5bGVcIj57e3Jvd1tjb2wuZmllbGRdfX08L3NwYW4+XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdDwvbmctdGVtcGxhdGU+XG5cblx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiIGxldC1jb2x1bW5zPlxuXHRcdDx0cj5cblx0XHRcdDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoXCI+XG5cdFx0XHRcdHt7bm9SZWNvcmRzfX1cblx0XHRcdDwvdGQ+XG5cdFx0PC90cj5cblx0PC9uZy10ZW1wbGF0ZT5cbjwvcC10YWJsZT5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJhY3RpdmVNZW51XCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuYCxcbiAgICBzdHlsZXM6IFtgLmNlbGx7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOi43ZW07b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5maWx0ZXJ7d2lkdGg6MTAwJX0uYWxpZ25MZWZ0e3RleHQtYWxpZ246bGVmdH0uYWxpZ25DZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LmFsaWduUmlnaHR7dGV4dC1hbGlnbjpyaWdodH06aG9zdCA6Om5nLWRlZXAgLnVpLXBhZ2luYXRvcntib3JkZXI6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOmluaGVyaXR9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGhlYWQ+dHI+dGh7Ym9yZGVyOm5vbmV9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGhlYWQ+dHI+dGg6bm90KC51aS1zdGF0ZS1oaWdobGlnaHQpe2JhY2tncm91bmQtY29sb3I6I2ZmZn06aG9zdCA6Om5nLWRlZXAgLnVpLXRhYmxlIC51aS10YWJsZS10aGVhZD50cj50aDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjNmM5Y2F9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGJvZHk+dHIudWktc3RhdGUtaGlnaGxpZ2h0e2JhY2tncm91bmQtY29sb3I6I2EwYzBjMH06aG9zdCA6Om5nLWRlZXAgLnVpLXRhYmxlIC51aS10YWJsZS10aGVhZD50cjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNjNmM5Y2F9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktc29ydGFibGUtY29sdW1uLnVpLXN0YXRlLWhpZ2hsaWdodHtiYWNrZ3JvdW5kLWNvbG9yOiM1ZjdhNzZ9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGJvZHk+dHI+dGR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZX1gXVxufSlcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgTGlzdFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RTdWJzY3JpYmVyIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vLS0tXG4gICAgLy8tLS0gVmFyaWFibGVzXG4gICAgLy8tLS1cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRASW5wdXQoKSByb3dJZCAgICAgICAgICA6IGFueTtcbiAgICBASW5wdXQoKSBjb2x1bW5zICAgICAgICA6IExpc3RUYWJsZUNvbHVtbltdO1xuICAgIEBJbnB1dCgpIGRhdGEgICAgICAgICAgIDogYW55W107XG4gICAgQElucHV0KCkgdmlzaWJsZUNvbHVtbnMgOiBzdHJpbmdbXTtcblx0QElucHV0KCkgbXVsdGlTZWxlY3Rpb24gOiBib29sZWFuO1xuXHRASW5wdXQoKSByb3dzUGVyUGFnZSAgICA6IG51bWJlcjtcblx0QElucHV0KCkgcm93U2V0ICAgICAgICAgOiBudW1iZXJbXTtcblx0QElucHV0KCkgbG9hZGluZyAgICAgICAgOiBib29sZWFuO1xuXHRASW5wdXQoKSBsYWJlbEdyb3VwICAgICA6IHN0cmluZztcblx0QElucHV0KCkgY29udGV4dE1lbnUgICAgOiBNZW51W107XG5cdEBJbnB1dCgpIG1lbnVTZWxlY3RvciAgIDogTWVudVNlbGVjdG9yO1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdEBPdXRwdXQoKSBvbkZpbHRlckNoYW5nZSA6IEV2ZW50RW1pdHRlcjxGaWx0ZXJDaGFuZ2VFdmVudD4gID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDaGFuZ2VFdmVudD4oKTtcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQgIDogRXZlbnRFbWl0dGVyPFJvd1NlbGVjdGVkRXZlbnQ+ICAgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1NlbGVjdGVkRXZlbnQ+KCk7XG5cdEBPdXRwdXQoKSBvblJvd1Vuc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxSb3dVbnNlbGVjdGVkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dVbnNlbGVjdGVkRXZlbnQ+KCk7XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0QFZpZXdDaGlsZCgndHQnKSBwcml2YXRlIHBUYWJsZSAgICAgICA6IERhdGFUYWJsZTtcblx0QFZpZXdDaGlsZCgnY20nKSBwcml2YXRlIHBDb250ZXh0TWVudSA6IENvbnRleHRNZW51O1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHNlbGVjdGVkUm93ICAgIDogYW55O1xuXHRkaXNwbGF5Q29sdW1ucyA6IExpc3RUYWJsZUNvbHVtbltdO1xuXHRkaXNwbGF5RGF0YSAgICA6IGFueVtdO1xuXHRhY3RpdmVNZW51ICAgICA6IE1lbnVbXTtcblxuXHQvLy0tLSBNYXAgY29udGFpbmluZyBmb3Igb25lIGNvbHVtbiBhIGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzLiBUaGUga2V5XG5cdC8vLS0tIGlzIHRoZSBhY3R1YWwgY29sdW1uJ3MgdmFsdWUgd2hpbGUgdGhlIHZhbHVlIGlzIHRoZSB0cmFuc2NvZGVkIG9uZS5cblx0Ly8tLS0gSXQgaXMgdXNlZCB0byBkaXNwbGF5IGRyb3Bkb3duIGZpbHRlcnNcblxuXHRjb2x1bW5WYWx1ZXM6IE1hcDxzdHJpbmcsIERyb3Bkb3duSXRlbVtdPjtcblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGNvbFRvSW5kZXggOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgYWxpZ25NYXAgPSB7XG5cdFx0J2xlZnQnICAgOiAnYWxpZ25MZWZ0Jyxcblx0XHQnY2VudGVyJyA6ICdhbGlnbkNlbnRlcicsXG5cdFx0J3JpZ2h0JyAgOiAnYWxpZ25SaWdodCdcblx0fTtcblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLy0tLVxuICAgIC8vLS0tIENvbnN0cnVjdG9yXG4gICAgLy8tLS1cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIGNvbnN0cnVjdG9yKCAgICAgICAgZXZlbnRCdXNTZXJ2aWNlIDogRXZlbnRCdXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbGFiZWxTZXJ2aWNlICAgIDogTGFiZWxTZXJ2aWNlKSB7XG5cbiAgICBcdHN1cGVyKGV2ZW50QnVzU2VydmljZSk7XG5cbiAgICBcdHRoaXMucm93c1BlclBhZ2UgICAgPSA4O1xuXHRcdHRoaXMucm93U2V0ICAgICAgICAgPSBbNCwgOCwgMTIsIDE2LCAyMCwgNTBdO1xuXHRcdHRoaXMubG9hZGluZyAgICAgICAgPSBmYWxzZTtcblx0XHR0aGlzLm11bHRpU2VsZWN0aW9uID0gZmFsc