gamma-app-controller 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +14 -5
  2. package/esm2020/lib/application-controller/application-dataset-call.service.mjs +3 -3
  3. package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +4 -3
  4. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +2 -2
  5. package/esm2020/lib/application-controller/common.mjs +7 -12
  6. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +5 -3
  7. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +984 -0
  8. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +9 -2
  9. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +23 -6
  10. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +14 -3
  11. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +14 -3
  12. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +113 -124
  13. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +4 -3
  14. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +5 -3
  15. package/esm2020/public-api.mjs +4 -1
  16. package/fesm2015/gamma-app-controller.mjs +1179 -184
  17. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  18. package/fesm2020/gamma-app-controller.mjs +1177 -184
  19. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  20. package/lib/application-controller/application-controller.module.d.ts +12 -11
  21. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +1 -1
  22. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +190 -0
  23. package/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.d.ts +3 -1
  24. package/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +2 -0
  25. package/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +2 -0
  26. package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +17 -12
  27. package/lib/application-controller/support-components/dash-table/dash-table.component.d.ts +1 -0
  28. package/lib/application-controller/support-components/table-with-bar/table-with-bar.component.d.ts +1 -0
  29. package/package.json +1 -1
  30. package/public-api.d.ts +3 -0
@@ -1,4 +1,4 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import moment from './../../../moment-helper';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "../../../common";
@@ -13,32 +13,10 @@ export class GammaTableWithPercentageComponent {
13
13
  constructor(commonService, toastr) {
14
14
  this.commonService = commonService;
15
15
  this.toastr = toastr;
16
- this.data = [
17
- {
18
- eventType: "Voice",
19
- access_cost_sar: 767.7730000000023,
20
- event_type: '1',
21
- ict_cost_sar: 7232,
22
- margin_sar: 2445.7730000000023,
23
- revenue: 5232
24
- },
25
- {
26
- eventType: "SMS",
27
- access_cost_sar: 345.7730000000023,
28
- event_type: '2',
29
- ict_cost_sar: 35654,
30
- margin_sar: 2445.7730000000023,
31
- revenue: 55654
32
- },
33
- {
34
- eventType: "GPRS",
35
- access_cost_sar: 567.7730000000023,
36
- event_type: '3',
37
- ict_cost_sar: 89387,
38
- margin_sar: 5445.7730000000023,
39
- revenue: 99387
40
- }
41
- ];
16
+ this.getTableConfigOutPut = new EventEmitter();
17
+ this.oRowClick = new EventEmitter();
18
+ this.onrightClickContextSelection = new EventEmitter();
19
+ this.rightClickEnable = true;
42
20
  this.tableDataSource = [];
43
21
  }
44
22
  set chartDataSource(value) {
@@ -47,20 +25,26 @@ export class GammaTableWithPercentageComponent {
47
25
  }
48
26
  else {
49
27
  this.isLoader = true;
28
+ this.page_config = value;
29
+ this.page_parms = value.titleParams;
30
+ this.tableHeight = (value.kpiConfig.dataConfig.tableHeight && value.kpiConfig.dataConfig.tableHeight !== "") ? this.setTableHeight(value.kpiConfig.dataConfig.tableHeight) : 'auto';
50
31
  if (value.kpiConfig.dataSource && value.kpiConfig.dataSource.length !== 0) {
51
- const sortedData = value.kpiConfig.dataSource.sort((a, b) => {
52
- return moment(b.recordDate, "YYYY-MM-DD").diff(moment(a.recordDate, "YYYY-MM-DD"));
53
- });
54
- value.kpiConfig.dataSource.forEach(item => item.recordDate = new Date(item.recordDate));
55
- value.kpiConfig.dataSource.sort((a, b) => b.recordDate - a.recordDate);
56
- const uniqueEvents = new Map();
57
- value.kpiConfig.dataSource.forEach(item => {
58
- if (!uniqueEvents.has(item.eventTypeKey)) {
59
- uniqueEvents.set(item.eventTypeKey, item);
60
- }
61
- });
62
- const result = Array.from(uniqueEvents.values());
63
- this.loadDailyMscVoiceTable(result);
32
+ this.tableConfig = value.kpiConfig.dataConfig;
33
+ const columns = value.kpiConfig.dataConfig.columns;
34
+ let mainDatasource;
35
+ let tableColumns = (value.kpiConfig.dataConfig.columns) ? value.kpiConfig.dataConfig.columns : [];
36
+ if (tableColumns && tableColumns.length !== 0) {
37
+ const dataSource = value.kpiConfig.dataSource.map(obj => {
38
+ const newObj = { ...obj };
39
+ Object.keys(newObj).forEach(key => {
40
+ if (key.toLowerCase().includes('date') && newObj[key]) {
41
+ newObj[key] = moment(newObj[key]).format("YYYY-MM-DD");
42
+ }
43
+ });
44
+ return newObj;
45
+ });
46
+ this.percentageDataSource = this.loadDailyMscVoiceTable(dataSource, columns);
47
+ }
64
48
  this.isLoader = false;
65
49
  }
66
50
  else {
@@ -69,100 +53,105 @@ export class GammaTableWithPercentageComponent {
69
53
  }
70
54
  ngOnInit() {
71
55
  }
72
- loadDailyMscVoiceTable(data) {
73
- this.tableDataSource = [];
74
- let dataset = [];
75
- let column1Name = 'access_cost_sar';
76
- let column2Name = 'ict_cost_sar';
77
- let column3Name = 'margin_sar';
78
- let column4Name = 'revenue';
79
- let revenueArr = [], interConnectArr = [], accessCostArr = [], marginArr = [];
80
- for (const [i, v] of Object.entries(data)) {
81
- if (v[column1Name] == undefined) {
82
- v[column1Name] = 0;
83
- }
84
- if (v[column2Name] == undefined) {
85
- v[column2Name] = 0;
86
- }
87
- if (v[column3Name] == undefined) {
88
- v[column3Name] = 0;
89
- }
90
- if (v[column4Name] == undefined) {
91
- v[column4Name] = 0;
92
- }
93
- accessCostArr.push(v[column1Name]);
94
- interConnectArr.push(v[column2Name]);
95
- marginArr.push(v[column3Name]);
96
- revenueArr.push(v[column4Name]);
97
- }
98
- let maxAccessCostVal = Math.max.apply(Math, accessCostArr);
99
- let minAccessCostVal = Math.min.apply(Math, accessCostArr);
100
- let maxinterConnectVal = Math.max.apply(Math, interConnectArr);
101
- let mininterConnectVal = Math.min.apply(Math, interConnectArr);
102
- let maxmarginVal = Math.max.apply(Math, marginArr);
103
- let minmarginVal = Math.min.apply(Math, marginArr);
104
- let maxRevenueVal = Math.max.apply(Math, revenueArr);
105
- let minRevenueVal = Math.min.apply(Math, revenueArr);
106
- for (const [i, v] of Object.entries(data)) {
107
- let r = [];
108
- let accessCostValue, interConnectValue, marginValue, revenueValue;
109
- if (v[column1Name] > 0) {
110
- accessCostValue = this.commonService.scaleNumber(parseFloat(v[column1Name]), maxAccessCostVal, minAccessCostVal, 10, 75);
111
- }
112
- else {
113
- accessCostValue = 0;
114
- }
115
- if (v[column2Name] > 0) {
116
- interConnectValue = this.commonService.scaleNumber(parseFloat(v[column2Name]), maxinterConnectVal, mininterConnectVal, 10, 75);
117
- }
118
- else {
119
- interConnectValue = 0;
120
- }
121
- if (v[column3Name] > 0) {
122
- marginValue = this.commonService.scaleNumber(parseFloat(v[column3Name]), maxmarginVal, minmarginVal, 10, 75);
123
- }
124
- else {
125
- marginValue = 0;
126
- }
127
- if (v[column4Name] > 0) {
128
- revenueValue = this.commonService.scaleNumber(parseFloat(v[column4Name]), maxRevenueVal, minRevenueVal, 10, 75);
129
- }
130
- else {
131
- revenueValue = 0;
56
+ loadDailyMscVoiceTable(data, datacolumns) {
57
+ this.argumentValue = datacolumns.filter((column) => column.isShowBar == false);
58
+ this.dataConfig = datacolumns.filter((column) => column.isShowBar == true);
59
+ let keys = this.dataConfig;
60
+ const result = {};
61
+ let finalDatasource = [];
62
+ data.forEach((elementOne) => {
63
+ keys.forEach((key) => {
64
+ const values = data.map((item) => parseFloat(item[key['dataField']]) || 0);
65
+ const maxValue = Math.max(...values);
66
+ const minValue = Math.min(...values);
67
+ result[key['dataField']] = { maxValue, minValue };
68
+ });
69
+ let obj = {};
70
+ keys.forEach((key) => {
71
+ const rawValue = parseFloat(elementOne[key['dataField']]) || 0;
72
+ const formattedValue = this.commonService.reformatNumberWithThousandSeparator(rawValue);
73
+ const baseWidth = this.commonService.scaleNumber(rawValue, result[key['dataField']]['minValue'], result[key['dataField']]['maxValue'], 10, 75);
74
+ const minWidth = formattedValue.length * 7;
75
+ const finalWidth = Math.max(baseWidth, minWidth);
76
+ const Bar = this.commonService.createHtml(finalWidth, formattedValue, key['color']);
77
+ obj[key['dataField']] = Bar;
78
+ });
79
+ this.argumentValue.forEach((element) => {
80
+ obj[element.dataField] = elementOne[element.dataField];
81
+ });
82
+ finalDatasource.push(obj);
83
+ });
84
+ return finalDatasource;
85
+ }
86
+ onRowClick(e) {
87
+ const title_params = e.data[this.page_config.kpiConfig.dataConfig.commonConfig['dataField']];
88
+ let title = this.page_config.kpiConfig.dataConfig.commonConfig['title'] + title_params;
89
+ let obj = {
90
+ data: e.data,
91
+ keyToPass: this.page_config.kpiConfig.keyToPass,
92
+ tableTitle: (this.page_parms) ? this.page_parms + title : title,
93
+ viewId: this.page_config.viewId,
94
+ drillDownType: "natural",
95
+ drilldownFrom: this.page_config.viewId,
96
+ drilldownTo: "",
97
+ };
98
+ this.oRowClick.emit(obj);
99
+ }
100
+ addMenuItems(e) {
101
+ const title_params = e.row.data[this.page_config.kpiConfig.dataConfig.commonConfig['dataField']];
102
+ let title = this.page_config.kpiConfig.dataConfig.commonConfig['title'] + title_params;
103
+ if (this.rightClickEnable && e.columnIndex == 0) {
104
+ if (e.target == 'content') {
105
+ if (!e.items)
106
+ e.items = [];
107
+ this.page_config.kpiConfig.contextMenu.forEach(element => {
108
+ if (!this.page_config.kpiConfig.keyToPass.some(key => element.displayKey.includes(key))) {
109
+ e.items.push({
110
+ text: element.displayKey,
111
+ onItemClick: () => {
112
+ let rightclickData = {
113
+ data: e.row.data,
114
+ keyToPass: this.page_config.kpiConfig.keyToPass,
115
+ tableTitle: (this.page_parms) ? this.page_parms + title : title,
116
+ viewId: this.page_config.viewId,
117
+ drillDownType: "context",
118
+ drilldownFrom: this.page_config.viewId,
119
+ drilldownTo: element.viewId,
120
+ };
121
+ this.onrightClickContextSelection.emit(rightclickData);
122
+ }
123
+ });
124
+ }
125
+ });
132
126
  }
133
- let accessCostBar = this.commonService.createHtml(accessCostValue, this.commonService.reformatNumberWithThousandSeparator(v[column1Name]), '#002E70');
134
- let interconnectBar = this.commonService.createHtml(interConnectValue, this.commonService.reformatNumberWithThousandSeparator(v[column2Name]), '#F46604');
135
- let marginBar = this.commonService.createHtml(marginValue, this.commonService.reformatNumberWithThousandSeparator(v[column3Name]), '#3d8706');
136
- let revenueBar = this.commonService.createHtml(revenueValue, this.commonService.reformatNumberWithThousandSeparator(v[column4Name]), '#ffac42');
137
- let node = {
138
- 'eventType': this.getEventTypeName(v['eventTypeKey']),
139
- 'access_cost_sar': accessCostBar,
140
- 'margin_sar': marginBar,
141
- 'ict_cost_sar': interconnectBar,
142
- 'revenue': revenueBar,
143
- };
144
- this.tableDataSource.push(node);
145
127
  }
146
128
  }
147
- getEventTypeName(key) {
148
- if (key == "1") {
149
- return "Voice";
150
- }
151
- else if (key == "2") {
152
- return "SMS";
129
+ setTableHeight(value) {
130
+ const tableHeight = value;
131
+ if (tableHeight === 'auto') {
132
+ return 'auto';
153
133
  }
154
- else {
155
- return "GPRS";
134
+ const parsedHeight = Number(tableHeight);
135
+ if (!isNaN(parsedHeight) && parsedHeight > 0) {
136
+ return parsedHeight;
156
137
  }
157
138
  }
158
139
  }
159
140
  GammaTableWithPercentageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaTableWithPercentageComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
160
- GammaTableWithPercentageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GammaTableWithPercentageComponent, selector: "app-gamma-table-with-percentage", inputs: { chartDataSource: "chartDataSource" }, ngImport: i0, template: "<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n <ng-container *ngIf=\"!isLoader\">\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"tableDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [height]=\"370\">\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\"></dxo-search-panel>\n <dxo-export [enabled]=\"true\"></dxo-export>\n <dxo-paging [pageSize]=\"7\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"false\">\n </dxo-pager>\n <dxo-selection mode=\"single\"></dxo-selection>\n <dxi-column dataField=\"eventType\"></dxi-column>\n <dxi-column dataField=\"access_cost_sar\" cellTemplate=\"cellTemplate1\"></dxi-column>\n <dxi-column dataField=\"margin_sar\" cellTemplate=\"cellTemplate2\"></dxi-column>\n <dxi-column dataField=\"ict_cost_sar\" cellTemplate=\"cellTemplate3\"></dxi-column>\n <dxi-column dataField=\"revenue\" cellTemplate=\"cellTemplate4\"></dxi-column>\n\n\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate2'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate3'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate4'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n\n </dx-data-grid>\n </ng-container>\n\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i6.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i5.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i5.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i5.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i5.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i5.DxoSelectionComponent, selector: "dxo-selection", inputs: ["allowSelectAll", "deferred", "mode", "selectAllMode", "showCheckBoxesMode", "recursive"] }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "pipe", type: i8.contentSafeHtml, name: "contentSafeHtml" }] });
141
+ GammaTableWithPercentageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GammaTableWithPercentageComponent, selector: "app-gamma-table-with-percentage", inputs: { rightClickEnable: "rightClickEnable", chartDataSource: "chartDataSource" }, outputs: { getTableConfigOutPut: "getTableConfigOutPut", oRowClick: "oRowClick", onrightClickContextSelection: "onrightClickContextSelection" }, ngImport: i0, template: "\n\n<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n <ng-container *ngIf=\"!isLoader\">\n <dx-data-grid (onRowClick)=\"onRowClick($event)\" [dataSource]=\"percentageDataSource\" [height]=\"tableHeight\"\n (onContextMenuPreparing)=\"addMenuItems($event)\" [rowAlternationEnabled]=\"true\"\n [hoverStateEnabled]=\"true\" [selectedRowKeys]=\"[]\" [showBorders]=\"true\" [showColumnLines]=\"true\"\n [showRowLines]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\"\n [customizeExportData]=\"commonService.removeHtmlContentFromData\">\n <dxo-search-panel [highlightCaseSensitive]=\"true\"\n [visible]=\"tableConfig.searchPanel\"></dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"{{tableConfig.file_name}}\"></dxo-export>\n <dxo-paging [pageSize]=\"tableConfig.numberOfRow\"></dxo-paging>\n <dxo-pager [showInfo]=\"tableConfig.pageInfo\" [showPageSizeSelector]=\"true\"\n [allowedPageSizes]=\"tableConfig.allowedPageSizes\">\n </dxo-pager>\n <dxo-load-panel [enabled]=\"true\">\n </dxo-load-panel>\n <ng-container *ngFor=\"let item of argumentValue\">\n <dxi-column *ngIf=\"item.dataField == 'recordDate'\" dataField=\"{{ item.dataField }}\"\n [caption]=\"item.caption\" [visible]=\"item.visible\" sortOrder=\"desc\"></dxi-column>\n <dxi-column *ngIf=\"item.dataField !== 'recordDate'\" format=\"#,##0.##\" [caption]=\"item.caption\"\n [sortingMethod]=\"commonService.customValueSorter\" dataField=\"{{ item.dataField }}\"\n alignment=\"left\" [visible]=\"item.visible\">\n </dxi-column>\n </ng-container>\n <ng-container *ngFor=\"let item of dataConfig\">\n <dxi-column cellTemplate=\"{{ item.dataField }}\" dataField=\"{{ item.dataField }}\" alignment=\"right\"\n [sortingMethod]=\"commonService.customValueSorterForBar\"></dxi-column>\n </ng-container>\n <ng-container *ngFor=\"let item of dataConfig\">\n <div *dxTemplate=\"let data of item.dataField\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n </ng-container>\n </dx-data-grid>\n </ng-container>\n\n </div>\n</div>\n\n<!-- (onFileSaving)=\"downloadTableData($event)\" -->", styles: [""], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i6.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i5.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i5.DxoLoadPanelComponent, selector: "dxo-load-panel", inputs: ["enabled", "height", "indicatorSrc", "shading", "shadingColor", "showIndicator", "showPane", "text", "width"] }, { kind: "component", type: i5.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i5.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i5.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "pipe", type: i8.contentSafeHtml, name: "contentSafeHtml" }] });
161
142
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaTableWithPercentageComponent, decorators: [{
162
143
  type: Component,
163
- args: [{ selector: 'app-gamma-table-with-percentage', template: "<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n <ng-container *ngIf=\"!isLoader\">\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"tableDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [height]=\"370\">\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\"></dxo-search-panel>\n <dxo-export [enabled]=\"true\"></dxo-export>\n <dxo-paging [pageSize]=\"7\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"false\">\n </dxo-pager>\n <dxo-selection mode=\"single\"></dxo-selection>\n <dxi-column dataField=\"eventType\"></dxi-column>\n <dxi-column dataField=\"access_cost_sar\" cellTemplate=\"cellTemplate1\"></dxi-column>\n <dxi-column dataField=\"margin_sar\" cellTemplate=\"cellTemplate2\"></dxi-column>\n <dxi-column dataField=\"ict_cost_sar\" cellTemplate=\"cellTemplate3\"></dxi-column>\n <dxi-column dataField=\"revenue\" cellTemplate=\"cellTemplate4\"></dxi-column>\n\n\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate2'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate3'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate4'\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n\n </dx-data-grid>\n </ng-container>\n\n </div>\n</div>" }]
164
- }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }]; }, propDecorators: { chartDataSource: [{
144
+ args: [{ selector: 'app-gamma-table-with-percentage', template: "\n\n<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n <ng-container *ngIf=\"!isLoader\">\n <dx-data-grid (onRowClick)=\"onRowClick($event)\" [dataSource]=\"percentageDataSource\" [height]=\"tableHeight\"\n (onContextMenuPreparing)=\"addMenuItems($event)\" [rowAlternationEnabled]=\"true\"\n [hoverStateEnabled]=\"true\" [selectedRowKeys]=\"[]\" [showBorders]=\"true\" [showColumnLines]=\"true\"\n [showRowLines]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\"\n [customizeExportData]=\"commonService.removeHtmlContentFromData\">\n <dxo-search-panel [highlightCaseSensitive]=\"true\"\n [visible]=\"tableConfig.searchPanel\"></dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"{{tableConfig.file_name}}\"></dxo-export>\n <dxo-paging [pageSize]=\"tableConfig.numberOfRow\"></dxo-paging>\n <dxo-pager [showInfo]=\"tableConfig.pageInfo\" [showPageSizeSelector]=\"true\"\n [allowedPageSizes]=\"tableConfig.allowedPageSizes\">\n </dxo-pager>\n <dxo-load-panel [enabled]=\"true\">\n </dxo-load-panel>\n <ng-container *ngFor=\"let item of argumentValue\">\n <dxi-column *ngIf=\"item.dataField == 'recordDate'\" dataField=\"{{ item.dataField }}\"\n [caption]=\"item.caption\" [visible]=\"item.visible\" sortOrder=\"desc\"></dxi-column>\n <dxi-column *ngIf=\"item.dataField !== 'recordDate'\" format=\"#,##0.##\" [caption]=\"item.caption\"\n [sortingMethod]=\"commonService.customValueSorter\" dataField=\"{{ item.dataField }}\"\n alignment=\"left\" [visible]=\"item.visible\">\n </dxi-column>\n </ng-container>\n <ng-container *ngFor=\"let item of dataConfig\">\n <dxi-column cellTemplate=\"{{ item.dataField }}\" dataField=\"{{ item.dataField }}\" alignment=\"right\"\n [sortingMethod]=\"commonService.customValueSorterForBar\"></dxi-column>\n </ng-container>\n <ng-container *ngFor=\"let item of dataConfig\">\n <div *dxTemplate=\"let data of item.dataField\">\n <div [innerHTML]=\"data.value | contentSafeHtml\"></div>\n </div>\n </ng-container>\n </dx-data-grid>\n </ng-container>\n\n </div>\n</div>\n\n<!-- (onFileSaving)=\"downloadTableData($event)\" -->" }]
145
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }]; }, propDecorators: { getTableConfigOutPut: [{
146
+ type: Output
147
+ }], oRowClick: [{
148
+ type: Output
149
+ }], onrightClickContextSelection: [{
150
+ type: Output
151
+ }], rightClickEnable: [{
152
+ type: Input
153
+ }], chartDataSource: [{
165
154
  type: Input,
166
155
  args: ['chartDataSource']
167
156
  }] } });
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLE1BQU0sTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7OztBQVE5QyxNQUFNLE9BQU8saUNBQWlDO0lBeUU1QyxZQUNTLGFBQTRCLEVBQzNCLE1BQXFCO1FBRHRCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQWU7UUExRS9CLFNBQUksR0FBRztZQUNMO2dCQUNFLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixlQUFlLEVBQUUsaUJBQWlCO2dCQUNsQyxVQUFVLEVBQUUsR0FBRztnQkFDZixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsT0FBTyxFQUFFLElBQUk7YUFFZDtZQUNEO2dCQUNFLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixlQUFlLEVBQUUsaUJBQWlCO2dCQUNsQyxVQUFV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QUMsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5SSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVoSixJQUFJLElBQUksR0FBRztnQkFDVCxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDckQsaUJBQWlCLEVBQUUsYUFBYTtnQkFDaEMsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGNBQWMsRUFBRSxlQUFlO2dCQUMvQixTQUFTLEVBQUUsVUFBVTthQUN0QixDQUFDO1lBRUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFFSCxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsR0FBRztRQUVsQixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDZCxPQUFPLE9BQU8sQ0FBQTtTQUNmO2FBQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFBO1NBQ2I7YUFBTTtZQUNMLE9BQU8sTUFBTSxDQUFBO1NBQ2Q7SUFDSCxDQUFDOzs4SEE5S1UsaUNBQWlDO2tIQUFqQyxpQ0FBaUMsdUhDVjlDLGttRUF5Q007MkZEL0JPLGlDQUFpQztrQkFMN0MsU0FBUzsrQkFDRSxpQ0FBaUM7Z0lBc0N2QyxlQUFlO3NCQURsQixLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLy4uLy4uLy4uL21vbWVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGF0YSA9IFtcbiAgICB7XG4gICAgICBldmVudFR5cGU6IFwiVm9pY2VcIixcbiAgICAgIGFjY2Vzc19jb3N0X3NhcjogNzY3Ljc3MzAwMDAwMDAwMjMsXG4gICAgICBldmVudF90eXBlOiAnMScsXG4gICAgICBpY3RfY29zdF9zYXI6IDcyMzIsXG4gICAgICBtYXJnaW5fc2FyOiAyNDQ1Ljc3MzAwMDAwMDAwMjMsXG4gICAgICByZXZlbnVlOiA1MjMyXG5cbiAgICB9LFxuICAgIHtcbiAgICAgIGV2ZW50VHlwZTogXCJTTVNcIixcbiAgICAgIGFjY2Vzc19jb3N0X3NhcjogMzQ1Ljc3MzAwMDAwMDAwMjMsXG4gICAgICBldmVudF90eXBlOiAnMicsXG4gICAgICBpY3RfY29zdF9zYXI6IDM1NjU0LFxuICAgICAgbWFyZ2luX3NhcjogMjQ0NS43NzMwMDAwMDAwMDIzLFxuICAgICAgcmV2ZW51ZTogNTU2NTRcblxuICAgIH0sXG4gICAge1xuICAgICAgZXZlbnRUeXBlOiBcIkdQUlNcIixcbiAgICAgIGFjY2Vzc19jb3N0X3NhcjogNTY3Ljc3MzAwMDAwMDAwMjMsXG4gICAgICBldmVudF90eXBlOiAnMycsXG4gICAgICBpY3RfY29zdF9zYXI6IDg5Mzg3LFxuICAgICAgbWFyZ2luX3NhcjogNTQ0NS43NzMwMDAwMDAwMDIzLFxuICAgICAgcmV2ZW51ZTogOTkzODdcblxuICAgIH1cbiAgXVxuXG4gIGlzTG9hZGVyOiBib29sZWFuXG4gIGN1cnJlbnREYXRlRGF0YVxuICBASW5wdXQoJ2NoYXJ0RGF0YVNvdXJjZScpXG4gIHNldCBjaGFydERhdGFTb3VyY2UodmFsdWUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuXG4gICAgICAvLyB0aGlzLmtleVRvcGFzcyA9IHZhbHVlLmtwaUNvbmZpZy5rZXlUb1Bhc3M7XG4gICAgICBpZiAodmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UgJiYgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudChiLnJlY29yZERhdGUsIFwiWVlZWS1NTS1ERFwiKS5kaWZmKG1vbWVudChhLnJlY29yZERhdGUsIFwiWVlZWS1NTS1ERFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5yZWNvcmREYXRlID0gbmV3IERhdGUoaXRlbS5yZWNvcmREYXRlKSk7XG4gICAgICAgIHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlLnNvcnQoKGEsIGIpID0+IGIucmVjb3JkRGF0ZSAtIGEucmVjb3JkRGF0ZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbWFwIHRvIHN0b3JlIHRoZSBtb3N0IHJlY2VudCBlbnRyeSBmb3IgZWFjaCB1bmlxdWUgZXZlbnRUeXBlS2V5XG4gICAgICAgIGNvbnN0IHVuaXF1ZUV2ZW50cyA9IG5ldyBNYXAoKTtcblxuICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmICghdW5pcXVlRXZlbnRzLmhhcyhpdGVtLmV2ZW50VHlwZUtleSkpIHtcbiAgICAgICAgICAgIHVuaXF1ZUV2ZW50cy5zZXQoaXRlbS5ldmVudFR5cGVLZXksIGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ29udmVydCB0aGUgbWFwIHZhbHVlcyB0byBhbiBhcnJheVxuICAgICAgICBjb25zdCByZXN1bHQgPSBBcnJheS5mcm9tKHVuaXF1ZUV2ZW50cy52YWx1ZXMoKSk7XG4gICAgICAgIC8vIFN0ZXAgMjogR2V0IHRoZSBtb3N0IHJlY2VudCBhbmQgcHJldmlvdXMgZGF0ZXNcbiAgICAgICAgdGhpcy5sb2FkRGFpbHlNc2NWb2ljZVRhYmxlKHJlc3VsdClcblxuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuXG4gIHRhYmxlRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gdGhpcy5sb2FkRGFpbHlNc2NWb2ljZVRhYmxlKHRoaXMuZGF0YSlcbiAgfVxuXG4gIGxvYWREYWlseU1zY1ZvaWNlVGFibGUoZGF0YSkge1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBbXTtcblxuXG4gICAgbGV0IGRhdGFzZXQgPSBbXTtcbiAgICBsZXQgY29sdW1uMU5hbWUgPSAnYWNjZXNzX2Nvc3Rfc2FyJztcbiAgICBsZXQgY29sdW1uMk5hbWUgPSAnaWN0X2Nvc3Rfc2FyJztcbiAgICBsZXQgY29sdW1uM05hbWUgPSAnbWFyZ2luX3Nhcic7XG4gICAgbGV0IGNvbHVtbjROYW1lID0gJ3JldmVudWUnO1xuICAgIGxldCByZXZlbnVlQXJyID0gW10sIGludGVyQ29ubmVjdEFyciA9IFtdLCBhY2Nlc3NDb3N0QXJyID0gW10sIG1hcmdpbkFyciA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ksIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICBpZiAodltjb2x1bW4xTmFtZV0gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZbY29sdW1uMU5hbWVdID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICh2W2NvbHVtbjJOYW1lXSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdltjb2x1bW4yTmFtZV0gPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHZbY29sdW1uM05hbWVdID09IHVuZGVmaW5lZCkge1xuICAgICAgICB2W2NvbHVtbjNOYW1lXSA9IDA7XG4gICAgICB9XG4gICAgICBpZiAodltjb2x1bW40TmFtZV0gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZbY29sdW1uNE5hbWVdID0gMDtcbiAgICAgIH1cbiAgICAgIGFjY2Vzc0Nvc3RBcnIucHVzaCh2W2NvbHVtbjFOYW1lXSk7XG4gICAgICBpbnRlckNvbm5lY3RBcnIucHVzaCh2W2NvbHVtbjJOYW1lXSk7XG4gICAgICBtYXJnaW5BcnIucHVzaCh2W2NvbHVtbjNOYW1lXSk7XG4gICAgICByZXZlbnVlQXJyLnB1c2godltjb2x1bW40TmFtZV0pO1xuICAgIH1cbiAgICBsZXQgbWF4QWNjZXNzQ29zdFZhbCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGFjY2Vzc0Nvc3RBcnIpO1xuICAgIGxldCBtaW5BY2Nlc3NDb3N0VmFsID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgYWNjZXNzQ29zdEFycik7XG4gICAgbGV0IG1heGludGVyQ29ubmVjdFZhbCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGludGVyQ29ubmVjdEFycik7XG4gICAgbGV0IG1pbmludGVyQ29ubmVjdFZhbCA9IE1hdGgubWluLmFwcGx5KE1hdGgsIGludGVyQ29ubmVjdEFycik7XG4gICAgbGV0IG1heG1hcmdpblZhbCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG1hcmdpbkFycik7XG4gICAgbGV0IG1pbm1hcmdpblZhbCA9IE1hdGgubWluLmFwcGx5KE1hdGgsIG1hcmdpbkFycik7XG4gICAgbGV0IG1heFJldmVudWVWYWwgPSBNYXRoLm1heC5hcHBseShNYXRoLCByZXZlbnVlQXJyKTtcbiAgICBsZXQgbWluUmV2ZW51ZVZhbCA9IE1hdGgubWluLmFwcGx5KE1hdGgsIHJldmVudWVBcnIpO1xuXG5cbiAgICBmb3IgKGNvbnN0IFtpLCB2XSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgbGV0IHIgPSBbXTtcbiAgICAgIGxldCBhY2Nlc3NDb3N0VmFsdWUsIGludGVyQ29ubmVjdFZhbHVlLCBtYXJnaW5WYWx1ZSwgcmV2ZW51ZVZhbHVlO1xuXG4gICAgICBpZiAodltjb2x1bW4xTmFtZV0gPiAwKSB7XG4gICAgICAgIGFjY2Vzc0Nvc3RWYWx1ZSA9IHRoaXMuY29tbW9uU2VydmljZS5zY2FsZU51bWJlcihwYXJzZUZsb2F0KHZbY29sdW1uMU5hbWVdKSwgbWF4QWNjZXNzQ29zdFZhbCwgbWluQWNjZXNzQ29zdFZhbCwgMTAsIDc1KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY2Vzc0Nvc3RWYWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICBpZiAodltjb2x1bW4yTmFtZV0gPiAwKSB7XG4gICAgICAgIGludGVyQ29ubmVjdFZhbHVlID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjYWxlTnVtYmVyKHBhcnNlRmxvYXQodltjb2x1bW4yTmFtZV0pLCBtYXhpbnRlckNvbm5lY3RWYWwsIG1pbmludGVyQ29ubmVjdFZhbCwgMTAsIDc1KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVyQ29ubmVjdFZhbHVlID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICh2W2NvbHVtbjNOYW1lXSA+IDApIHtcbiAgICAgICAgbWFyZ2luVmFsdWUgPSB0aGlzLmNvbW1vblNlcnZpY2Uuc2NhbGVOdW1iZXIocGFyc2VGbG9hdCh2W2NvbHVtbjNOYW1lXSksIG1heG1hcmdpblZhbCwgbWlubWFyZ2luVmFsLCAxMCwgNzUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFyZ2luVmFsdWUgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHZbY29sdW1uNE5hbWVdID4gMCkge1xuICAgICAgICByZXZlbnVlVmFsdWUgPSB0aGlzLmNvbW1vblNlcnZpY2Uuc2NhbGVOdW1iZXIocGFyc2VGbG9hdCh2W2NvbHVtbjROYW1lXSksIG1heFJldmVudWVWYWwsIG1pblJldmVudWVWYWwsIDEwLCA3NSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXZlbnVlVmFsdWUgPSAwO1xuICAgICAgfVxuXG4gICAgICBsZXQgYWNjZXNzQ29zdEJhciA9IHRoaXMuY29tbW9uU2VydmljZS5jcmVhdGVIdG1sKGFjY2Vzc0Nvc3RWYWx1ZSwgdGhpcy5jb21tb25TZXJ2aWNlLnJlZm9ybWF0TnVtYmVyV2l0aFRob3VzYW5kU2VwYXJhdG9yKHZbY29sdW1uMU5hbWVdKSwgJyMwMDJFNzAnKTtcbiAgICAgIGxldCBpbnRlcmNvbm5lY3RCYXIgPSB0aGlzLmNvbW1vblNlcnZpY2UuY3JlYXRlSHRtbChpbnRlckNvbm5lY3RWYWx1ZSwgdGhpcy5jb21tb25TZXJ2aWNlLnJlZm9ybWF0TnVtYmVyV2l0aFRob3VzYW5kU2VwYXJhdG9yKHZbY29sdW1uMk5hbWVdKSwgJyNGNDY2MDQnKTtcbiAgICAgIGxldCBtYXJnaW5CYXIgPSB0aGlzLmNvbW1vblNlcnZpY2UuY3JlYXRlSHRtbChtYXJnaW5WYWx1ZSwgdGhpcy5jb21tb25TZXJ2aWNlLnJlZm9ybWF0TnVtYmVyV2l0aFRob3VzYW5kU2VwYXJhdG9yKHZbY29sdW1uM05hbWVdKSwgJyMzZDg3MDYnKTtcbiAgICAgIGxldCByZXZlbnVlQmFyID0gdGhpcy5jb21tb25TZXJ2aWNlLmNyZWF0ZUh0bWwocmV2ZW51ZVZhbHVlLCB0aGlzLmNvbW1vblNlcnZpY2UucmVmb3JtYXROdW1iZXJXaXRoVGhvdXNhbmRTZXBhcmF0b3Iodltjb2x1bW40TmFtZV0pLCAnI2ZmYWM0MicpO1xuXG4gICAgICBsZXQgbm9kZSA9IHtcbiAgICAgICAgJ2V2ZW50VHlwZSc6IHRoaXMuZ2V0RXZlbnRUeXBlTmFtZSh2WydldmVudFR5cGVLZXknXSksXG4gICAgICAgICdhY2Nlc3NfY29zdF9zYXInOiBhY2Nlc3NDb3N0QmFyLFxuICAgICAgICAnbWFyZ2luX3Nhcic6IG1hcmdpbkJhcixcbiAgICAgICAgJ2ljdF9jb3N0X3Nhcic6IGludGVyY29ubmVjdEJhcixcbiAgICAgICAgJ3JldmVudWUnOiByZXZlbnVlQmFyLFxuICAgICAgfTtcblxuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucHVzaChub2RlKTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgZ2V0RXZlbnRUeXBlTmFtZShrZXkpIHtcblxuICAgIGlmIChrZXkgPT0gXCIxXCIpIHtcbiAgICAgIHJldHVybiBcIlZvaWNlXCJcbiAgICB9IGVsc2UgaWYgKGtleSA9PSBcIjJcIikge1xuICAgICAgcmV0dXJuIFwiU01TXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiR1BSU1wiXG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJteC0yIGJnLWdyYXktODAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLXN0YXJ0IGJnLWdyYXktODAwIHAtMlwiPlxuICAgICAgICAgICAgPGFwcC1sb2FkZXI+PC9hcHAtbG9hZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJteC0yIHBiLTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRlclwiPlxuICAgICAgICAgICAgPGR4LWRhdGEtZ3JpZCBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIiBbZGF0YVNvdXJjZV09XCJ0YWJsZURhdGFTb3VyY2VcIiBbc2VsZWN0ZWRSb3dLZXlzXT1cIltdXCJcbiAgICAgICAgICAgICAgICBbc2hvd0JvcmRlcnNdPVwidHJ1ZVwiIFtzaG93Um93TGluZXNdPVwidHJ1ZVwiIGlkPVwiZ3JpZENvbnRhaW5lclwiIFtoZWlnaHRdPVwiMzcwXCI+XG4gICAgICAgICAgICAgICAgPGR4by1zZWFyY2gtcGFuZWwgW2hpZ2hsaWdodENhc2VTZW5zaXRpdmVdPVwidHJ1ZVwiIFt2aXNpYmxlXT1cInRydWVcIj48L2R4by1zZWFyY2gtcGFuZWw+XG4gICAgICAgICAgICAgICAgPGR4by1leHBvcnQgW2VuYWJsZWRdPVwidHJ1ZVwiPjwvZHhvLWV4cG9ydD5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwiN1wiPjwvZHhvLXBhZ2luZz5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2VyIFtzaG93SW5mb109XCJ0cnVlXCIgW3Nob3dQYWdlU2l6ZVNlbGVjdG9yXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPC9keG8tcGFnZXI+XG4gICAgICAgICAgICAgICAgPGR4by1zZWxlY3Rpb24gbW9kZT1cInNpbmdsZVwiPjwvZHhvLXNlbGVjdGlvbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJldmVudFR5cGVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiYWNjZXNzX2Nvc3Rfc2FyXCIgY2VsbFRlbXBsYXRlPVwiY2VsbFRlbXBsYXRlMVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJtYXJnaW5fc2FyXCIgY2VsbFRlbXBsYXRlPVwiY2VsbFRlbXBsYXRlMlwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJpY3RfY29zdF9zYXJcIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGUzXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInJldmVudWVcIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGU0XCI+PC9keGktY29sdW1uPlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZTEnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJkYXRhLnZhbHVlIHwgY29udGVudFNhZmVIdG1sXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjZWxsVGVtcGxhdGUyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZGF0YS52YWx1ZSB8IGNvbnRlbnRTYWZlSHRtbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY2VsbFRlbXBsYXRlMydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGEudmFsdWUgfCBjb250ZW50U2FmZUh0bWxcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZTQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJkYXRhLnZhbHVlIHwgY29udGVudFNhZmVIdG1sXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZHgtZGF0YS1ncmlkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvZGl2PlxuPC9kaXY+Il19
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sTUFBTSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBUTlDLE1BQU0sT0FBTyxpQ0FBaUM7SUEwRTVDLFlBQ1MsYUFBNEIsRUFDM0IsTUFBcUI7UUFEdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQWpFZCx5QkFBb0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsaUNBQTRCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0UscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBMkQxQyxvQkFBZSxHQUFRLEVBQUUsQ0FBQztJQUl0QixDQUFDO0lBOURMLElBQ0ksZUFBZSxDQUFD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QUNFLGlDQUFpQztnSUFlMUIsb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsNEJBQTRCO3NCQUE1QyxNQUFNO2dCQUNFLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRixlQUFlO3NCQURsQixLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi8uLi9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRhdGFDb25maWc6IGFueTtcbiAgYXJndW1lbnRWYWx1ZTogYW55O1xuICBwZXJjZW50YWdlRGF0YVNvdXJjZTogYW55O1xuICB0YWJsZUNvbmZpZzogYW55O1xuICBwYWdlX2NvbmZpZzogYW55O1xuICBwYWdlX3Bhcm1zOiBhbnk7XG4gIHRhYmxlSGVpZ2h0OiBhbnk7XG5cbiAgaXNMb2FkZXI6IGJvb2xlYW5cbiAgY3VycmVudERhdGVEYXRhXG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0VGFibGVDb25maWdPdXRQdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9Sb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25yaWdodENsaWNrQ29udGV4dFNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHJpZ2h0Q2xpY2tFbmFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoJ2NoYXJ0RGF0YVNvdXJjZScpXG4gIHNldCBjaGFydERhdGFTb3VyY2UodmFsdWUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5wYWdlX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5wYWdlX3Bhcm1zID0gdmFsdWUudGl0bGVQYXJhbXM7XG4gICAgICB0aGlzLnRhYmxlSGVpZ2h0ID0gKHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnRhYmxlSGVpZ2h0ICYmIHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnRhYmxlSGVpZ2h0ICE9PSBcIlwiKT8gdGhpcy5zZXRUYWJsZUhlaWdodCh2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy50YWJsZUhlaWdodCk6J2F1dG8nO1xuXG4gICAgICBpZiAodmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UgJiYgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UubGVuZ3RoICE9PSAwKSB7XG5cblxuXG4gICAgICAgIHRoaXMudGFibGVDb25maWcgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZztcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNvbHVtbnM7XG5cblxuXG4gICAgICAgIGxldCBtYWluRGF0YXNvdXJjZTogYW55O1xuXG4gICAgICAgIGxldCB0YWJsZUNvbHVtbnMgPSAodmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY29sdW1ucykgPyB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5jb2x1bW5zIDogW107XG4gICAgICAgIGlmICh0YWJsZUNvbHVtbnMgJiYgdGFibGVDb2x1bW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZS5tYXAob2JqID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld09iaiA9IHsgLi4ub2JqIH07XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdPYmopLmZvckVhY2goa2V5ID0+IHtcblxuICAgICAgICAgICAgICAvLyBjb25zdCBmb3VuZE1hdGNoT2JqZWN0ID0gdGFibGVDb2x1bW5zLmZpbmQob2JqID0+IG9iai5kYXRhRmllbGQgPT09IGtleSk7XG4gICAgICAgICAgICAgIC8vIGlmIChmb3VuZE1hdGNoT2JqZWN0KSB7XG4gICAgICAgICAgICAgIC8vICAgaWYgKGZvdW5kTWF0Y2hPYmplY3QuZW5yaWNoTmFtZSAmJiBmb3VuZE1hdGNoT2JqZWN0LmVucmljaE5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGZvdW5kTWF0Y2hPYmplY3QuZW5yaWNoTmFtZSk7XG4gICAgICAgICAgICAgIC8vICAgICBuZXdPYmpba2V5XSA9IHRoaXMuY2FsbFNlcnZpY2VGdW5jdGlvbihmb3VuZE1hdGNoT2JqZWN0LmVucmljaE5hbWUsIG5ld09ialtrZXldKVxuICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgLy8gfVxuXG5cbiAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkYXRlJykgJiYgbmV3T2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IG1vbWVudChuZXdPYmpba2V5XSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucGVyY2VudGFnZURhdGFTb3VyY2UgPSB0aGlzLmxvYWREYWlseU1zY1ZvaWNlVGFibGUoZGF0YVNvdXJjZSwgY29sdW1ucylcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG5cbiAgdGFibGVEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgfVxuXG5cblxuICBsb2FkRGFpbHlNc2NWb2ljZVRhYmxlKGRhdGE6IGFueVtdLCBkYXRhY29sdW1uczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFyZ3VtZW50VmFsdWUgPSBkYXRhY29sdW1ucy5maWx0ZXIoXG4gICAgICAoY29sdW1uOiBhbnkpID0+IGNvbHVtbi5pc1Nob3dCYXIgPT0gZmFsc2VcbiAgICApO1xuICAgIHRoaXMuZGF0YUNvbmZpZyA9IGRhdGFjb2x1bW5zLmZpbHRlcigoY29sdW1uOiBhbnkpID0+IGNvbHVtbi5pc1Nob3dCYXIgPT0gdHJ1ZSk7XG4gICAgbGV0IGtleXMgPSB0aGlzLmRhdGFDb25maWc7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgbGV0IGZpbmFsRGF0YXNvdXJjZSA9IFtdO1xuICAgIFxuICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudE9uZSkgPT4ge1xuICAgICAgLy8gUHJlLWNvbXB1dGUgbWF4IGFuZCBtaW4gdmFsdWVzIGZvciBlYWNoIGNvbHVtblxuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKGl0ZW0pID0+IHBhcnNlRmxvYXQoaXRlbVtrZXlbJ2RhdGFGaWVsZCddXSkgfHwgMCk7XG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gTWF0aC5tYXgoLi4udmFsdWVzKTtcbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSBNYXRoLm1pbiguLi52YWx1ZXMpO1xuICAgICAgICByZXN1bHRba2V5WydkYXRhRmllbGQnXV0gPSB7IG1heFZhbHVlLCBtaW5WYWx1ZSB9O1xuICAgICAgfSk7XG4gIFxuICAgICAgbGV0IG9iaiA9IHt9O1xuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBwYXJzZUZsb2F0KGVsZW1lbnRPbmVba2V5WydkYXRhRmllbGQnXV0pIHx8IDA7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5jb21tb25TZXJ2aWNlLnJlZm9ybWF0TnVtYmVyV2l0aFRob3VzYW5kU2VwYXJhdG9yKHJhd1ZhbHVlKTtcbiAgXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgd2lkdGggZm9yIHRoZSBiYXJcbiAgICAgICAgY29uc3QgYmFzZVdpZHRoID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjYWxlTnVtYmVyKFxuICAgICAgICAgIHJhd1ZhbHVlLCBcbiAgICAgICAgICByZXN1bHRba2V5WydkYXRhRmllbGQnXV1bJ21pblZhbHVlJ10sIFxuICAgICAgICAgIHJlc3VsdFtrZXlbJ2RhdGFGaWVsZCddXVsnbWF4VmFsdWUnXSwgXG4gICAgICAgICAgMTAsIFxuICAgICAgICAgIDc1XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gZm9ybWF0dGVkVmFsdWUubGVuZ3RoICogNztcbiAgICAgICAgY29uc3QgZmluYWxXaWR0aCA9IE1hdGgubWF4KGJhc2VXaWR0aCwgbWluV2lkdGgpO1xuICAgICAgICBjb25zdCBCYXIgPSB0aGlzLmNvbW1vblNlcnZpY2UuY3JlYXRlSHRtbChmaW5hbFdpZHRoLCBmb3JtYXR0ZWRWYWx1ZSwga2V5Wydjb2xvciddKTtcbiAgICAgICAgb2JqW2tleVsnZGF0YUZpZWxkJ11dID0gQmFyO1xuICAgICAgfSk7XG4gIFxuICAgICAgLy8gQWRkIG90aGVyIGFyZ3VtZW50IHZhbHVlcyB0byB0aGUgb2JqZWN0XG4gICAgICB0aGlzLmFyZ3VtZW50VmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBvYmpbZWxlbWVudC5kYXRhRmllbGRdID0gZWxlbWVudE9uZVtlbGVtZW50LmRhdGFGaWVsZF07XG4gICAgICB9KTtcbiAgXG4gICAgICBmaW5hbERhdGFzb3VyY2UucHVzaChvYmopO1xuICAgIH0pO1xuICBcbiAgICByZXR1cm4gZmluYWxEYXRhc291cmNlO1xuICB9XG5cblxuICBvblJvd0NsaWNrKGUpIHtcblxuICAgIGNvbnN0IHRpdGxlX3BhcmFtcyA9IGUuZGF0YVt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNvbW1vbkNvbmZpZ1snZGF0YUZpZWxkJ11dXG4gICAgbGV0IHRpdGxlID0gdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5jb21tb25Db25maWdbJ3RpdGxlJ10gKyB0aXRsZV9wYXJhbXM7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIGRhdGE6IGUuZGF0YSxcbiAgICAgIGtleVRvUGFzczogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcua2V5VG9QYXNzLFxuICAgICAgdGFibGVUaXRsZTogKHRoaXMucGFnZV9wYXJtcykgPyB0aGlzLnBhZ2VfcGFybXMgKyB0aXRsZSA6IHRpdGxlLFxuICAgICAgdmlld0lkOiB0aGlzLnBhZ2VfY29uZmlnLnZpZXdJZCxcbiAgICAgIGRyaWxsRG93blR5cGU6IFwibmF0dXJhbFwiLFxuICAgICAgZHJpbGxkb3duRnJvbTogdGhpcy5wYWdlX2NvbmZpZy52aWV3SWQsXG4gICAgICBkcmlsbGRvd25UbzogXCJcIixcbiAgICB9XG4gICAgdGhpcy5vUm93Q2xpY2suZW1pdChvYmopO1xuICB9XG5cbiAgYWRkTWVudUl0ZW1zKGUpIHtcblxuICAgIGNvbnN0IHRpdGxlX3BhcmFtcyA9IGUucm93LmRhdGFbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5jb21tb25Db25maWdbJ2RhdGFGaWVsZCddXVxuICAgIGxldCB0aXRsZSA9IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuY29tbW9uQ29uZmlnWyd0aXRsZSddICsgdGl0bGVfcGFyYW1zO1xuXG4gICAgaWYgKHRoaXMucmlnaHRDbGlja0VuYWJsZSAmJiBlLmNvbHVtbkluZGV4ID09IDApIHtcbiAgICAgIGlmIChlLnRhcmdldCA9PSAnY29udGVudCcpIHtcbiAgICAgICAgaWYgKCFlLml0ZW1zKSBlLml0ZW1zID0gW107XG5cbiAgICAgICAgdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuY29udGV4dE1lbnUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmtleVRvUGFzcy5zb21lKGtleSA9PiBlbGVtZW50LmRpc3BsYXlLZXkuaW5jbHVkZXMoa2V5KSkpIHtcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgIHRleHQ6IGVsZW1lbnQuZGlzcGxheUtleSxcbiAgICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHRjbGlja0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBlLnJvdy5kYXRhLFxuICAgICAgICAgICAgICAgICAga2V5VG9QYXNzOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5rZXlUb1Bhc3MsXG4gICAgICAgICAgICAgICAgICB0YWJsZVRpdGxlOiAodGhpcy5wYWdlX3Bhcm1zKSA/IHRoaXMucGFnZV9wYXJtcyArIHRpdGxlIDogdGl0bGUsXG4gICAgICAgICAgICAgICAgICB2aWV3SWQ6IHRoaXMucGFnZV9jb25maWcudmlld0lkLFxuICAgICAgICAgICAgICAgICAgZHJpbGxEb3duVHlwZTogXCJjb250ZXh0XCIsXG4gICAgICAgICAgICAgICAgICBkcmlsbGRvd25Gcm9tOiB0aGlzLnBhZ2VfY29uZmlnLnZpZXdJZCxcbiAgICAgICAgICAgICAgICAgIGRyaWxsZG93blRvOiBlbGVtZW50LnZpZXdJZCxcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9ucmlnaHRDbGlja0NvbnRleHRTZWxlY3Rpb24uZW1pdChyaWdodGNsaWNrRGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRUYWJsZUhlaWdodCh2YWx1ZTogYW55KTogYW55IHtcbiAgXG4gICAgY29uc3QgdGFibGVIZWlnaHQgPSB2YWx1ZTtcbiAgICBpZiAodGFibGVIZWlnaHQgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuICdhdXRvJztcbiAgICB9XG4gICAgICBjb25zdCBwYXJzZWRIZWlnaHQgPSBOdW1iZXIodGFibGVIZWlnaHQpO1xuICAgIGlmICghaXNOYU4ocGFyc2VkSGVpZ2h0KSAmJiBwYXJzZWRIZWlnaHQgPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VkSGVpZ2h0O1xuICAgIH1cbiAgfVxuXG5cbn0iLCJcblxuPGRpdiBjbGFzcz1cIm14LTIgYmctZ3JheS04MDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtc3RhcnQgYmctZ3JheS04MDAgcC0yXCI+XG4gICAgICAgICAgICA8YXBwLWxvYWRlcj48L2FwcC1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm14LTIgcGItMlwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZHgtZGF0YS1ncmlkIChvblJvd0NsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50KVwiIFtkYXRhU291cmNlXT1cInBlcmNlbnRhZ2VEYXRhU291cmNlXCIgW2hlaWdodF09XCJ0YWJsZUhlaWdodFwiXG4gICAgICAgICAgICAgICAgKG9uQ29udGV4dE1lbnVQcmVwYXJpbmcpPVwiYWRkTWVudUl0ZW1zKCRldmVudClcIiBbcm93QWx0ZXJuYXRpb25FbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtob3ZlclN0YXRlRW5hYmxlZF09XCJ0cnVlXCIgW3NlbGVjdGVkUm93S2V5c109XCJbXVwiIFtzaG93Qm9yZGVyc109XCJ0cnVlXCIgW3Nob3dDb2x1bW5MaW5lc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2hvd1Jvd0xpbmVzXT1cInRydWVcIiBbc2hvd1Jvd0xpbmVzXT1cInRydWVcIiBpZD1cImdyaWRDb250YWluZXJcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21pemVFeHBvcnREYXRhXT1cImNvbW1vblNlcnZpY2UucmVtb3ZlSHRtbENvbnRlbnRGcm9tRGF0YVwiPlxuICAgICAgICAgICAgICAgIDxkeG8tc2VhcmNoLXBhbmVsIFtoaWdobGlnaHRDYXNlU2Vuc2l0aXZlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdmlzaWJsZV09XCJ0YWJsZUNvbmZpZy5zZWFyY2hQYW5lbFwiPjwvZHhvLXNlYXJjaC1wYW5lbD5cbiAgICAgICAgICAgICAgICA8ZHhvLWV4cG9ydCBbZW5hYmxlZF09XCJ0cnVlXCIgZmlsZU5hbWU9XCJ7e3RhYmxlQ29uZmlnLmZpbGVfbmFtZX19XCI+PC9keG8tZXhwb3J0PlxuICAgICAgICAgICAgICAgIDxkeG8tcGFnaW5nIFtwYWdlU2l6ZV09XCJ0YWJsZUNvbmZpZy5udW1iZXJPZlJvd1wiPjwvZHhvLXBhZ2luZz5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2VyIFtzaG93SW5mb109XCJ0YWJsZUNvbmZpZy5wYWdlSW5mb1wiIFtzaG93UGFnZVNpemVTZWxlY3Rvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRQYWdlU2l6ZXNdPVwidGFibGVDb25maWcuYWxsb3dlZFBhZ2VTaXplc1wiPlxuICAgICAgICAgICAgICAgIDwvZHhvLXBhZ2VyPlxuICAgICAgICAgICAgICAgIDxkeG8tbG9hZC1wYW5lbCBbZW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPC9keG8tbG9hZC1wYW5lbD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFyZ3VtZW50VmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gKm5nSWY9XCJpdGVtLmRhdGFGaWVsZCA9PSAncmVjb3JkRGF0ZSdcIiBkYXRhRmllbGQ9XCJ7eyBpdGVtLmRhdGFGaWVsZCB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FwdGlvbl09XCJpdGVtLmNhcHRpb25cIiBbdmlzaWJsZV09XCJpdGVtLnZpc2libGVcIiBzb3J0T3JkZXI9XCJkZXNjXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiAqbmdJZj1cIml0ZW0uZGF0YUZpZWxkICE9PSAncmVjb3JkRGF0ZSdcIiBmb3JtYXQ9XCIjLCMjMC4jI1wiIFtjYXB0aW9uXT1cIml0ZW0uY2FwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc29ydGluZ01ldGhvZF09XCJjb21tb25TZXJ2aWNlLmN1c3RvbVZhbHVlU29ydGVyXCIgZGF0YUZpZWxkPVwie3sgaXRlbS5kYXRhRmllbGQgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50PVwibGVmdFwiIFt2aXNpYmxlXT1cIml0ZW0udmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGNlbGxUZW1wbGF0ZT1cInt7IGl0ZW0uZGF0YUZpZWxkIH19XCIgZGF0YUZpZWxkPVwie3sgaXRlbS5kYXRhRmllbGQgfX1cIiBhbGlnbm1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc29ydGluZ01ldGhvZF09XCJjb21tb25TZXJ2aWNlLmN1c3RvbVZhbHVlU29ydGVyRm9yQmFyXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YUNvbmZpZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgIGl0ZW0uZGF0YUZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZGF0YS52YWx1ZSB8IGNvbnRlbnRTYWZlSHRtbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZHgtZGF0YS1ncmlkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gKG9uRmlsZVNhdmluZyk9XCJkb3dubG9hZFRhYmxlRGF0YSgkZXZlbnQpXCIgLS0+Il19