ngx-sumax-erp-components 0.0.1
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.
- package/README.md +24 -0
- package/esm2022/lib/date-picker/CustomDatePickerFormat.mjs +43 -0
- package/esm2022/lib/date-picker/CustomDatePickerI18n.mjs +50 -0
- package/esm2022/lib/date-picker/date-picker.component.mjs +366 -0
- package/esm2022/lib/date-picker/date-picker.mjs +3 -0
- package/esm2022/lib/date-picker/date-picker.module.mjs +69 -0
- package/esm2022/lib/date-picker/date-picker.service.mjs +68 -0
- package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +311 -0
- package/esm2022/lib/date-time-picker/date-time-picker.mjs +3 -0
- package/esm2022/lib/date-time-picker/date-time-picker.module.mjs +76 -0
- package/esm2022/lib/date-time-picker/date-time-picker.service.mjs +64 -0
- package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.component.mjs +1140 -0
- package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.module.mjs +93 -0
- package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.service.mjs +85 -0
- package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.mjs +283 -0
- package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.mjs +23 -0
- package/esm2022/lib/error-message/error-message.component.mjs +24 -0
- package/esm2022/lib/error-message/error-message.module.mjs +19 -0
- package/esm2022/lib/input-number/input-number.component.mjs +351 -0
- package/esm2022/lib/input-number/input-number.mjs +3 -0
- package/esm2022/lib/input-number/input-number.module.mjs +65 -0
- package/esm2022/lib/input-number/input-number.service.mjs +68 -0
- package/esm2022/lib/input-text/input-text.component.mjs +345 -0
- package/esm2022/lib/input-text/input-text.mjs +3 -0
- package/esm2022/lib/input-text/input-text.module.mjs +73 -0
- package/esm2022/lib/input-text/input-text.service.mjs +96 -0
- package/esm2022/lib/ng-select-multiple/ng-select-multiple.component.mjs +375 -0
- package/esm2022/lib/ng-select-multiple/ng-select-multiple.mjs +3 -0
- package/esm2022/lib/ng-select-multiple/ng-select-multiple.module.mjs +69 -0
- package/esm2022/lib/ng-select-multiple/ng-select-multiple.service.mjs +96 -0
- package/esm2022/lib/ng-select-simple/ng-select-simple.component.mjs +461 -0
- package/esm2022/lib/ng-select-simple/ng-select-simple.mjs +3 -0
- package/esm2022/lib/ng-select-simple/ng-select-simple.module.mjs +53 -0
- package/esm2022/lib/ng-select-simple/ng-select-simple.service.mjs +138 -0
- package/esm2022/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.mjs +144 -0
- package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.mjs +27 -0
- package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.mjs +22 -0
- package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.mjs +242 -0
- package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.mjs +62 -0
- package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-config.mjs +27 -0
- package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.mjs +70 -0
- package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.mjs +45 -0
- package/esm2022/lib/sc-ag-grid/directives/scAgGrid.directive.mjs +25 -0
- package/esm2022/lib/sc-ag-grid/index.mjs +14 -0
- package/esm2022/lib/sc-ag-grid/input-search/input-search.component.mjs +20 -0
- package/esm2022/lib/sc-ag-grid/input-search/input-search.module.mjs +31 -0
- package/esm2022/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.mjs +564 -0
- package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.mjs +80 -0
- package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.mjs +31 -0
- package/esm2022/lib/sc-ag-grid/sc-ag-grid.module.mjs +118 -0
- package/esm2022/lib/sc-ag-grid/sc-grid.uitl.mjs +10 -0
- package/esm2022/lib/sc-wizard/sc-wizard.component.mjs +75 -0
- package/esm2022/lib/sc-wizard/sc-wizard.module.mjs +44 -0
- package/esm2022/lib/text-area/text-area.component.mjs +272 -0
- package/esm2022/lib/text-area/text-area.mjs +3 -0
- package/esm2022/lib/text-area/text-area.module.mjs +60 -0
- package/esm2022/lib/text-area/text-area.service.mjs +54 -0
- package/esm2022/lib/tooltip-message/tooltip-message.component.mjs +25 -0
- package/esm2022/lib/tooltip-message/tooltip-message.module.mjs +21 -0
- package/esm2022/lib/utils/DateTimeModel.mjs +56 -0
- package/esm2022/lib/utils/DateTimePickerEditable.mjs +3 -0
- package/esm2022/lib/utils/DateUtil.mjs +196 -0
- package/esm2022/lib/utils/INgSelect.mjs +2 -0
- package/esm2022/lib/utils/IScAgGrid.mjs +7 -0
- package/esm2022/lib/utils/ScWizardBase.mjs +14 -0
- package/esm2022/lib/utils/SharedComponentsUtil.mjs +38 -0
- package/esm2022/lib/utils/ValidateUtil.mjs +18 -0
- package/esm2022/lib/utils/message-util.service.mjs +75 -0
- package/esm2022/ngx-sumax-erp-components.mjs +5 -0
- package/esm2022/public-api.mjs +33 -0
- package/fesm2022/ngx-sumax-erp-components.mjs +7045 -0
- package/fesm2022/ngx-sumax-erp-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/date-picker/CustomDatePickerFormat.d.ts +11 -0
- package/lib/date-picker/CustomDatePickerI18n.d.ts +25 -0
- package/lib/date-picker/date-picker.component.d.ts +108 -0
- package/lib/date-picker/date-picker.d.ts +10 -0
- package/lib/date-picker/date-picker.module.d.ts +18 -0
- package/lib/date-picker/date-picker.service.d.ts +22 -0
- package/lib/date-time-picker/date-time-picker.component.d.ts +96 -0
- package/lib/date-time-picker/date-time-picker.d.ts +9 -0
- package/lib/date-time-picker/date-time-picker.module.d.ts +18 -0
- package/lib/date-time-picker/date-time-picker.service.d.ts +20 -0
- package/lib/date-time-picker-editable/date-time-picker-editable.component.d.ts +118 -0
- package/lib/date-time-picker-editable/date-time-picker-editable.module.d.ts +16 -0
- package/lib/date-time-picker-editable/date-time-picker-editable.service.d.ts +27 -0
- package/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.d.ts +82 -0
- package/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.d.ts +13 -0
- package/lib/error-message/error-message.component.d.ts +13 -0
- package/lib/error-message/error-message.module.d.ts +9 -0
- package/lib/input-number/input-number.component.d.ts +74 -0
- package/lib/input-number/input-number.d.ts +10 -0
- package/lib/input-number/input-number.module.d.ts +17 -0
- package/lib/input-number/input-number.service.d.ts +22 -0
- package/lib/input-text/input-text.component.d.ts +85 -0
- package/lib/input-text/input-text.d.ts +17 -0
- package/lib/input-text/input-text.module.d.ts +18 -0
- package/lib/input-text/input-text.service.d.ts +35 -0
- package/lib/ng-select-multiple/ng-select-multiple.component.d.ts +83 -0
- package/lib/ng-select-multiple/ng-select-multiple.d.ts +14 -0
- package/lib/ng-select-multiple/ng-select-multiple.module.d.ts +17 -0
- package/lib/ng-select-multiple/ng-select-multiple.service.d.ts +30 -0
- package/lib/ng-select-simple/ng-select-simple.component.d.ts +124 -0
- package/lib/ng-select-simple/ng-select-simple.d.ts +20 -0
- package/lib/ng-select-simple/ng-select-simple.module.d.ts +17 -0
- package/lib/ng-select-simple/ng-select-simple.service.d.ts +42 -0
- package/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.d.ts +61 -0
- package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.d.ts +10 -0
- package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.d.ts +9 -0
- package/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.d.ts +49 -0
- package/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.d.ts +11 -0
- package/lib/sc-ag-grid/cell-render/sc-cell-render-config.d.ts +20 -0
- package/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.d.ts +16 -0
- package/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.d.ts +16 -0
- package/lib/sc-ag-grid/directives/scAgGrid.directive.d.ts +10 -0
- package/lib/sc-ag-grid/index.d.ts +13 -0
- package/lib/sc-ag-grid/input-search/input-search.component.d.ts +11 -0
- package/lib/sc-ag-grid/input-search/input-search.module.d.ts +9 -0
- package/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.d.ts +191 -0
- package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.d.ts +25 -0
- package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.d.ts +9 -0
- package/lib/sc-ag-grid/sc-ag-grid.module.d.ts +32 -0
- package/lib/sc-ag-grid/sc-grid.uitl.d.ts +5 -0
- package/lib/sc-wizard/sc-wizard.component.d.ts +38 -0
- package/lib/sc-wizard/sc-wizard.module.d.ts +13 -0
- package/lib/text-area/text-area.component.d.ts +66 -0
- package/lib/text-area/text-area.d.ts +8 -0
- package/lib/text-area/text-area.module.d.ts +16 -0
- package/lib/text-area/text-area.service.d.ts +18 -0
- package/lib/tooltip-message/tooltip-message.component.d.ts +13 -0
- package/lib/tooltip-message/tooltip-message.module.d.ts +11 -0
- package/lib/utils/DateTimeModel.d.ts +16 -0
- package/lib/utils/DateTimePickerEditable.d.ts +13 -0
- package/lib/utils/DateUtil.d.ts +37 -0
- package/lib/utils/INgSelect.d.ts +6 -0
- package/lib/utils/IScAgGrid.d.ts +65 -0
- package/lib/utils/ScWizardBase.d.ts +9 -0
- package/lib/utils/SharedComponentsUtil.d.ts +6 -0
- package/lib/utils/ValidateUtil.d.ts +4 -0
- package/lib/utils/message-util.service.d.ts +10 -0
- package/package.json +32 -0
- package/public-api.d.ts +29 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewChild, inject, } from "@angular/core";
|
|
2
|
+
import { Subscription, of } from "rxjs";
|
|
3
|
+
import { EnumButtonType, } from "../../utils/IScAgGrid";
|
|
4
|
+
import { MessageUtilService } from "../../utils/message-util.service";
|
|
5
|
+
import { ScCellRenderButtonService } from "../cell-render/sc-cell-render-button/sc-cell-render-button.component";
|
|
6
|
+
import { scComponents } from "../cell-render/sc-cell-render-config";
|
|
7
|
+
import { ScAgGridButtonHeader } from "../directives/scAgGrid.directive";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
import * as i2 from "ag-grid-angular";
|
|
11
|
+
import * as i3 from "@angular/material/menu";
|
|
12
|
+
import * as i4 from "@angular/material/icon";
|
|
13
|
+
import * as i5 from "../sc-ag-grid-pagination/sc-ag-grid-pagination.component";
|
|
14
|
+
import * as i6 from "../input-search/input-search.component";
|
|
15
|
+
import * as i7 from "../cell-render/sc-cell-render-button/sc-cell-render-button.component";
|
|
16
|
+
let nextId = 0;
|
|
17
|
+
export class ScAgGridCustomizableComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.idScAgGridCustomizableComponent = `sc-ag-grid-customizable-${++nextId}`;
|
|
20
|
+
this.isRowSelectable = () => true;
|
|
21
|
+
this.searchClass = "col-12 col-sm-12 col-md-6 col-lg-6 col-xl-5 my-2";
|
|
22
|
+
this.getRowStyle = () => undefined;
|
|
23
|
+
this.fillSearch = false;
|
|
24
|
+
//#region Inputs
|
|
25
|
+
/**
|
|
26
|
+
* @description Cantidad de items que se mostrará por página
|
|
27
|
+
* @default 15
|
|
28
|
+
*/
|
|
29
|
+
this.paginationPageSize = 15;
|
|
30
|
+
this.searchWidth = "";
|
|
31
|
+
/**
|
|
32
|
+
* @description Opciones de tamaño de página
|
|
33
|
+
* @default [5, 10, 15, 20, 25]
|
|
34
|
+
*/
|
|
35
|
+
this.pageSizeOptions = [5, 10, 15, 20, 25];
|
|
36
|
+
/**
|
|
37
|
+
* @description Si el valor es `true` muestra la paginación
|
|
38
|
+
* @default true
|
|
39
|
+
*/
|
|
40
|
+
this.pagination = true;
|
|
41
|
+
/**
|
|
42
|
+
* @description Tipo de selecion en la `grilla`s
|
|
43
|
+
* @default 'simple'
|
|
44
|
+
*/
|
|
45
|
+
this.rowSelection = "single";
|
|
46
|
+
/**
|
|
47
|
+
* @description Array de columnas que se mostrara en la `grilla`
|
|
48
|
+
* @default undefined
|
|
49
|
+
*/
|
|
50
|
+
this.columnDefs = [];
|
|
51
|
+
/**
|
|
52
|
+
* @description Array de datos que se mostrara en la `grilla`
|
|
53
|
+
* @default null
|
|
54
|
+
*/
|
|
55
|
+
this.rowData = of([]);
|
|
56
|
+
this.defaultCellRendererActions = undefined;
|
|
57
|
+
this._configButtonsDefaultAgGrid = [];
|
|
58
|
+
/**
|
|
59
|
+
* @description Si el valor es `true` muestra el `buscador`
|
|
60
|
+
* @default true
|
|
61
|
+
*/
|
|
62
|
+
this.visibleSearch = true;
|
|
63
|
+
this.domLayout = "normal";
|
|
64
|
+
this.height = "20em";
|
|
65
|
+
/**
|
|
66
|
+
* @description Cpnfiguración para el boton `Agregar`
|
|
67
|
+
* @default { visible: true, disabled: false }
|
|
68
|
+
*/
|
|
69
|
+
this.btnAdd = { visible: true };
|
|
70
|
+
/**
|
|
71
|
+
* @description Para activar o descativar el drag & drop
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
this.rowDragManaged = false;
|
|
75
|
+
/**
|
|
76
|
+
* @description Para activar o descativar las animaciones
|
|
77
|
+
* @default false
|
|
78
|
+
*/
|
|
79
|
+
this.animateRows = false;
|
|
80
|
+
this.useGridCopy = false;
|
|
81
|
+
this.showMenuDefault = false;
|
|
82
|
+
this.enableCellTextSelection = true;
|
|
83
|
+
this.suppressRowTransform = false;
|
|
84
|
+
this.enableRangeSelection = false;
|
|
85
|
+
this.noRowsOverlayComponent = "";
|
|
86
|
+
this.noRowsOverlayComponentParams = {};
|
|
87
|
+
this.validatePasteCell = (evtSource, evtTarget) => Promise.resolve(true);
|
|
88
|
+
this.validatePasteRows = (evtSource, evtTarget) => Promise.resolve(true);
|
|
89
|
+
//#region Output
|
|
90
|
+
this.onChangeFilter = new EventEmitter();
|
|
91
|
+
this.onAddRow = new EventEmitter();
|
|
92
|
+
this.onGridAddRow = new EventEmitter();
|
|
93
|
+
this.onEditRow = new EventEmitter();
|
|
94
|
+
this.onDeleteRow = new EventEmitter();
|
|
95
|
+
this.onCellKeyDown = new EventEmitter();
|
|
96
|
+
this.onCellStopEditing = new EventEmitter();
|
|
97
|
+
this.onButtonActionAgGrid = new EventEmitter();
|
|
98
|
+
this.onButtonActionHeader = new EventEmitter();
|
|
99
|
+
// AgGrid Events - Ouput
|
|
100
|
+
this.onGridReady = new EventEmitter();
|
|
101
|
+
this.onGridSelectChange = new EventEmitter();
|
|
102
|
+
this.onGridChange = new EventEmitter();
|
|
103
|
+
this.onRowDragEnd = new EventEmitter();
|
|
104
|
+
this.onRowEditingStarted = new EventEmitter();
|
|
105
|
+
this.rowClicked = new EventEmitter();
|
|
106
|
+
this.rowDoubleClicked = new EventEmitter();
|
|
107
|
+
this.onRowSelected = new EventEmitter();
|
|
108
|
+
this.cellValueChanged = new EventEmitter();
|
|
109
|
+
this.onCellContextMenu = new EventEmitter();
|
|
110
|
+
this.onPasteMenu = new EventEmitter();
|
|
111
|
+
this.onCopyMenu = new EventEmitter();
|
|
112
|
+
this.afterPasteCell = new EventEmitter();
|
|
113
|
+
this.beforePasteCell = new EventEmitter();
|
|
114
|
+
this.afterPasteRows = new EventEmitter();
|
|
115
|
+
this.beforePasteRows = new EventEmitter();
|
|
116
|
+
this.columnDefsAndAddCellActions = [];
|
|
117
|
+
this.defaultColDef = {
|
|
118
|
+
resizable: true,
|
|
119
|
+
sortable: true,
|
|
120
|
+
};
|
|
121
|
+
this._frameworkComponents = { ...scComponents };
|
|
122
|
+
this._context = { componentParent: this };
|
|
123
|
+
this.bottomMenu = "0";
|
|
124
|
+
this.leftMenu = "0";
|
|
125
|
+
this.hiddenMenu = true;
|
|
126
|
+
this.overlayNoRowsTemplate = `<span class="ag-overlay-loading-center border-0 bg-transparent shadow-none">
|
|
127
|
+
No se encontraron registros...
|
|
128
|
+
</span>`;
|
|
129
|
+
this.overlayLoadingTemplate = `<span class="ag-overlay-loading-top d-flex align-items-center border-0 bg-white shadow p-4 text-info" style="height: 20px;">
|
|
130
|
+
<img src="assets/media-demo/loading.gif" height="20" width="25" class="mr-2">
|
|
131
|
+
<strong>Cargando registros</strong>
|
|
132
|
+
</span>
|
|
133
|
+
`;
|
|
134
|
+
this.suppressDragLeaveHidesColumns = true;
|
|
135
|
+
this.suppressScrollOnNewData = false;
|
|
136
|
+
this.suppressPaginationPanel = true;
|
|
137
|
+
this._subscription$ = new Subscription();
|
|
138
|
+
this.progressVisibled = false;
|
|
139
|
+
this.selectedRows = [];
|
|
140
|
+
this._scCellRenderButtonService = inject(ScCellRenderButtonService);
|
|
141
|
+
this._messageUtilService = inject(MessageUtilService);
|
|
142
|
+
}
|
|
143
|
+
get buttonAddElement() {
|
|
144
|
+
return this.buttonAdd?.nativeElement ?? null;
|
|
145
|
+
}
|
|
146
|
+
// @Input() suppressRowClickSelection = true;
|
|
147
|
+
get suppressRowClickSelection() {
|
|
148
|
+
return this.rowSelection === "single" ? false : true;
|
|
149
|
+
}
|
|
150
|
+
get configHeader() {
|
|
151
|
+
return this.configButtonsAction?.header ?? null;
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
/**
|
|
155
|
+
* @description Para agregar componentes internos dentro de la grilla
|
|
156
|
+
*/
|
|
157
|
+
set frameworkComponents(value) {
|
|
158
|
+
this._frameworkComponents = { ...this._frameworkComponents, ...value };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* @description Para poder agregar más objetos al contexto
|
|
162
|
+
*/
|
|
163
|
+
set context(value) {
|
|
164
|
+
this._context = { ...this._context, ...value };
|
|
165
|
+
}
|
|
166
|
+
// AgGrid Style
|
|
167
|
+
get ngStyleContainer() {
|
|
168
|
+
return {
|
|
169
|
+
width: "100%",
|
|
170
|
+
height: this.height,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
get ngStyleAgGrid() {
|
|
174
|
+
return {
|
|
175
|
+
width: "100%",
|
|
176
|
+
height: "100%",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
ngOnInit() {
|
|
180
|
+
this._subscription$.add(this._scCellRenderButtonService.handlerButtonAction$.subscribe(({ index, action }) => {
|
|
181
|
+
if (action == null)
|
|
182
|
+
return;
|
|
183
|
+
if (action.trim() === "")
|
|
184
|
+
return;
|
|
185
|
+
if (index !== -1) {
|
|
186
|
+
this.onButtonActionAgGridEmit(index, action);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.onButtonActionHeaderEmit(action);
|
|
190
|
+
}));
|
|
191
|
+
this.initActionButton();
|
|
192
|
+
}
|
|
193
|
+
ngOnChanges(changes) {
|
|
194
|
+
if (!this.gridApi)
|
|
195
|
+
return;
|
|
196
|
+
if (changes["configButtonsAction"])
|
|
197
|
+
this.initActionButton();
|
|
198
|
+
if (changes["rowData"])
|
|
199
|
+
this.initRowData();
|
|
200
|
+
}
|
|
201
|
+
ngOnDestroy() {
|
|
202
|
+
this._subscription$?.unsubscribe();
|
|
203
|
+
this._subscriptionRowData$?.unsubscribe();
|
|
204
|
+
this.selectedRows.length = 0;
|
|
205
|
+
}
|
|
206
|
+
onButtonActionHeaderEmit(typeButton) {
|
|
207
|
+
const rowsSelected = this.gridApi?.getSelectedRows();
|
|
208
|
+
this.onButtonActionHeader.emit([typeButton, rowsSelected]);
|
|
209
|
+
}
|
|
210
|
+
initActionButton() {
|
|
211
|
+
if (isObjEmpty(this.configButtonsAction))
|
|
212
|
+
return;
|
|
213
|
+
const { agGrid } = this.configButtonsAction;
|
|
214
|
+
if (agGrid && agGrid.actions.length > 0) {
|
|
215
|
+
this._configButtonsDefaultAgGrid = [...agGrid.actions];
|
|
216
|
+
}
|
|
217
|
+
this.sizeFitColumnAction();
|
|
218
|
+
}
|
|
219
|
+
sizeFitColumnAction() {
|
|
220
|
+
const length = this._configButtonsDefaultAgGrid.filter(({ hide }) => {
|
|
221
|
+
return !this._hideFunc(hide);
|
|
222
|
+
}).length;
|
|
223
|
+
const width = length == 2 ? 90 : 80;
|
|
224
|
+
const minWidth = length > 2 ? length * 33 + 10 : width;
|
|
225
|
+
const newColumns = {
|
|
226
|
+
headerName: "Acciones",
|
|
227
|
+
headerClass: "ag-header__center",
|
|
228
|
+
field: "",
|
|
229
|
+
width: minWidth,
|
|
230
|
+
minWidth,
|
|
231
|
+
maxWidth: minWidth,
|
|
232
|
+
cellClass: ["d-flex", "justify-content-center", "align-items-center"],
|
|
233
|
+
cellStyle: { overflow: "visible" },
|
|
234
|
+
resizable: false,
|
|
235
|
+
sortable: false,
|
|
236
|
+
cellRenderer: this.defaultCellRendererActions ? this.defaultCellRendererActions : "scCellRendererButtonComponent",
|
|
237
|
+
pinned: "right",
|
|
238
|
+
suppressMenu: true,
|
|
239
|
+
lockPosition: true,
|
|
240
|
+
};
|
|
241
|
+
this.columnDefsAndAddCellActions = this._hideAgGridMenuAction() ? [...this.columnDefs] : [...this.columnDefs, newColumns];
|
|
242
|
+
}
|
|
243
|
+
_hideAgGridMenuAction() {
|
|
244
|
+
if (this.configButtonsAction == null)
|
|
245
|
+
return true;
|
|
246
|
+
return (this.configButtonsAction?.agGrid?.actions.every(({ hide }) => {
|
|
247
|
+
return this._hideFunc(hide);
|
|
248
|
+
}) ?? true);
|
|
249
|
+
}
|
|
250
|
+
_hideFunc(hide) {
|
|
251
|
+
if (hide == null)
|
|
252
|
+
return false;
|
|
253
|
+
if (typeof hide == "function")
|
|
254
|
+
return hide();
|
|
255
|
+
return hide;
|
|
256
|
+
}
|
|
257
|
+
onButtonActionAgGridEmit(rowIndex, typeButton) {
|
|
258
|
+
const IRowNode = this.gridApi?.getDisplayedRowAtIndex(rowIndex);
|
|
259
|
+
if (IRowNode) {
|
|
260
|
+
if (typeButton === EnumButtonType.TYPE_EDIT) {
|
|
261
|
+
this.onEditRow.emit(IRowNode);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (typeButton === EnumButtonType.TYPE_DELETE) {
|
|
265
|
+
this.onDeleteRow.emit([this.gridApi, [IRowNode.data]]);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this.onButtonActionAgGrid.emit([typeButton, IRowNode]);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
initRowData() {
|
|
272
|
+
if (!this.configButtonsAction?.agGrid)
|
|
273
|
+
this.sizeFitColumnAction();
|
|
274
|
+
if (this._subscriptionRowData$) {
|
|
275
|
+
this._subscriptionRowData$.unsubscribe();
|
|
276
|
+
this.gridApi.setGridOption("rowData", []);
|
|
277
|
+
this.gridApi?.showLoadingOverlay();
|
|
278
|
+
}
|
|
279
|
+
this._subscriptionRowData$ = this.rowData.subscribe((data) => {
|
|
280
|
+
this.gridApi.setGridOption("rowData", data);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
changeFilter(value) {
|
|
284
|
+
this.gridApi?.setQuickFilter(value);
|
|
285
|
+
this.onChangeFilter.emit(value);
|
|
286
|
+
}
|
|
287
|
+
onAddRowEmit() {
|
|
288
|
+
this.onAddRow.emit(this.gridApi);
|
|
289
|
+
}
|
|
290
|
+
hideHeaderMenuAction() {
|
|
291
|
+
return (this.configButtonsAction?.header?.submenu?.every(({ hide }) => {
|
|
292
|
+
return this._hideFunc(hide);
|
|
293
|
+
}) ?? false);
|
|
294
|
+
}
|
|
295
|
+
paginationChanged() {
|
|
296
|
+
if (this._scAgGridPagination)
|
|
297
|
+
this._scAgGridPagination.onPaginationChanged();
|
|
298
|
+
}
|
|
299
|
+
gridReady(event) {
|
|
300
|
+
this.gridApi = event.api;
|
|
301
|
+
this.initRowData();
|
|
302
|
+
this.onGridReady.emit([this.gridApi]);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* @param event: opcional - Contiene el nodo y la data de la fila actual.
|
|
306
|
+
* @description Se dispara cada vez que la fila es colocada en su nueva posición (Drag & Drop).
|
|
307
|
+
*/
|
|
308
|
+
rowDragEndEmit(event) {
|
|
309
|
+
this.onRowDragEnd.emit(event);
|
|
310
|
+
}
|
|
311
|
+
cellContextMenu(event) {
|
|
312
|
+
this.cellContextMenuActual = event;
|
|
313
|
+
this.onCellContextMenu.emit(event);
|
|
314
|
+
this.leftMenu = event.event.x.toString();
|
|
315
|
+
this.bottomMenu = (event.event.y - 20).toString();
|
|
316
|
+
if (event.value !== undefined && this.showMenuDefault)
|
|
317
|
+
this.menuTrigger?.openMenu();
|
|
318
|
+
}
|
|
319
|
+
rowDataChanged(event) {
|
|
320
|
+
if (!this.gridApi)
|
|
321
|
+
return;
|
|
322
|
+
if (!this.gridApi?.getDisplayedRowCount())
|
|
323
|
+
return;
|
|
324
|
+
this.onGridChange.emit([this.gridApi, event]);
|
|
325
|
+
}
|
|
326
|
+
selectionChanged() {
|
|
327
|
+
this.selectedRows = this.gridApi?.getSelectedRows();
|
|
328
|
+
this.onGridSelectChange.emit(this.gridApi?.getSelectedRows());
|
|
329
|
+
}
|
|
330
|
+
cellStopEditing(evt) {
|
|
331
|
+
this.onCellStopEditing.emit(evt);
|
|
332
|
+
}
|
|
333
|
+
async cellKeyDown(evt) {
|
|
334
|
+
this.onCellKeyDown.emit(evt);
|
|
335
|
+
if (evt.event.ctrlKey && evt.event.key === "ArrowDown" && evt.node.lastChild) {
|
|
336
|
+
this.onGridAddRow.emit(evt);
|
|
337
|
+
}
|
|
338
|
+
else if (evt.event.ctrlKey && evt.event.key.toLocaleLowerCase() === "c" && this.useGridCopy) {
|
|
339
|
+
this.copy(evt);
|
|
340
|
+
}
|
|
341
|
+
else if (evt.event.ctrlKey && evt.event.key.toLocaleLowerCase() === "v" && this.useGridCopy) {
|
|
342
|
+
await this.paste(evt);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
copy(evt) {
|
|
346
|
+
if (!evt.node.isSelected()) {
|
|
347
|
+
this.copiedCell = evt;
|
|
348
|
+
if (evt.value instanceof Object)
|
|
349
|
+
navigator.clipboard.writeText(evt.value?.label ?? "");
|
|
350
|
+
else
|
|
351
|
+
navigator.clipboard.writeText(evt.value ?? "");
|
|
352
|
+
this._messageUtilService.getAlertSuccess("Celda Copiada");
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
this.copiedRow = this.gridApi.getSelectedNodes();
|
|
356
|
+
this._messageUtilService.getAlertSuccess("Fila Copiada");
|
|
357
|
+
}
|
|
358
|
+
this.gridApi.deselectAll();
|
|
359
|
+
}
|
|
360
|
+
async paste(evt) {
|
|
361
|
+
if (!evt.node.isSelected() && this.copiedCell) {
|
|
362
|
+
if (evt.column.getColId() === this.copiedCell.column.getColId() && evt.data.get(evt.column.getColId()).enabled) {
|
|
363
|
+
let isValid = true;
|
|
364
|
+
if (this.validatePasteCell)
|
|
365
|
+
isValid = await this.validatePasteCell(this.copiedCell, evt);
|
|
366
|
+
else
|
|
367
|
+
this.gridApi.deselectAll();
|
|
368
|
+
this.beforePasteCell.emit([evt, this.copiedCell]);
|
|
369
|
+
if (isValid) {
|
|
370
|
+
evt.data.get(evt.column.getColId()).setValue(this.copiedCell.value);
|
|
371
|
+
this.gridApi.refreshCells({
|
|
372
|
+
columns: [evt.column],
|
|
373
|
+
});
|
|
374
|
+
this.afterPasteCell.emit([evt, this.copiedCell]);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else if (evt.node.isSelected() && this.copiedRow) {
|
|
379
|
+
const IRowNode = this.gridApi.getSelectedNodes();
|
|
380
|
+
let isValid = true;
|
|
381
|
+
if (this.validatePasteRows)
|
|
382
|
+
isValid = await this.validatePasteRows(this.copiedRow, IRowNode);
|
|
383
|
+
else
|
|
384
|
+
this.gridApi.deselectAll();
|
|
385
|
+
this.beforePasteRows.emit([this.gridApi.getSelectedNodes(), this.copiedRow]);
|
|
386
|
+
if (isValid) {
|
|
387
|
+
let indexRowCopy = 0;
|
|
388
|
+
IRowNode.forEach((r) => {
|
|
389
|
+
r.data.patchValue(this.copiedRow[indexRowCopy].data.getRawValue());
|
|
390
|
+
this.gridApi.refreshCells({
|
|
391
|
+
rowNodes: [r],
|
|
392
|
+
});
|
|
393
|
+
indexRowCopy++;
|
|
394
|
+
if (indexRowCopy == this.copiedRow.length) {
|
|
395
|
+
indexRowCopy = 0;
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
this.afterPasteRows.emit([this.gridApi.getSelectedNodes(), this.copiedRow]);
|
|
399
|
+
this.gridApi.deselectAll();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
copyMenu(event) {
|
|
404
|
+
this.onCopyMenu.emit(event);
|
|
405
|
+
this.copy(event);
|
|
406
|
+
}
|
|
407
|
+
pasteMenu(event) {
|
|
408
|
+
this.onPasteMenu.emit(event);
|
|
409
|
+
this.paste(event);
|
|
410
|
+
}
|
|
411
|
+
get disabledPasteMenu() {
|
|
412
|
+
if (this.gridApi?.getSelectedRows().length == 0 && !this.copiedCell) {
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
else if (this.gridApi?.getSelectedRows().length > 0 && !this.copiedRow) {
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
else if (!this.copiedCell && !this.copiedRow) {
|
|
419
|
+
return true;
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ScAgGridCustomizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
426
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ScAgGridCustomizableComponent, selector: "sc-ag-grid-customizable", inputs: { isRowSelectable: "isRowSelectable", getRowStyle: "getRowStyle", fillSearch: "fillSearch", paginationPageSize: "paginationPageSize", searchWidth: "searchWidth", pageSizeOptions: "pageSizeOptions", pagination: "pagination", rowSelection: "rowSelection", columnDefs: "columnDefs", rowData: "rowData", configButtonsAction: "configButtonsAction", defaultCellRendererActions: "defaultCellRendererActions", visibleSearch: "visibleSearch", domLayout: "domLayout", height: "height", btnAdd: "btnAdd", rowDragManaged: "rowDragManaged", animateRows: "animateRows", useGridCopy: "useGridCopy", multiSortKey: "multiSortKey", showMenuDefault: "showMenuDefault", enableCellTextSelection: "enableCellTextSelection", suppressRowTransform: "suppressRowTransform", enableRangeSelection: "enableRangeSelection", noRowsOverlayComponent: "noRowsOverlayComponent", noRowsOverlayComponentParams: "noRowsOverlayComponentParams", validatePasteCell: "validatePasteCell", validatePasteRows: "validatePasteRows", frameworkComponents: "frameworkComponents", context: "context", overlayNoRowsTemplate: "overlayNoRowsTemplate" }, outputs: { onChangeFilter: "onChangeFilter", onAddRow: "onAddRow", onGridAddRow: "onGridAddRow", onEditRow: "onEditRow", onDeleteRow: "onDeleteRow", onCellKeyDown: "onCellKeyDown", onCellStopEditing: "onCellStopEditing", onButtonActionAgGrid: "onButtonActionAgGrid", onButtonActionHeader: "onButtonActionHeader", onGridReady: "onGridReady", onGridSelectChange: "onGridSelectChange", onGridChange: "onGridChange", onRowDragEnd: "onRowDragEnd", onRowEditingStarted: "onRowEditingStarted", rowClicked: "rowClicked", rowDoubleClicked: "rowDoubleClicked", onRowSelected: "onRowSelected", cellValueChanged: "cellValueChanged", onCellContextMenu: "onCellContextMenu", onPasteMenu: "onPasteMenu", onCopyMenu: "onCopyMenu", afterPasteCell: "afterPasteCell", beforePasteCell: "beforePasteCell", afterPasteRows: "afterPasteRows", beforePasteRows: "beforePasteRows" }, host: { properties: { "id": "idScAgGridCustomizableComponent" }, classAttribute: "sc-ag-grid-customizable" }, queries: [{ propertyName: "viewChildrenButtonHeaders", predicate: ScAgGridButtonHeader, descendants: true }], viewQueries: [{ propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }, { propertyName: "_scAgGridPagination", first: true, predicate: ["scAgGridPagination"], descendants: true }, { propertyName: "buttonAdd", first: true, predicate: ["buttonAdd"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"w-100\">\r\n <!--===========================================-->\r\n <!-- AG-GRID HEADER -->\r\n <!--===========================================-->\r\n <div\r\n class=\"row justify-content-between align-items-center my-2\"\r\n *ngIf=\"visibleSearch || btnAdd?.visible || viewChildrenButtonHeaders?.length\">\r\n <div [class]=\"fillSearch ? 'col-12 my-2' : searchClass\" *ngIf=\"visibleSearch\">\r\n <input-search (onChange)=\"changeFilter($event)\"></input-search>\r\n </div>\r\n\r\n <div\r\n [class]=\"visibleSearch ? 'col-sm-12 col-md-6 col-lg-6 col-xl-7 col-12' : 'col-12'\"\r\n class=\"sc-ag-grid-header-actions d-flex justify-content-end\"\r\n *ngIf=\"btnAdd?.visible || viewChildrenButtonHeaders?.length || configButtonsAction?.header || configHeader != null\">\r\n <!-- Header actions buttons -->\r\n <ng-container *ngIf=\"configButtonsAction && configHeader\">\r\n <ng-container *ngIf=\"configHeader.disabled === false; else templateAction\">\r\n <ng-container [ngTemplateOutlet]=\"tempActions\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #templateAction>\r\n <ng-container *ngIf=\"selectedRows.length === 0; else tempActions\">\r\n <button class=\"btn-icon btn-width btn btn-primary btn-sm\" disabled>\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #tempActions>\r\n <button *ngIf=\"hideHeaderMenuAction(); else templateHeaderAction\" class=\"btn-icon btn-width btn btn-primary btn-sm\">\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n\r\n <ng-template #templateHeaderAction>\r\n <button type=\"button\" class=\"btn-icon btn-width btn btn-primary btn-sm\" [matMenuTriggerFor]=\"panel.menu\">\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n\r\n <sc-menu-panel #panel class=\"d-none\" [subMenus]=\"configHeader.submenu ?? []\"></sc-menu-panel>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n <!-- End header actions buttons -->\r\n\r\n <!-- Other buttons -->\r\n <ng-container *ngIf=\"viewChildrenButtonHeaders?.length\">\r\n <ng-container\r\n *ngFor=\"let viewChildrenButtonHeader of viewChildrenButtonHeaders\"\r\n [ngTemplateOutlet]=\"viewChildrenButtonHeader.template\">\r\n </ng-container>\r\n </ng-container>\r\n <!--End other buttons -->\r\n\r\n <!-- Add button -->\r\n <ng-container *ngIf=\"btnAdd?.visible\">\r\n <button\r\n type=\"button\"\r\n class=\"btn-width btn btn-warning btn-sm\"\r\n (click)=\"onAddRowEmit()\"\r\n #buttonAdd\r\n [disabled]=\"btnAdd.disabled ?? false\">\r\n Agregar\r\n </button>\r\n </ng-container>\r\n <!--End add button -->\r\n </div>\r\n </div>\r\n <!--===========================================-->\r\n <!-- AG-GRID HEADER END -->\r\n <!--===========================================-->\r\n\r\n <div class=\"row\">\r\n <div class=\"col-12\" [ngStyle]=\"ngStyleContainer\">\r\n <ag-grid-angular\r\n #agGrid\r\n class=\"ag-theme-balham\"\r\n [ngStyle]=\"ngStyleAgGrid\"\r\n [columnDefs]=\"columnDefsAndAddCellActions\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [components]=\"_frameworkComponents\"\r\n [context]=\"_context\"\r\n [rowSelection]=\"rowSelection\"\r\n [isRowSelectable]=\"isRowSelectable\"\r\n [rowDragManaged]=\"rowDragManaged\"\r\n [domLayout]=\"domLayout\"\r\n [animateRows]=\"animateRows\"\r\n [getRowStyle]=\"getRowStyle\"\r\n [enableRangeSelection]=\"enableRangeSelection\"\r\n [suppressRowTransform]=\"suppressRowTransform\"\r\n [suppressMoveWhenRowDragging]=\"animateRows\"\r\n [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\r\n [overlayLoadingTemplate]=\"overlayLoadingTemplate\"\r\n [noRowsOverlayComponentParams]=\"noRowsOverlayComponentParams\"\r\n [suppressRowClickSelection]=\"suppressRowClickSelection\"\r\n [suppressDragLeaveHidesColumns]=\"suppressDragLeaveHidesColumns\"\r\n [suppressScrollOnNewData]=\"suppressScrollOnNewData\"\r\n [suppressPropertyNamesCheck]=\"true\"\r\n [paginationPageSize]=\"pagination ? paginationPageSize : undefined\"\r\n [pagination]=\"pagination\"\r\n [suppressPaginationPanel]=\"suppressPaginationPanel\"\r\n (rowClicked)=\"rowClicked.emit($event)\"\r\n (rowDoubleClicked)=\"rowDoubleClicked.emit($event)\"\r\n (rowSelected)=\"onRowSelected.emit($event)\"\r\n (paginationChanged)=\"paginationChanged()\"\r\n (gridReady)=\"gridReady($event)\"\r\n (rowDragEnd)=\"rowDragEndEmit($event)\"\r\n (cellContextMenu)=\"cellContextMenu($event)\"\r\n [enableCellTextSelection]=\"enableCellTextSelection\"\r\n (rowDataUpdated)=\"rowDataChanged($event)\"\r\n (rowEditingStarted)=\"onRowEditingStarted.emit($event)\"\r\n (cellValueChanged)=\"cellValueChanged.emit($event)\"\r\n (selectionChanged)=\"selectionChanged()\"\r\n (cellEditingStopped)=\"cellStopEditing($event)\"\r\n (cellKeyDown)=\"cellKeyDown($any($event))\"\r\n [multiSortKey]=\"multiSortKey\"\r\n oncontextmenu=\"return false;\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n\r\n <!--===========================================-->\r\n <!-- AG-GRID PAGINATION -->\r\n <!--===========================================-->\r\n <div class=\"row\" *ngIf=\"pagination\">\r\n <div class=\"col-12\">\r\n <sc-ag-grid-pagination\r\n #scAgGridPagination\r\n [gridApi]=\"gridApi\"\r\n [paginationPageSize]=\"paginationPageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"></sc-ag-grid-pagination>\r\n </div>\r\n </div>\r\n <!--===========================================-->\r\n <!-- AG-GRID PAGINATION END -->\r\n <!--===========================================-->\r\n</div>\r\n\r\n<div\r\n *ngIf=\"showMenuDefault\"\r\n oncontextmenu=\"return false;\"\r\n style=\"position: fixed; width: 0px; height: 0px\"\r\n [ngStyle]=\"{ top: bottomMenu + 'px', left: leftMenu + 'px' }\">\r\n <mat-menu oncontextmenu=\"return false;\" #scMenu=\"matMenu\">\r\n <button oncontextmenu=\"return false;\" (click)=\"copyMenu(cellContextMenuActual!)\" mat-menu-item>\r\n <mat-icon>content_copy</mat-icon> <span>Copiar</span>\r\n </button>\r\n <button [disabled]=\"disabledPasteMenu\" oncontextmenu=\"return false;\" (click)=\"pasteMenu(cellContextMenuActual!)\" mat-menu-item>\r\n <mat-icon>content_paste</mat-icon><span>Pegar</span>\r\n </button>\r\n </mat-menu>\r\n <button oncontextmenu=\"return false;\" style=\"visibility: hidden\" mat-button [matMenuTriggerFor]=\"scMenu\" #menuTrigger=\"matMenuTrigger\">\r\n Menu\r\n </button>\r\n</div>\r\n", styles: [".cell-wrap-text{white-space:normal!important}.ag-header__center .ag-header-cell-text{display:block;width:100%;text-align:center!important}.ag-header__right .ag-header-cell-text{display:block;width:100%;text-align:right!important}.sc-ag-grid-header-actions{display:flex;gap:.6rem}.sc-ag-grid-header-actions .btn-width{width:6.5rem}.sc-ag-grid-header-actions .btn-icon em{margin-left:10px}.material-icons{font-size:24px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "initialState", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.ScAgGridPaginationComponent, selector: "sc-ag-grid-pagination", inputs: ["paginationPageSize", "gridApi", "pageSizeOptions"] }, { kind: "component", type: i6.InputSearchComponent, selector: "input-search", outputs: ["onChange"] }, { kind: "component", type: i7.ScMenuPanelComponent, selector: "sc-menu-panel", inputs: ["subMenus", "params"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
427
|
+
}
|
|
428
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ScAgGridCustomizableComponent, decorators: [{
|
|
429
|
+
type: Component,
|
|
430
|
+
args: [{ selector: "sc-ag-grid-customizable", changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
431
|
+
"[id]": "idScAgGridCustomizableComponent",
|
|
432
|
+
class: "sc-ag-grid-customizable",
|
|
433
|
+
}, template: "<div class=\"w-100\">\r\n <!--===========================================-->\r\n <!-- AG-GRID HEADER -->\r\n <!--===========================================-->\r\n <div\r\n class=\"row justify-content-between align-items-center my-2\"\r\n *ngIf=\"visibleSearch || btnAdd?.visible || viewChildrenButtonHeaders?.length\">\r\n <div [class]=\"fillSearch ? 'col-12 my-2' : searchClass\" *ngIf=\"visibleSearch\">\r\n <input-search (onChange)=\"changeFilter($event)\"></input-search>\r\n </div>\r\n\r\n <div\r\n [class]=\"visibleSearch ? 'col-sm-12 col-md-6 col-lg-6 col-xl-7 col-12' : 'col-12'\"\r\n class=\"sc-ag-grid-header-actions d-flex justify-content-end\"\r\n *ngIf=\"btnAdd?.visible || viewChildrenButtonHeaders?.length || configButtonsAction?.header || configHeader != null\">\r\n <!-- Header actions buttons -->\r\n <ng-container *ngIf=\"configButtonsAction && configHeader\">\r\n <ng-container *ngIf=\"configHeader.disabled === false; else templateAction\">\r\n <ng-container [ngTemplateOutlet]=\"tempActions\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #templateAction>\r\n <ng-container *ngIf=\"selectedRows.length === 0; else tempActions\">\r\n <button class=\"btn-icon btn-width btn btn-primary btn-sm\" disabled>\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #tempActions>\r\n <button *ngIf=\"hideHeaderMenuAction(); else templateHeaderAction\" class=\"btn-icon btn-width btn btn-primary btn-sm\">\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n\r\n <ng-template #templateHeaderAction>\r\n <button type=\"button\" class=\"btn-icon btn-width btn btn-primary btn-sm\" [matMenuTriggerFor]=\"panel.menu\">\r\n Acciones\r\n <em class=\"fa fa-chevron-down\"></em>\r\n </button>\r\n\r\n <sc-menu-panel #panel class=\"d-none\" [subMenus]=\"configHeader.submenu ?? []\"></sc-menu-panel>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n <!-- End header actions buttons -->\r\n\r\n <!-- Other buttons -->\r\n <ng-container *ngIf=\"viewChildrenButtonHeaders?.length\">\r\n <ng-container\r\n *ngFor=\"let viewChildrenButtonHeader of viewChildrenButtonHeaders\"\r\n [ngTemplateOutlet]=\"viewChildrenButtonHeader.template\">\r\n </ng-container>\r\n </ng-container>\r\n <!--End other buttons -->\r\n\r\n <!-- Add button -->\r\n <ng-container *ngIf=\"btnAdd?.visible\">\r\n <button\r\n type=\"button\"\r\n class=\"btn-width btn btn-warning btn-sm\"\r\n (click)=\"onAddRowEmit()\"\r\n #buttonAdd\r\n [disabled]=\"btnAdd.disabled ?? false\">\r\n Agregar\r\n </button>\r\n </ng-container>\r\n <!--End add button -->\r\n </div>\r\n </div>\r\n <!--===========================================-->\r\n <!-- AG-GRID HEADER END -->\r\n <!--===========================================-->\r\n\r\n <div class=\"row\">\r\n <div class=\"col-12\" [ngStyle]=\"ngStyleContainer\">\r\n <ag-grid-angular\r\n #agGrid\r\n class=\"ag-theme-balham\"\r\n [ngStyle]=\"ngStyleAgGrid\"\r\n [columnDefs]=\"columnDefsAndAddCellActions\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [components]=\"_frameworkComponents\"\r\n [context]=\"_context\"\r\n [rowSelection]=\"rowSelection\"\r\n [isRowSelectable]=\"isRowSelectable\"\r\n [rowDragManaged]=\"rowDragManaged\"\r\n [domLayout]=\"domLayout\"\r\n [animateRows]=\"animateRows\"\r\n [getRowStyle]=\"getRowStyle\"\r\n [enableRangeSelection]=\"enableRangeSelection\"\r\n [suppressRowTransform]=\"suppressRowTransform\"\r\n [suppressMoveWhenRowDragging]=\"animateRows\"\r\n [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\r\n [overlayLoadingTemplate]=\"overlayLoadingTemplate\"\r\n [noRowsOverlayComponentParams]=\"noRowsOverlayComponentParams\"\r\n [suppressRowClickSelection]=\"suppressRowClickSelection\"\r\n [suppressDragLeaveHidesColumns]=\"suppressDragLeaveHidesColumns\"\r\n [suppressScrollOnNewData]=\"suppressScrollOnNewData\"\r\n [suppressPropertyNamesCheck]=\"true\"\r\n [paginationPageSize]=\"pagination ? paginationPageSize : undefined\"\r\n [pagination]=\"pagination\"\r\n [suppressPaginationPanel]=\"suppressPaginationPanel\"\r\n (rowClicked)=\"rowClicked.emit($event)\"\r\n (rowDoubleClicked)=\"rowDoubleClicked.emit($event)\"\r\n (rowSelected)=\"onRowSelected.emit($event)\"\r\n (paginationChanged)=\"paginationChanged()\"\r\n (gridReady)=\"gridReady($event)\"\r\n (rowDragEnd)=\"rowDragEndEmit($event)\"\r\n (cellContextMenu)=\"cellContextMenu($event)\"\r\n [enableCellTextSelection]=\"enableCellTextSelection\"\r\n (rowDataUpdated)=\"rowDataChanged($event)\"\r\n (rowEditingStarted)=\"onRowEditingStarted.emit($event)\"\r\n (cellValueChanged)=\"cellValueChanged.emit($event)\"\r\n (selectionChanged)=\"selectionChanged()\"\r\n (cellEditingStopped)=\"cellStopEditing($event)\"\r\n (cellKeyDown)=\"cellKeyDown($any($event))\"\r\n [multiSortKey]=\"multiSortKey\"\r\n oncontextmenu=\"return false;\">\r\n </ag-grid-angular>\r\n </div>\r\n </div>\r\n\r\n <!--===========================================-->\r\n <!-- AG-GRID PAGINATION -->\r\n <!--===========================================-->\r\n <div class=\"row\" *ngIf=\"pagination\">\r\n <div class=\"col-12\">\r\n <sc-ag-grid-pagination\r\n #scAgGridPagination\r\n [gridApi]=\"gridApi\"\r\n [paginationPageSize]=\"paginationPageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"></sc-ag-grid-pagination>\r\n </div>\r\n </div>\r\n <!--===========================================-->\r\n <!-- AG-GRID PAGINATION END -->\r\n <!--===========================================-->\r\n</div>\r\n\r\n<div\r\n *ngIf=\"showMenuDefault\"\r\n oncontextmenu=\"return false;\"\r\n style=\"position: fixed; width: 0px; height: 0px\"\r\n [ngStyle]=\"{ top: bottomMenu + 'px', left: leftMenu + 'px' }\">\r\n <mat-menu oncontextmenu=\"return false;\" #scMenu=\"matMenu\">\r\n <button oncontextmenu=\"return false;\" (click)=\"copyMenu(cellContextMenuActual!)\" mat-menu-item>\r\n <mat-icon>content_copy</mat-icon> <span>Copiar</span>\r\n </button>\r\n <button [disabled]=\"disabledPasteMenu\" oncontextmenu=\"return false;\" (click)=\"pasteMenu(cellContextMenuActual!)\" mat-menu-item>\r\n <mat-icon>content_paste</mat-icon><span>Pegar</span>\r\n </button>\r\n </mat-menu>\r\n <button oncontextmenu=\"return false;\" style=\"visibility: hidden\" mat-button [matMenuTriggerFor]=\"scMenu\" #menuTrigger=\"matMenuTrigger\">\r\n Menu\r\n </button>\r\n</div>\r\n", styles: [".cell-wrap-text{white-space:normal!important}.ag-header__center .ag-header-cell-text{display:block;width:100%;text-align:center!important}.ag-header__right .ag-header-cell-text{display:block;width:100%;text-align:right!important}.sc-ag-grid-header-actions{display:flex;gap:.6rem}.sc-ag-grid-header-actions .btn-width{width:6.5rem}.sc-ag-grid-header-actions .btn-icon em{margin-left:10px}.material-icons{font-size:24px!important}\n"] }]
|
|
434
|
+
}], propDecorators: { viewChildrenButtonHeaders: [{
|
|
435
|
+
type: ContentChildren,
|
|
436
|
+
args: [ScAgGridButtonHeader, { descendants: true }]
|
|
437
|
+
}], menuTrigger: [{
|
|
438
|
+
type: ViewChild,
|
|
439
|
+
args: ["menuTrigger"]
|
|
440
|
+
}], _scAgGridPagination: [{
|
|
441
|
+
type: ViewChild,
|
|
442
|
+
args: ["scAgGridPagination"]
|
|
443
|
+
}], buttonAdd: [{
|
|
444
|
+
type: ViewChild,
|
|
445
|
+
args: ["buttonAdd"]
|
|
446
|
+
}], isRowSelectable: [{
|
|
447
|
+
type: Input
|
|
448
|
+
}], getRowStyle: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], fillSearch: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], paginationPageSize: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], searchWidth: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], pageSizeOptions: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], pagination: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], rowSelection: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}], columnDefs: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], rowData: [{
|
|
465
|
+
type: Input
|
|
466
|
+
}], configButtonsAction: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], defaultCellRendererActions: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], visibleSearch: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], domLayout: [{
|
|
473
|
+
type: Input
|
|
474
|
+
}], height: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], btnAdd: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], rowDragManaged: [{
|
|
479
|
+
type: Input
|
|
480
|
+
}], animateRows: [{
|
|
481
|
+
type: Input
|
|
482
|
+
}], useGridCopy: [{
|
|
483
|
+
type: Input
|
|
484
|
+
}], multiSortKey: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], showMenuDefault: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], enableCellTextSelection: [{
|
|
489
|
+
type: Input
|
|
490
|
+
}], suppressRowTransform: [{
|
|
491
|
+
type: Input
|
|
492
|
+
}], enableRangeSelection: [{
|
|
493
|
+
type: Input
|
|
494
|
+
}], noRowsOverlayComponent: [{
|
|
495
|
+
type: Input
|
|
496
|
+
}], noRowsOverlayComponentParams: [{
|
|
497
|
+
type: Input
|
|
498
|
+
}], validatePasteCell: [{
|
|
499
|
+
type: Input
|
|
500
|
+
}], validatePasteRows: [{
|
|
501
|
+
type: Input
|
|
502
|
+
}], frameworkComponents: [{
|
|
503
|
+
type: Input
|
|
504
|
+
}], context: [{
|
|
505
|
+
type: Input
|
|
506
|
+
}], onChangeFilter: [{
|
|
507
|
+
type: Output
|
|
508
|
+
}], onAddRow: [{
|
|
509
|
+
type: Output
|
|
510
|
+
}], onGridAddRow: [{
|
|
511
|
+
type: Output
|
|
512
|
+
}], onEditRow: [{
|
|
513
|
+
type: Output
|
|
514
|
+
}], onDeleteRow: [{
|
|
515
|
+
type: Output
|
|
516
|
+
}], onCellKeyDown: [{
|
|
517
|
+
type: Output
|
|
518
|
+
}], onCellStopEditing: [{
|
|
519
|
+
type: Output
|
|
520
|
+
}], onButtonActionAgGrid: [{
|
|
521
|
+
type: Output
|
|
522
|
+
}], onButtonActionHeader: [{
|
|
523
|
+
type: Output
|
|
524
|
+
}], onGridReady: [{
|
|
525
|
+
type: Output
|
|
526
|
+
}], onGridSelectChange: [{
|
|
527
|
+
type: Output
|
|
528
|
+
}], onGridChange: [{
|
|
529
|
+
type: Output
|
|
530
|
+
}], onRowDragEnd: [{
|
|
531
|
+
type: Output
|
|
532
|
+
}], onRowEditingStarted: [{
|
|
533
|
+
type: Output
|
|
534
|
+
}], rowClicked: [{
|
|
535
|
+
type: Output
|
|
536
|
+
}], rowDoubleClicked: [{
|
|
537
|
+
type: Output
|
|
538
|
+
}], onRowSelected: [{
|
|
539
|
+
type: Output
|
|
540
|
+
}], cellValueChanged: [{
|
|
541
|
+
type: Output
|
|
542
|
+
}], onCellContextMenu: [{
|
|
543
|
+
type: Output
|
|
544
|
+
}], onPasteMenu: [{
|
|
545
|
+
type: Output
|
|
546
|
+
}], onCopyMenu: [{
|
|
547
|
+
type: Output
|
|
548
|
+
}], afterPasteCell: [{
|
|
549
|
+
type: Output
|
|
550
|
+
}], beforePasteCell: [{
|
|
551
|
+
type: Output
|
|
552
|
+
}], afterPasteRows: [{
|
|
553
|
+
type: Output
|
|
554
|
+
}], beforePasteRows: [{
|
|
555
|
+
type: Output
|
|
556
|
+
}], overlayNoRowsTemplate: [{
|
|
557
|
+
type: Input
|
|
558
|
+
}] } });
|
|
559
|
+
export function isObjEmpty(object) {
|
|
560
|
+
if (object === null || object === undefined)
|
|
561
|
+
return true;
|
|
562
|
+
return Object.keys(object).length === 0;
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYWctZ3JpZC1jdXN0b21pemFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1bWF4LWVycC1jb21wb25lbnQvc3JjL2xpYi9zYy1hZy1ncmlkL3NjLWFnLWdyaWQtY3VzdG9taXphYmxlL3NjLWFnLWdyaWQtY3VzdG9taXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdW1heC1lcnAtY29tcG9uZW50L3NyYy9saWIvc2MtYWctZ3JpZC9zYy1hZy1ncmlkLWN1c3RvbWl6YWJsZS9zYy1hZy1ncmlkLWN1c3RvbWl6YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBR04sU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQW9CdkIsT0FBTyxFQUFjLFlBQVksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEQsT0FBTyxFQUtMLGNBQWMsR0FJZixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7O0FBR3hFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQVdmLE1BQU0sT0FBTyw2QkFBNkI7SUFWMUM7UUF3QkUsb0NBQStCLEdBQUcsMkJBQTJCLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFFL0Qsb0JBQWUsR0FBb0IsR0FBRyxF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LGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQWtCUCxxQkFBcUI7c0JBRHBCLEtBQUs7O0FBb1RSLE1BQU0sVUFBVSxVQUFVLENBQUksTUFBUztJQUNyQyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XHJcbmltcG9ydCB7XHJcbiAgQ2VsbENvbnRleHRNZW51RXZlbnQsXHJcbiAgQ2VsbEVkaXRpbmdTdG9wcGVkRXZlbnQsXHJcbiAgQ2VsbEtleURvd25FdmVudCxcclxuICBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsXHJcbiAgQ29sRGVmLFxyXG4gIEdyaWRBcGksXHJcbiAgR3JpZFJlYWR5RXZlbnQsXHJcbiAgSVJvd05vZGUsXHJcbiAgSXNSb3dTZWxlY3RhYmxlLFxyXG4gIFJvd0NsaWNrZWRFdmVudCxcclxuICBSb3dEYXRhVXBkYXRlZEV2ZW50LFxyXG4gIFJvd0RvdWJsZUNsaWNrZWRFdmVudCxcclxuICBSb3dEcmFnRXZlbnQsXHJcbiAgUm93RWRpdGluZ1N0YXJ0ZWRFdmVudCxcclxuICBSb3dTZWxlY3RlZEV2ZW50LFxyXG59IGZyb20gXCJhZy1ncmlkLWNvbW11bml0eVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgSU5nU2VsZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL0lOZ1NlbGVjdFwiO1xyXG5pbXBvcnQge1xyXG4gIEJ1dHRvbkhlYWRlcixcclxuICBDb25maWdCdXR0b25BY3Rpb24sXHJcbiAgQ29uZmlnQnV0dG9uQWdHcmlkLFxyXG4gIENvbmZpZ0J1dHRvbkhlYWRlcixcclxuICBFbnVtQnV0dG9uVHlwZSxcclxuICBHZXRSb3dTdHlsZSxcclxuICBIaWRlRnVjLFxyXG4gIFJvd1NlbGVjdGlvbixcclxufSBmcm9tIFwiLi4vLi4vdXRpbHMvSVNjQWdHcmlkXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VVdGlsU2VydmljZSB9IGZyb20gXCIuLi8uLi91dGlscy9tZXNzYWdlLXV0aWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTY0NlbGxSZW5kZXJCdXR0b25TZXJ2aWNlIH0gZnJvbSBcIi4uL2NlbGwtcmVuZGVyL3NjLWNlbGwtcmVuZGVyLWJ1dHRvbi9zYy1jZWxsLXJlbmRlci1idXR0b24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IHNjQ29tcG9uZW50cyB9IGZyb20gXCIuLi9jZWxsLXJlbmRlci9zYy1jZWxsLXJlbmRlci1jb25maWdcIjtcclxuaW1wb3J0IHsgU2NBZ0dyaWRCdXR0b25IZWFkZXIgfSBmcm9tIFwiLi4vZGlyZWN0aXZlcy9zY0FnR3JpZC5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgU2NBZ0dyaWRQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3NjLWFnLWdyaWQtcGFnaW5hdGlvbi9zYy1hZy1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50XCI7XHJcblxyXG5sZXQgbmV4dElkID0gMDtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwic2MtYWctZ3JpZC1jdXN0b21pemFibGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3NjLWFnLWdyaWQtY3VzdG9taXphYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9zYy1hZy1ncmlkLWN1c3RvbWl6YWJsZS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGhvc3Q6IHtcclxuICAgIFwiW2lkXVwiOiBcImlkU2NBZ0dyaWRDdXN0b21pemFibGVDb21wb25lbnRcIixcclxuICAgIGNsYXNzOiBcInNjLWFnLWdyaWQtY3VzdG9taXphYmxlXCIsXHJcbiAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjQWdHcmlkQ3VzdG9taXphYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQENvbnRlbnRDaGlsZHJlbihTY0FnR3JpZEJ1dHRvbkhlYWRlciwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxyXG4gIHZpZXdDaGlsZHJlbkJ1dHRvbkhlYWRlcnMhOiBRdWVyeUxpc3Q8U2NBZ0dyaWRCdXR0b25IZWFkZXI+O1xyXG5cclxuICBAVmlld0NoaWxkKFwibWVudVRyaWdnZXJcIikgbWVudVRyaWdnZXI/OiBNYXRNZW51VHJpZ2dlcjtcclxuXHJcbiAgQFZpZXdDaGlsZChcInNjQWdHcmlkUGFnaW5hdGlvblwiKVxyXG4gIHByaXZhdGUgX3NjQWdHcmlkUGFnaW5hdGlvbj86IFNjQWdHcmlkUGFnaW5hdGlvbkNvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZChcImJ1dHRvbkFkZFwiKSBidXR0b25BZGQ/OiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcclxuICBnZXQgYnV0dG9uQWRkRWxlbWVudCgpOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uQWRkPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBpZFNjQWdHcmlkQ3VzdG9taXphYmxlQ29tcG9uZW50ID0gYHNjLWFnLWdyaWQtY3VzdG9taXphYmxlLSR7KytuZXh0SWR9YDtcclxuXHJcbiAgQElucHV0KCkgaXNSb3dTZWxlY3RhYmxlOiBJc1Jvd1NlbGVjdGFibGUgPSAoKSA9PiB0cnVlO1xyXG5cclxuICBzZWFyY2hDbGFzcyA9IFwiY29sLTEyIGNvbC1zbS0xMiBjb2wtbWQtNiBjb2wtbGctNiBjb2wteGwtNSBteS0yXCI7XHJcbiAgQElucHV0KCkgZ2V0Um93U3R5bGU6IEdldFJvd1N0eWxlID0gKCkgPT4gdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGZpbGxTZWFyY2ggPSBmYWxzZTtcclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIENhbnRpZGFkIGRlIGl0ZW1zIHF1ZSBzZSBtb3N0cmFyw6EgcG9yIHDDoWdpbmFcclxuICAgKiBAZGVmYXVsdCAxNVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRpb25QYWdlU2l6ZSA9IDE1O1xyXG4gIEBJbnB1dCgpIHNlYXJjaFdpZHRoID0gXCJcIjtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gIE9wY2lvbmVzIGRlIHRhbWHDsW8gZGUgcMOhZ2luYVxyXG4gICAqIEBkZWZhdWx0IFs1LCAxMCwgMTUsIDIwLCAyNV1cclxuICAgKi9cclxuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDE1LCAyMCwgMjVdO1xyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBTaSBlbCB2YWxvciBlcyBgdHJ1ZWAgbXVlc3RyYSBsYSBwYWdpbmFjacOzblxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKi9cclxuICBASW5wdXQoKSBwYWdpbmF0aW9uID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVGlwbyBkZSBzZWxlY2lvbiBlbiBsYSBgZ3JpbGxhYHNcclxuICAgKiBAZGVmYXVsdCAnc2ltcGxlJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uID0gXCJzaW5nbGVcIjtcclxuICAvLyBASW5wdXQoKSBzdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uID0gdHJ1ZTtcclxuICBnZXQgc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbiA9PT0gXCJzaW5nbGVcIiA/IGZhbHNlIDogdHJ1ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IGRlIGNvbHVtbmFzIHF1ZSBzZSBtb3N0cmFyYSBlbiBsYSBgZ3JpbGxhYFxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNvbHVtbkRlZnM6IENvbERlZltdID0gW107XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IGRlIGRhdG9zIHF1ZSBzZSBtb3N0cmFyYSBlbiBsYSBgZ3JpbGxhYFxyXG4gICAqIEBkZWZhdWx0IG51bGxcclxuICAgKi9cclxuICBASW5wdXQoKSByb3dEYXRhOiBPYnNlcnZhYmxlPGFueVtdPiA9IG9mKFtdKTtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnQnV0dG9uc0FjdGlvbiE6IENvbmZpZ0J1dHRvbkFjdGlvbjtcclxuICBnZXQgY29uZmlnSGVhZGVyKCk6IENvbmZpZ0J1dHRvbkhlYWRlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnQnV0dG9uc0FjdGlvbj8uaGVhZGVyID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBkZWZhdWx0Q2VsbFJlbmRlcmVyQWN0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICBfY29uZmlnQnV0dG9uc0RlZmF1bHRBZ0dyaWQ6IENvbmZpZ0J1dHRvbkFnR3JpZFtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBTaSBlbCB2YWxvciBlcyBgdHJ1ZWAgbXVlc3RyYSBlbCBgYnVzY2Fkb3JgXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHZpc2libGVTZWFyY2ggPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBkb21MYXlvdXQ6IFwibm9ybWFsXCIgfCBcImF1dG9IZWlnaHRcIiA9IFwibm9ybWFsXCI7XHJcbiAgQElucHV0KCkgaGVpZ2h0ID0gXCIyMGVtXCI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBDcG5maWd1cmFjacOzbiBwYXJhIGVsIGJvdG9uIGBBZ3JlZ2FyYFxyXG4gICAqIEBkZWZhdWx0IHsgdmlzaWJsZTogdHJ1ZSwgZGlzYWJsZWQ6IGZhbHNlIH1cclxuICAgKi9cclxuICBASW5wdXQoKSBidG5BZGQ6IEJ1dHRvbkhlYWRlciA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJhIGFjdGl2YXIgbyBkZXNjYXRpdmFyIGVsIGRyYWcgJiBkcm9wXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKi9cclxuICBASW5wdXQoKSByb3dEcmFnTWFuYWdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUGFyYSBhY3RpdmFyIG8gZGVzY2F0aXZhciBsYXMgYW5pbWFjaW9uZXNcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFuaW1hdGVSb3dzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHVzZUdyaWRDb3B5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbXVsdGlTb3J0S2V5ITogYW55O1xyXG4gIEBJbnB1dCgpIHNob3dNZW51RGVmYXVsdCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzdXBwcmVzc1Jvd1RyYW5zZm9ybSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVuYWJsZVJhbmdlU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbm9Sb3dzT3ZlcmxheUNvbXBvbmVudCA9IFwiXCI7XHJcbiAgQElucHV0KCkgbm9Sb3dzT3ZlcmxheUNvbXBvbmVudFBhcmFtcyA9IHt9O1xyXG4gIEBJbnB1dCgpIHZhbGlkYXRlUGFzdGVDZWxsPzogKGV2dFNvdXJjZTogQ2VsbEtleURvd25FdmVudCwgZXZ0VGFyZ2V0OiBDZWxsS2V5RG93bkV2ZW50KSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gKFxyXG4gICAgZXZ0U291cmNlOiBDZWxsS2V5RG93bkV2ZW50LFxyXG4gICAgZXZ0VGFyZ2V0OiBDZWxsS2V5RG93bkV2ZW50XHJcbiAgKSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgQElucHV0KCkgdmFsaWRhdGVQYXN0ZVJvd3M/OiAoZXZ0U291cmNlOiBJUm93Tm9kZVtdLCBldnRUYXJnZXQ6IElSb3dOb2RlW10pID0+IFByb21pc2U8Ym9vbGVhbj4gPSAoXHJcbiAgICBldnRTb3VyY2U6IElSb3dOb2RlW10sXHJcbiAgICBldnRUYXJnZXQ6IElSb3dOb2RlW11cclxuICApID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFBhcmEgYWdyZWdhciBjb21wb25lbnRlcyBpbnRlcm5vcyBkZW50cm8gZGUgbGEgZ3JpbGxhXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZnJhbWV3b3JrQ29tcG9uZW50cyh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRzID0geyAuLi50aGlzLl9mcmFtZXdvcmtDb21wb25lbnRzLCAuLi52YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFBhcmEgcG9kZXIgYWdyZWdhciBtw6FzIG9iamV0b3MgYWwgY29udGV4dG9cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb250ZXh0KHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX2NvbnRleHQgPSB7IC4uLnRoaXMuX2NvbnRleHQsIC4uLnZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0XHJcbiAgQE91dHB1dCgpIG9uQ2hhbmdlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQWRkUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQXBpPigpO1xyXG4gIEBPdXRwdXQoKSBvbkdyaWRBZGRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxLZXlEb3duRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIG9uRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd05vZGU+KCk7XHJcbiAgQE91dHB1dCgpIG9uRGVsZXRlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxbR3JpZEFwaSwgYW55W11dPigpO1xyXG4gIEBPdXRwdXQoKSBvbkNlbGxLZXlEb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25DZWxsU3RvcEVkaXRpbmc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbkJ1dHRvbkFjdGlvbkFnR3JpZCA9IG5ldyBFdmVudEVtaXR0ZXI8W0VudW1CdXR0b25UeXBlIHwgc3RyaW5nLCBJUm93Tm9kZV0+KCk7XHJcbiAgQE91dHB1dCgpIG9uQnV0dG9uQWN0aW9uSGVhZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxbRW51bUJ1dHRvblR5cGUgfCBzdHJpbmcsIGFueVtdXT4oKTtcclxuXHJcbiAgLy8gQWdHcmlkIEV2ZW50cyAtIE91cHV0XHJcbiAgQE91dHB1dCgpIG9uR3JpZFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxbR3JpZEFwaV0+KCk7XHJcbiAgQE91dHB1dCgpIG9uR3JpZFNlbGVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcbiAgQE91dHB1dCgpIG9uR3JpZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8W0dyaWRBcGksIFJvd0RhdGFVcGRhdGVkRXZlbnRdPigpO1xyXG4gIEBPdXRwdXQoKSBvblJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0RyYWdFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgb25Sb3dFZGl0aW5nU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93RWRpdGluZ1N0YXJ0ZWRFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgcm93Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93Q2xpY2tlZEV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSByb3dEb3VibGVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dEb3VibGVDbGlja2VkRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1NlbGVjdGVkRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGNlbGxWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxWYWx1ZUNoYW5nZWRFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgb25DZWxsQ29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDb250ZXh0TWVudUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBvblBhc3RlTWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENvbnRleHRNZW51RXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ29weU1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDb250ZXh0TWVudUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlclBhc3RlQ2VsbCA9IG5ldyBFdmVudEVtaXR0ZXI8W0NlbGxLZXlEb3duRXZlbnQsIENlbGxLZXlEb3duRXZlbnRdPigpO1xyXG4gIEBPdXRwdXQoKSBiZWZvcmVQYXN0ZUNlbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFtDZWxsS2V5RG93bkV2ZW50LCBDZWxsS2V5RG93bkV2ZW50XT4oKTtcclxuICBAT3V0cHV0KCkgYWZ0ZXJQYXN0ZVJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPFtJUm93Tm9kZVtdLCBJUm93Tm9kZVtdXT4oKTtcclxuICBAT3V0cHV0KCkgYmVmb3JlUGFzdGVSb3dzID0gbmV3IEV2ZW50RW1pdHRlcjxbSVJvd05vZGVbXSwgSVJvd05vZGVbXV0+KCk7XHJcblxyXG4gIGNvbHVtbkRlZnNBbmRBZGRDZWxsQWN0aW9uczogQ29sRGVmW10gPSBbXTtcclxuICBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICB9O1xyXG4gIF9mcmFtZXdvcmtDb21wb25lbnRzID0geyAuLi5zY0NvbXBvbmVudHMgfTtcclxuICBfY29udGV4dCA9IHsgY29tcG9uZW50UGFyZW50OiB0aGlzIGFzIGFueSB9O1xyXG5cclxuICBib3R0b21NZW51OiBzdHJpbmcgPSBcIjBcIjtcclxuICBsZWZ0TWVudTogc3RyaW5nID0gXCIwXCI7XHJcbiAgaGlkZGVuTWVudTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvcGllZENlbGw/OiBDZWxsS2V5RG93bkV2ZW50O1xyXG4gIGNvcGllZFJvdz86IElSb3dOb2RlW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgb3ZlcmxheU5vUm93c1RlbXBsYXRlID0gYDxzcGFuIGNsYXNzPVwiYWctb3ZlcmxheS1sb2FkaW5nLWNlbnRlciBib3JkZXItMCBiZy10cmFuc3BhcmVudCBzaGFkb3ctbm9uZVwiPlxyXG5cdFx0XHRObyBzZSBlbmNvbnRyYXJvbiByZWdpc3Ryb3MuLi5cclxuXHRcdDwvc3Bhbj5gO1xyXG5cclxuICBvdmVybGF5TG9hZGluZ1RlbXBsYXRlID0gYDxzcGFuIGNsYXNzPVwiYWctb3ZlcmxheS1sb2FkaW5nLXRvcCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGJvcmRlci0wIGJnLXdoaXRlIHNoYWRvdyBwLTQgdGV4dC1pbmZvXCIgc3R5bGU9XCJoZWlnaHQ6IDIwcHg7XCI+XHJcblx0XHRcdDxpbWcgc3JjPVwiYXNzZXRzL21lZGlhLWRlbW8vbG9hZGluZy5naWZcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjVcIiBjbGFzcz1cIm1yLTJcIj5cclxuXHRcdFx0PHN0cm9uZz5DYXJnYW5kbyByZWdpc3Ryb3M8L3N0cm9uZz5cclxuXHRcdDwvc3Bhbj5cclxuXHRcdGA7XHJcbiAgc3VwcHJlc3NEcmFnTGVhdmVIaWRlc0NvbHVtbnMgPSB0cnVlO1xyXG4gIHN1cHByZXNzU2Nyb2xsT25OZXdEYXRhID0gZmFsc2U7XHJcbiAgc3VwcHJlc3NQYWdpbmF0aW9uUGFuZWwgPSB0cnVlO1xyXG5cclxuICAvLyBBZ0dyaWQgU3R5bGVcclxuICBnZXQgbmdTdHlsZUNvbnRhaW5lcigpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXQgbmdTdHlsZUFnR3JpZCgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcclxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBfc3Vic2NyaXB0aW9uJCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcm9ncmVzc1Zpc2libGVkID0gZmFsc2U7XHJcblxyXG4gIGdyaWRBcGkhOiBHcmlkQXBpO1xyXG4gIF9zdWJzY3JpcHRpb25Sb3dEYXRhJD86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgc2VsZWN0ZWRSb3dzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjZWxsQ29udGV4dE1lbnVBY3R1YWw/OiBDZWxsQ29udGV4dE1lbnVFdmVudDtcclxuXHJcbiAgcHJpdmF0ZSBfc2NDZWxsUmVuZGVyQnV0dG9uU2VydmljZSA9IGluamVjdChTY0NlbGxSZW5kZXJCdXR0b25TZXJ2aWNlKTtcclxuICBwcml2YXRlIF9tZXNzYWdlVXRpbFNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVV0aWxTZXJ2aWNlKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24kLmFkZChcclxuICAgICAgdGhpcy5fc2NDZWxsUmVuZGVyQnV0dG9uU2VydmljZS5oYW5kbGVyQnV0dG9uQWN0aW9uJC5zdWJzY3JpYmUoKHsgaW5kZXgsIGFjdGlvbiB9KSA9PiB7XHJcbiAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGFjdGlvbi50cmltKCkgPT09IFwiXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgdGhpcy5vbkJ1dHRvbkFjdGlvbkFnR3JpZEVtaXQoaW5kZXgsIGFjdGlvbik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uQnV0dG9uQWN0aW9uSGVhZGVyRW1pdChhY3Rpb24pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmluaXRBY3Rpb25CdXR0b24oKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ncmlkQXBpKSByZXR1cm47XHJcbiAgICBpZiAoY2hhbmdlc1tcImNvbmZpZ0J1dHRvbnNBY3Rpb25cIl0pIHRoaXMuaW5pdEFjdGlvbkJ1dHRvbigpO1xyXG4gICAgaWYgKGNoYW5nZXNbXCJyb3dEYXRhXCJdKSB0aGlzLmluaXRSb3dEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbiQ/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25Sb3dEYXRhJD8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBvbkJ1dHRvbkFjdGlvbkhlYWRlckVtaXQodHlwZUJ1dHRvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dzU2VsZWN0ZWQgPSB0aGlzLmdyaWRBcGk/LmdldFNlbGVjdGVkUm93cygpO1xyXG4gICAgdGhpcy5vbkJ1dHRvbkFjdGlvbkhlYWRlci5lbWl0KFt0eXBlQnV0dG9uLCByb3dzU2VsZWN0ZWRdKTtcclxuICB9XHJcblxyXG4gIGluaXRBY3Rpb25CdXR0b24oKTogdm9pZCB7XHJcbiAgICBpZiAoaXNPYmpFbXB0eSh0aGlzLmNvbmZpZ0J1dHRvbnNBY3Rpb24pKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgeyBhZ0dyaWQgfSA9IHRoaXMuY29uZmlnQnV0dG9uc0FjdGlvbiE7XHJcblxyXG4gICAgaWYgKGFnR3JpZCAmJiBhZ0dyaWQuYWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuX2NvbmZpZ0J1dHRvbnNEZWZhdWx0QWdHcmlkID0gWy4uLmFnR3JpZC5hY3Rpb25zXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNpemVGaXRDb2x1bW5BY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHNpemVGaXRDb2x1bW5BY3Rpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9jb25maWdCdXR0b25zRGVmYXVsdEFnR3JpZC5maWx0ZXIoKHsgaGlkZSB9KSA9PiB7XHJcbiAgICAgIHJldHVybiAhdGhpcy5faGlkZUZ1bmMoaGlkZSk7XHJcbiAgICB9KS5sZW5ndGg7XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPSBsZW5ndGggPT0gMiA/IDkwIDogODA7XHJcbiAgICBjb25zdCBtaW5XaWR0aCA9IGxlbmd0aCA+IDIgPyBsZW5ndGggKiAzMyArIDEwIDogd2lkdGg7XHJcblxyXG4gICAgY29uc3QgbmV3Q29sdW1uczogQ29sRGVmID0ge1xyXG4gICAgICBoZWFkZXJOYW1lOiBcIkFjY2lvbmVzXCIsXHJcbiAgICAgIGhlYWRlckNsYXNzOiBcImFnLWhlYWRlcl9fY2VudGVyXCIsXHJcbiAgICAgIGZpZWxkOiBcIlwiLFxyXG4gICAgICB3aWR0aDogbWluV2lkdGgsXHJcbiAgICAgIG1pbldpZHRoLFxyXG4gICAgICBtYXhXaWR0aDogbWluV2lkdGgsXHJcbiAgICAgIGNlbGxDbGFzczogW1wiZC1mbGV4XCIsIFwianVzdGlmeS1jb250ZW50LWNlbnRlclwiLCBcImFsaWduLWl0ZW1zLWNlbnRlclwiXSxcclxuICAgICAgY2VsbFN0eWxlOiB7IG92ZXJmbG93OiBcInZpc2libGVcIiB9LFxyXG4gICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgIGNlbGxSZW5kZXJlcjogdGhpcy5kZWZhdWx0Q2VsbFJlbmRlcmVyQWN0aW9ucyA/IHRoaXMuZGVmYXVsdENlbGxSZW5kZXJlckFjdGlvbnMgOiBcInNjQ2VsbFJlbmRlcmVyQnV0dG9uQ29tcG9uZW50XCIsXHJcbiAgICAgIHBpbm5lZDogXCJyaWdodFwiLFxyXG4gICAgICBzdXBwcmVzc01lbnU6IHRydWUsXHJcbiAgICAgIGxvY2tQb3NpdGlvbjogdHJ1ZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbHVtbkRlZnNBbmRBZGRDZWxsQWN0aW9ucyA9IHRoaXMuX2hpZGVBZ0dyaWRNZW51QWN0aW9uKCkgPyBbLi4udGhpcy5jb2x1bW5EZWZzXSA6IFsuLi50aGlzLmNvbHVtbkRlZnMsIG5ld0NvbHVtbnNdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGlkZUFnR3JpZE1lbnVBY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdCdXR0b25zQWN0aW9uID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb25maWdCdXR0b25zQWN0aW9uPy5hZ0dyaWQ/LmFjdGlvbnMuZXZlcnkoKHsgaGlkZSB9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVGdW5jKGhpZGUpO1xyXG4gICAgICB9KSA/PyB0cnVlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGlkZUZ1bmMoaGlkZTogSGlkZUZ1YyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgIGlmIChoaWRlID09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0eXBlb2YgaGlkZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBoaWRlKCk7XHJcblxyXG4gICAgcmV0dXJuIGhpZGU7XHJcbiAgfVxyXG5cclxuICBvbkJ1dHRvbkFjdGlvbkFnR3JpZEVtaXQocm93SW5kZXg6IG51bWJlciwgdHlwZUJ1dHRvbjogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBJUm93Tm9kZSA9IHRoaXMuZ3JpZEFwaT8uZ2V0RGlzcGxheWVkUm93QXRJbmRleChyb3dJbmRleCk7XHJcblxyXG4gICAgaWYgKElSb3dOb2RlKSB7XHJcbiAgICAgIGlmICh0eXBlQnV0dG9uID09PSBFbnVtQnV0dG9uVHlwZS5UWVBFX0VESVQpIHtcclxuICAgICAgICB0aGlzLm9uRWRpdFJvdy5lbWl0KElSb3dOb2RlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVCdXR0b24gPT09IEVudW1CdXR0b25UeXBlLlRZUEVfREVMRVRFKSB7XHJcbiAgICAgICAgdGhpcy5vbkRlbGV0ZVJvdy5lbWl0KFt0aGlzLmdyaWRBcGksIFtJUm93Tm9kZS5kYXRhXV0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vbkJ1dHRvbkFjdGlvbkFnR3JpZC5lbWl0KFt0eXBlQnV0dG9uLCBJUm93Tm9kZV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdFJvd0RhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnQnV0dG9uc0FjdGlvbj8uYWdHcmlkKSB0aGlzLnNpemVGaXRDb2x1bW5BY3Rpb24oKTtcclxuICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb25Sb3dEYXRhJCkge1xyXG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25Sb3dEYXRhJC51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2V0R3JpZE9wdGlvbihcInJvd0RhdGFcIiwgW10pO1xyXG4gICAgICB0aGlzLmdyaWRBcGk/LnNob3dMb2FkaW5nT3ZlcmxheSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uUm93RGF0YSQgPSB0aGlzLnJvd0RhdGEuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5zZXRHcmlkT3B0aW9uKFwicm93RGF0YVwiLCBkYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ3JpZEFwaT8uc2V0UXVpY2tGaWx0ZXIodmFsdWUpO1xyXG4gICAgdGhpcy5vbkNoYW5nZUZpbHRlci5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uQWRkUm93RW1pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMub25BZGRSb3cuZW1pdCh0aGlzLmdyaWRBcGkpO1xyXG4gIH1cclxuXHJcbiAgaGlkZUhlYWRlck1lbnVBY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmNvbmZpZ0J1dHRvbnNBY3Rpb24/LmhlYWRlcj8uc3VibWVudT8uZXZlcnkoKHsgaGlkZSB9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVGdW5jKGhpZGUpO1xyXG4gICAgICB9KSA/PyBmYWxzZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHBhZ2luYXRpb25DaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NjQWdHcmlkUGFnaW5hdGlvbikgdGhpcy5fc2NBZ0dyaWRQYWdpbmF0aW9uLm9uUGFnaW5hdGlvbkNoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIGdyaWRSZWFkeShldmVudDogR3JpZFJlYWR5RXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IGV2ZW50LmFwaTtcclxuXHJcbiAgICB0aGlzLmluaXRSb3dEYXRhKCk7XHJcbiAgICB0aGlzLm9uR3JpZFJlYWR5LmVtaXQoW3RoaXMuZ3JpZEFwaV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGV2ZW50OiBvcGNpb25hbCAtIENvbnRpZW5lIGVsIG5vZG8geSBsYSBkYXRhIGRlIGxhIGZpbGEgYWN0dWFsLlxyXG4gICAqIEBkZXNjcmlwdGlvbiBTZSBkaXNwYXJhIGNhZGEgdmV6IHF1ZSBsYSBmaWxhIGVzIGNvbG9jYWRhIGVuIHN1IG51ZXZhIHBvc2ljacOzbiAoRHJhZyAmIERyb3ApLlxyXG4gICAqL1xyXG4gIHJvd0RyYWdFbmRFbWl0KGV2ZW50OiBSb3dEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Sb3dEcmFnRW5kLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgY2VsbENvbnRleHRNZW51KGV2ZW50OiBDZWxsQ29udGV4dE1lbnVFdmVudCkge1xyXG4gICAgdGhpcy5jZWxsQ29udGV4dE1lbnVBY3R1YWwgPSBldmVudDtcclxuICAgIHRoaXMub25DZWxsQ29udGV4dE1lbnUuZW1pdChldmVudCk7XHJcbiAgICB0aGlzLmxlZnRNZW51ID0gKGV2ZW50LmV2ZW50ISBhcyBQb2ludGVyRXZlbnQpLngudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuYm90dG9tTWVudSA9ICgoZXZlbnQuZXZlbnQhIGFzIFBvaW50ZXJFdmVudCkueSAtIDIwKS50b1N0cmluZygpO1xyXG4gICAgaWYgKGV2ZW50LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zaG93TWVudURlZmF1bHQpIHRoaXMubWVudVRyaWdnZXI/Lm9wZW5NZW51KCk7XHJcbiAgfVxyXG5cclxuICByb3dEYXRhQ2hhbmdlZChldmVudDogUm93RGF0YVVwZGF0ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRBcGkpIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMuZ3JpZEFwaT8uZ2V0RGlzcGxheWVkUm93Q291bnQoKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMub25HcmlkQ2hhbmdlLmVtaXQoW3RoaXMuZ3JpZEFwaSwgZXZlbnRdKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZEFwaT8uZ2V0U2VsZWN0ZWRSb3dzKCk7XHJcbiAgICB0aGlzLm9uR3JpZFNlbGVjdENoYW5nZS5lbWl0KHRoaXMuZ3JpZEFwaT8uZ2V0U2VsZWN0ZWRSb3dzKCkpO1xyXG4gIH1cclxuXHJcbiAgY2VsbFN0b3BFZGl0aW5nKGV2dDogQ2VsbEVkaXRpbmdTdG9wcGVkRXZlbnQpIHtcclxuICAgIHRoaXMub25DZWxsU3RvcEVkaXRpbmcuZW1pdChldnQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2VsbEtleURvd24oZXZ0OiBDZWxsS2V5RG93bkV2ZW50KSB7XHJcbiAgICB0aGlzLm9uQ2VsbEtleURvd24uZW1pdChldnQpO1xyXG4gICAgaWYgKChldnQuZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCkuY3RybEtleSAmJiAoZXZ0LmV2ZW50IGFzIEtleWJvYXJkRXZlbnQpLmtleSA9PT0gXCJBcnJvd0Rvd25cIiAmJiBldnQubm9kZS5sYXN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5vbkdyaWRBZGRSb3cuZW1pdChldnQpO1xyXG4gICAgfSBlbHNlIGlmICgoZXZ0LmV2ZW50IGFzIEtleWJvYXJkRXZlbnQpLmN0cmxLZXkgJiYgKGV2dC5ldmVudCBhcyBLZXlib2FyZEV2ZW50KS5rZXkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJjXCIgJiYgdGhpcy51c2VHcmlkQ29weSkge1xyXG4gICAgICB0aGlzLmNvcHkoZXZ0KTtcclxuICAgIH0gZWxzZSBpZiAoKGV2dC5ldmVudCBhcyBLZXlib2FyZEV2ZW50KS5jdHJsS2V5ICYmIChldnQuZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCkua2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwidlwiICYmIHRoaXMudXNlR3JpZENvcHkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5wYXN0ZShldnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weShldnQ6IENlbGxLZXlEb3duRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghZXZ0Lm5vZGUuaXNTZWxlY3RlZCgpKSB7XHJcbiAgICAgIHRoaXMuY29waWVkQ2VsbCA9IGV2dDtcclxuICAgICAgaWYgKGV2dC52YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoKGV2dC52YWx1ZSBhcyBJTmdTZWxlY3QpPy5sYWJlbCA/PyBcIlwiKTtcclxuICAgICAgZWxzZSBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChldnQudmFsdWUgPz8gXCJcIik7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VVdGlsU2VydmljZS5nZXRBbGVydFN1Y2Nlc3MoXCJDZWxkYSBDb3BpYWRhXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb3BpZWRSb3cgPSB0aGlzLmdyaWRBcGkuZ2V0U2VsZWN0ZWROb2RlcygpO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlVXRpbFNlcnZpY2UuZ2V0QWxlcnRTdWNjZXNzKFwiRmlsYSBDb3BpYWRhXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkQXBpLmRlc2VsZWN0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwYXN0ZShldnQ6IENlbGxLZXlEb3duRXZlbnQpIHtcclxuICAgIGlmICghZXZ0Lm5vZGUuaXNTZWxlY3RlZCgpICYmIHRoaXMuY29waWVkQ2VsbCkge1xyXG4gICAgICBpZiAoZXZ0LmNvbHVtbi5nZXRDb2xJZCgpID09PSB0aGlzLmNvcGllZENlbGwuY29sdW1uLmdldENvbElkKCkgJiYgKGV2dC5kYXRhIGFzIEZvcm1Hcm91cCkuZ2V0KGV2dC5jb2x1bW4uZ2V0Q29sSWQoKSkhLmVuYWJsZWQpIHtcclxuICAgICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVQYXN0ZUNlbGwpIGlzVmFsaWQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGFzdGVDZWxsKHRoaXMuY29waWVkQ2VsbCwgZXZ0KTtcclxuICAgICAgICBlbHNlIHRoaXMuZ3JpZEFwaS5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICAgIHRoaXMuYmVmb3JlUGFzdGVDZWxsLmVtaXQoW2V2dCwgdGhpcy5jb3BpZWRDZWxsXSk7XHJcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcclxuICAgICAgICAgIChldnQuZGF0YSBhcyBGb3JtR3JvdXApLmdldChldnQuY29sdW1uLmdldENvbElkKCkpIS5zZXRWYWx1ZSh0aGlzLmNvcGllZENlbGwudmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hDZWxscyh7XHJcbiAgICAgICAgICAgIGNvbHVtbnM6IFtldnQuY29sdW1uXSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5hZnRlclBhc3RlQ2VsbC5lbWl0KFtldnQsIHRoaXMuY29waWVkQ2VsbF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldnQubm9kZS5pc1NlbGVjdGVkKCkgJiYgdGhpcy5jb3BpZWRSb3cpIHtcclxuICAgICAgY29uc3QgSVJvd05vZGUgPSB0aGlzLmdyaWRBcGkuZ2V0U2VsZWN0ZWROb2RlcygpO1xyXG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlUGFzdGVSb3dzKSBpc1ZhbGlkID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBhc3RlUm93cyh0aGlzLmNvcGllZFJvdywgSVJvd05vZGUpO1xyXG4gICAgICBlbHNlIHRoaXMuZ3JpZEFwaS5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICB0aGlzLmJlZm9yZVBhc3RlUm93cy5lbWl0KFt0aGlzLmdyaWRBcGkuZ2V0U2VsZWN0ZWROb2RlcygpLCB0aGlzLmNvcGllZFJvd10pO1xyXG4gICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgIGxldCBpbmRleFJvd0NvcHkgPSAwO1xyXG4gICAgICAgIElSb3dOb2RlLmZvckVhY2goKHIpID0+IHtcclxuICAgICAgICAgIChyLmRhdGEgYXMgRm9ybUdyb3VwKS5wYXRjaFZhbHVlKCh0aGlzLmNvcGllZFJvdyFbaW5kZXhSb3dDb3B5XS5kYXRhIGFzIEZvcm1Hcm91cCkuZ2V0UmF3VmFsdWUoKSk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkucmVmcmVzaENlbGxzKHtcclxuICAgICAgICAgICAgcm93Tm9kZXM6IFtyXSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaW5kZXhSb3dDb3B5Kys7XHJcbiAgICAgICAgICBpZiAoaW5kZXhSb3dDb3B5ID09IHRoaXMuY29waWVkUm93IS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaW5kZXhSb3dDb3B5ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFmdGVyUGFzdGVSb3dzLmVtaXQoW3RoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZE5vZGVzKCksIHRoaXMuY29waWVkUm93XSk7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvcHlNZW51KGV2ZW50OiBDZWxsQ29udGV4dE1lbnVFdmVudCkge1xyXG4gICAgdGhpcy5vbkNvcHlNZW51LmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy5jb3B5KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHBhc3RlTWVudShldmVudDogQ2VsbENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgIHRoaXMub25QYXN0ZU1lbnUuZW1pdChldmVudCk7XHJcbiAgICB0aGlzLnBhc3RlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBkaXNhYmxlZFBhc3RlTWVudSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGk/LmdldFNlbGVjdGVkUm93cygpLmxlbmd0aCA9PSAwICYmICF0aGlzLmNvcGllZENlbGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZEFwaT8uZ2V0U2VsZWN0ZWRSb3dzKCkubGVuZ3RoID4gMCAmJiAhdGhpcy5jb3BpZWRSb3cpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNvcGllZENlbGwgJiYgIXRoaXMuY29waWVkUm93KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqRW1wdHk8VD4ob2JqZWN0OiBUKTogYm9vbGVhbiB7XHJcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XHJcblxyXG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA9PT0gMDtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidy0xMDBcIj5cclxuICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPlxyXG4gIDwhLS0gQUctR1JJRCBIRUFERVIgLS0+XHJcbiAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXktMlwiXHJcbiAgICAqbmdJZj1cInZpc2libGVTZWFyY2ggfHwgYnRuQWRkPy52aXNpYmxlIHx8IHZpZXdDaGlsZHJlbkJ1dHRvbkhlYWRlcnM/Lmxlbmd0aFwiPlxyXG4gICAgPGRpdiBbY2xhc3NdPVwiZmlsbFNlYXJjaCA/ICdjb2wtMTIgbXktMicgOiBzZWFyY2hDbGFzc1wiICpuZ0lmPVwidmlzaWJsZVNlYXJjaFwiPlxyXG4gICAgICA8aW5wdXQtc2VhcmNoIChvbkNoYW5nZSk9XCJjaGFuZ2VGaWx0ZXIoJGV2ZW50KVwiPjwvaW5wdXQtc2VhcmNoPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICBbY2xhc3NdPVwidmlzaWJsZVNlYXJjaCA/ICdjb2wtc20tMTIgY29sLW1kLTYgY29sLWxnLTYgY29sLXhsLTcgY29sLTEyJyA6ICdjb2wtMTInXCJcclxuICAgICAgY2xhc3M9XCJzYy1hZy1ncmlkLWhlYWRlci1hY3Rpb25zIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCJcclxuICAgICAgKm5nSWY9XCJidG5BZGQ/LnZpc2libGUgfHwgdmlld0NoaWxkcmVuQnV0dG9uSGVhZGVycz8ubGVuZ3RoIHx8IGNvbmZpZ0J1dHRvbnNBY3Rpb24/LmhlYWRlciB8fCBjb25maWdIZWFkZXIgIT0gbnVsbFwiPlxyXG4gICAgICA8IS0tIEhlYWRlciBhY3Rpb25zIGJ1dHRvbnMgLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWdCdXR0b25zQWN0aW9uICYmIGNvbmZpZ0hlYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWdIZWFkZXIuZGlzYWJsZWQgPT09IGZhbHNlOyBlbHNlIHRlbXBsYXRlQWN0aW9uXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBBY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVBY3Rpb24+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMDsgZWxzZSB0ZW1wQWN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWljb24gYnRuLXdpZHRoIGJ0biBidG4tcHJpbWFyeSBidG4tc21cIiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICBBY2Npb25lc1xyXG4gICAgICAgICAgICAgIDxlbSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvZW0+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wQWN0aW9ucz5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJoaWRlSGVhZGVyTWVudUFjdGlvbigpOyBlbHNlIHRlbXBsYXRlSGVhZGVyQWN0aW9uXCIgY2xhc3M9XCJidG4taWNvbiBidG4td2lkdGggYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiPlxyXG4gICAgICAgICAgICBBY2Npb25lc1xyXG4gICAgICAgICAgICA8ZW0gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2VtPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUhlYWRlckFjdGlvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4taWNvbiBidG4td2lkdGggYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJwYW5lbC5tZW51XCI+XHJcbiAgICAgICAgICAgICAgQWNjaW9uZXNcclxuICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2VtPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxzYy1tZW51LXBhbmVsICNwYW5lbCBjbGFzcz1cImQtbm9uZVwiIFtzdWJNZW51c109XCJjb25maWdIZWFkZXIuc3VibWVudSA/PyBbXVwiPjwvc2MtbWVudS1wYW5lbD5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gRW5kIGhlYWRlciBhY3Rpb25zIGJ1dHRvbnMgLS0+XHJcblxyXG4gICAgICA8IS0tIE90aGVyIGJ1dHRvbnMgLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3Q2hpbGRyZW5CdXR0b25IZWFkZXJzPy5sZW5ndGhcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdmlld0NoaWxkcmVuQnV0dG9uSGVhZGVyIG9mIHZpZXdDaGlsZHJlbkJ1dHRvbkhlYWRlcnNcIlxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidmlld0NoaWxkcmVuQnV0dG9uSGVhZGVyLnRlbXBsYXRlXCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8IS0tRW5kIG90aGVyIGJ1dHRvbnMgLS0+XHJcblxyXG4gICAgICA8IS0tIEFkZCBidXR0b24gLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidG5BZGQ/LnZpc2libGVcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuLXdpZHRoIGJ0biBidG4td2FybmluZyBidG4tc21cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkUm93RW1pdCgpXCJcclxuICAgICAgICAgICNidXR0b25BZGRcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJidG5BZGQuZGlzYWJsZWQgPz8gZmFsc2VcIj5cclxuICAgICAgICAgIEFncmVnYXJcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1FbmQgYWRkIGJ1dHRvbiAtLT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbiAgPCEtLSBBRy1HUklEIEhFQURFUiBFTkQgLS0+XHJcbiAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtuZ1N0eWxlXT1cIm5nU3R5bGVDb250YWluZXJcIj5cclxuICAgICAgPGFnLWdyaWQtYW5ndWxhclxyXG4gICAgICAgICNhZ0dyaWRcclxuICAgICAgICBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwibmdTdHlsZUFnR3JpZFwiXHJcbiAgICAgICAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc0FuZEFkZENlbGxBY3Rpb25zXCJcclxuICAgICAgICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICAgICAgICBbY29tcG9uZW50c109XCJfZnJhbWV3b3JrQ29tcG9uZW50c1wiXHJcbiAgICAgICAgW2NvbnRleHRdPVwiX2NvbnRleHRcIlxyXG4gICAgICAgIFtyb3dTZWxlY3Rpb25dPVwicm93U2VsZWN0aW9uXCJcclxuICAgICAgICBbaXNSb3dTZWxlY3RhYmxlXT1cImlzUm93U2VsZWN0YWJsZVwiXHJcbiAgICAgICAgW3Jvd0RyYWdNYW5hZ2VkXT1cInJvd0RyYWdNYW5hZ2VkXCJcclxuICAgICAgICBbZG9tTGF5b3V0XT1cImRvbUxheW91dFwiXHJcbiAgICAgICAgW2FuaW1hdGVSb3dzXT1cImFuaW1hdGVSb3dzXCJcclxuICAgICAgICBbZ2V0Um93U3R5bGVdPVwiZ2V0Um93U3R5bGVcIlxyXG4gICAgICAgIFtlbmFibGVSYW5nZVNlbGVjdGlvbl09XCJlbmFibGVSYW5nZVNlbGVjdGlvblwiXHJcbiAgICAgICAgW3N1cHByZXNzUm93VHJhbnNmb3JtXT1cInN1cHByZXNzUm93VHJhbnNmb3JtXCJcclxuICAgICAgICBbc3VwcHJlc3NNb3ZlV2hlblJvd0RyYWdnaW5nXT1cImFuaW1hdGVSb3dzXCJcclxuICAgICAgICBbb3ZlcmxheU5vUm93c1RlbXBsYXRlXT1cIm92ZXJsYXlOb1Jvd3NUZW1wbGF0ZVwiXHJcbiAgICAgICAgW292ZXJsYXlMb2FkaW5nVGVtcGxhdGVdPVwib3ZlcmxheUxvYWRpbmdUZW1wbGF0ZVwiXHJcbiAgICAgICAgW25vUm93c092ZXJsYXlDb21wb25lbnRQYXJhbXNdPVwibm9Sb3dzT3ZlcmxheUNvbXBvbmVudFBhcmFtc1wiXHJcbiAgICAgICAgW3N1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb25dPVwic3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvblwiXHJcbiAgICAgICAgW3N1cHByZXNzRHJhZ0xlYXZlSGlkZXNDb2x1bW5zXT1cInN1cHByZXNzRHJhZ0xlYXZlSGlkZXNDb2x1bW5zXCJcclxuICAgICAgICBbc3VwcHJlc3NTY3JvbGxPbk5ld0RhdGFdPVwic3VwcHJlc3NTY3JvbGxPbk5ld0RhdGFcIlxyXG4gICAgICAgIFtzdXBwcmVzc1Byb3BlcnR5TmFtZXNDaGVja109XCJ0cnVlXCJcclxuICAgICAgICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb24gPyBwYWdpbmF0aW9uUGFnZVNpemUgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxyXG4gICAgICAgIFtzdXBwcmVzc1BhZ2luYXRpb25QYW5lbF09XCJzdXBwcmVzc1BhZ2luYXRpb25QYW5lbFwiXHJcbiAgICAgICAgKHJvd0NsaWNrZWQpPVwicm93Q2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChyb3dEb3VibGVDbGlja2VkKT1cInJvd0RvdWJsZUNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAocm93U2VsZWN0ZWQpPVwib25Sb3dTZWxlY3RlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChwYWdpbmF0aW9uQ2hhbmdlZCk9XCJwYWdpbmF0aW9uQ2hhbmdlZCgpXCJcclxuICAgICAgICAoZ3JpZFJlYWR5KT1cImdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgICAocm93RHJhZ0VuZCk9XCJyb3dEcmFnRW5kRW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAoY2VsbENvbnRleHRNZW51KT1cImNlbGxDb250ZXh0TWVudSgkZXZlbnQpXCJcclxuICAgICAgICBbZW5hYmxlQ2VsbFRleHRTZWxlY3Rpb25dPVwiZW5hYmxlQ2VsbFRleHRTZWxlY3Rpb25cIlxyXG4gICAgICAgIChyb3dEYXRhVXBkYXRlZCk9XCJyb3dEYXRhQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAocm93RWRpdGluZ1N0YXJ0ZWQpPVwib25Sb3dFZGl0aW5nU3RhcnRlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChjZWxsVmFsdWVDaGFuZ2VkKT1cImNlbGxWYWx1ZUNoYW5nZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlZCk9XCJzZWxlY3Rpb25DaGFuZ2VkKClcIlxyXG4gICAgICAgIChjZWxsRWRpdGluZ1N0b3BwZWQpPVwiY2VsbFN0b3BFZGl0aW5nKCRldmVudClcIlxyXG4gICAgICAgIChjZWxsS2V5RG93bik9XCJjZWxsS2V5RG93bigkYW55KCRldmVudCkpXCJcclxuICAgICAgICBbbXVsdGlTb3J0S2V5XT1cIm11bHRpU29ydEtleVwiXHJcbiAgICAgICAgb25jb250ZXh0bWVudT1cInJldHVybiBmYWxzZTtcIj5cclxuICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT5cclxuICA8IS0tIEFHLUdSSUQgUEFHSU5BVElPTiAtLT5cclxuICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cInBhZ2luYXRpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgPHNjLWFnLWdyaWQtcGFnaW5hdGlvblxyXG4gICAgICAgICNzY0FnR3JpZFBhZ2luYXRpb25cclxuICAgICAgICBbZ3JpZEFwaV09XCJncmlkQXBpXCJcclxuICAgICAgICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiXHJcbiAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIj48L3NjLWFnLWdyaWQtcGFnaW5hdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbiAgPCEtLSBBRy1HUklEIFBBR0lOQVRJT04gRU5EIC0tPlxyXG4gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbjwvZGl2PlxyXG5cclxuPGRpdlxyXG4gICpuZ0lmPVwic2hvd01lbnVEZWZhdWx0XCJcclxuICBvbmNvbnRleHRtZW51PVwicmV0dXJuIGZhbHNlO1wiXHJcbiAgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHdpZHRoOiAwcHg7IGhlaWdodDogMHB4XCJcclxuICBbbmdTdHlsZV09XCJ7IHRvcDogYm90dG9tTWVudSArICdweCcsIGxlZnQ6IGxlZnRNZW51ICsgJ3B4JyB9XCI+XHJcbiAgPG1hdC1tZW51IG9uY29udGV4dG1lbnU9XCJyZXR1cm4gZmFsc2U7XCIgI3NjTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxidXR0b24gb25jb250ZXh0bWVudT1cInJldHVybiBmYWxzZTtcIiAoY2xpY2spPVwiY29weU1lbnUoY2VsbENvbnRleHRNZW51QWN0dWFsISlcIiBtYXQtbWVudS1pdGVtPlxyXG4gICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj4gPHNwYW4+Q29waWFyPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZFBhc3RlTWVudVwiIG9uY29udGV4dG1lbnU9XCJyZXR1cm4gZmFsc2U7XCIgKGNsaWNrKT1cInBhc3RlTWVudShjZWxsQ29udGV4dE1lbnVBY3R1YWwhKVwiIG1hdC1tZW51LWl0ZW0+XHJcbiAgICAgIDxtYXQtaWNvbj5jb250ZW50X3Bhc3RlPC9tYXQtaWNvbj48c3Bhbj5QZWdhcjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgPGJ1dHRvbiBvbmNvbnRleHRtZW51PVwicmV0dXJuIGZhbHNlO1wiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuXCIgbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2NNZW51XCIgI21lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIj5cclxuICAgIE1lbnVcclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==
|